private WmsServerLayer ParseLayer(XmlNode xmlLayer)
{
WmsServerLayer layer = new WmsServerLayer();
XmlNode node = xmlLayer.SelectSingleNode("sm:Name", nsmgr);
layer.Name = (node != null ? node.InnerText : null);
node = xmlLayer.SelectSingleNode("sm:Title", nsmgr);
layer.Title = (node != null ? node.InnerText : null);
node = xmlLayer.SelectSingleNode("sm:Abstract", nsmgr);
layer.Abstract = (node != null ? node.InnerText : null);
XmlAttribute attr = xmlLayer.Attributes["queryable"];
layer.Queryable = (attr != null && attr.InnerText == "1");
XmlNodeList xnlKeywords = xmlLayer.SelectNodes("sm:KeywordList/sm:Keyword", nsmgr);
if (xnlKeywords != null)
{
layer.Keywords = new string[xnlKeywords.Count];
for (int i = 0; i < xnlKeywords.Count; i++)
layer.Keywords[i] = xnlKeywords[i].InnerText;
}
XmlNodeList xnlCrs = xmlLayer.SelectNodes("sm:CRS", nsmgr);
if (xnlCrs != null)
{
layer.CRS = new string[xnlCrs.Count];
for (int i = 0; i < xnlCrs.Count; i++)
layer.CRS[i] = xnlCrs[i].InnerText;
}
XmlNodeList xnlStyle = xmlLayer.SelectNodes("sm:Style", nsmgr);
if (xnlStyle != null)
{
layer.Style = new WmsLayerStyle[xnlStyle.Count];
for (int i = 0; i < xnlStyle.Count; i++)
{
node = xnlStyle[i].SelectSingleNode("sm:Name", nsmgr);
layer.Style[i].Name = (node != null ? node.InnerText : null);
node = xnlStyle[i].SelectSingleNode("sm:Title", nsmgr);
layer.Style[i].Title = (node != null ? node.InnerText : null);
node = xnlStyle[i].SelectSingleNode("sm:Abstract", nsmgr);
layer.Style[i].Abstract = (node != null ? node.InnerText : null);
node = xnlStyle[i].SelectSingleNode("sm:LegendUrl", nsmgr);
if (node != null)
{
layer.Style[i].LegendUrl = new WmsStyleLegend();
layer.Style[i].LegendUrl.Size = new System.Drawing.Size(
int.Parse(node.Attributes["width"].InnerText), int.Parse(node.Attributes["height"].InnerText));
layer.Style[i].LegendUrl.OnlineResource.OnlineResource = node.SelectSingleNode("sm:OnlineResource",nsmgr).Attributes["xlink:href"].InnerText;
layer.Style[i].LegendUrl.OnlineResource.Type = node.SelectSingleNode("sm:Format", nsmgr).InnerText;
}
node = xnlStyle[i].SelectSingleNode("sm:StyleSheetURL", nsmgr);
if (node != null)
{
layer.Style[i].StyleSheetUrl = new WmsOnlineResource();
layer.Style[i].StyleSheetUrl.OnlineResource = node.SelectSingleNode("sm:OnlineResource", nsmgr).Attributes["xlink:href"].InnerText;
//layer.Style[i].StyleSheetUrl.OnlineResource = node.SelectSingleNode("sm:Format", nsmgr).InnerText;
}
}
}
XmlNodeList xnlLayers = xmlLayer.SelectNodes("sm:Layer", nsmgr);
if (xnlLayers != null)
{
layer.ChildLayers = new WmsServerLayer[xnlLayers.Count];
for (int i = 0; i < xnlLayers.Count; i++)
layer.ChildLayers[i] = ParseLayer(xnlLayers[i]);
}
node = xmlLayer.SelectSingleNode("sm:LatLonBoundingBox", nsmgr);
if (node != null)
{
double minx = 0; double miny = 0; double maxx = 0; double maxy = 0;
if (!double.TryParse(node.Attributes["minx"].Value, System.Globalization.NumberStyles.Any, SharpMap.Map.numberFormat_EnUS, out minx) &
!double.TryParse(node.Attributes["miny"].Value, System.Globalization.NumberStyles.Any, SharpMap.Map.numberFormat_EnUS, out miny) &
!double.TryParse(node.Attributes["maxx"].Value, System.Globalization.NumberStyles.Any, SharpMap.Map.numberFormat_EnUS, out maxx) &
!double.TryParse(node.Attributes["maxy"].Value, System.Globalization.NumberStyles.Any, SharpMap.Map.numberFormat_EnUS, out maxy))
throw new ArgumentException("Invalid LatLonBoundingBox on layer '" + layer.Name + "'");
layer.LatLonBoundingBox = new SharpMap.Geometries.BoundingBox(minx, miny, maxx, maxy);
}
return layer;
}