/// <summary> /// Parses capability node /// </summary> /// <param name="xnCapability"></param> private void ParseCapability(XmlNode xnCapability) { XmlNode xnRequest = xnCapability.SelectSingleNode("sm:Request", _nsmgr); if (xnRequest == null) { throw (new Exception("Request parameter not specified in Service Description")); } ParseRequest(xnRequest); XmlNode xnLayer = xnCapability.SelectSingleNode("sm:Layer", _nsmgr); if (xnLayer == null) { throw (new Exception("No layer tag found in Service Description")); } _layer = ParseLayer(xnLayer); XmlNode xnException = xnCapability.SelectSingleNode("sm:Exception", _nsmgr); if (xnException != null) { ParseExceptions(xnException); } _vendorSpecificCapabilities = xnCapability.SelectSingleNode("sm:VendorSpecificCapabilities", _nsmgr); }
/// <summary> /// Parses capability node /// </summary> /// <param name="xnCapability"></param> private void ParseCapability(XmlNode xnCapability) { XmlNode xnRequest = xnCapability.SelectSingleNode("sm:Request", nsmgr); if (xnRequest == null) { throw (new Exception("Request parameter not specified in Service Description")); } ParseRequest(xnRequest); // Workaround for some WMS servers that have returning more than one root layer var layerNodes = xnCapability.SelectNodes("sm:Layer", nsmgr); if (layerNodes.Count > 1) { List <WmsServerLayer> layers = new List <WmsServerLayer>(); foreach (XmlNode l in layerNodes) { layers.Add(ParseLayer(l)); } var rootLayer = new WmsServerLayer(); rootLayer = layers[0]; rootLayer.Name = "__auto_generated_root_layer__"; rootLayer.Title = ""; rootLayer.ChildLayers = layers.ToArray(); Layer = rootLayer; } else { XmlNode xnLayer = xnCapability.SelectSingleNode("sm:Layer", nsmgr); if (xnLayer == null) { throw (new Exception("No layer tag found in Service Description")); } Layer = ParseLayer(xnLayer); } XmlNode xnException = xnCapability.SelectSingleNode("sm:Exception", nsmgr); if (xnException != null) { ParseExceptions(xnException); } vendorSpecificCapabilities = xnCapability.SelectSingleNode("sm:VendorSpecificCapabilities", nsmgr); }
/// <summary> /// Iterates through the layer nodes recursively /// </summary> /// <param name="xmlLayer"></param> /// <returns></returns> 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) { node = xmlLayer.SelectSingleNode("sm:BoundingBox", 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 = SharpMap.Converters.Geometries.GeometryFactory.CreateEnvelope(minx, maxx, miny, maxy); } return layer; }
/// <summary> /// Parses capability node /// </summary> /// <param name="xnCapability"></param> private void ParseCapability(XmlNode xnCapability) { XmlNode xnRequest = xnCapability.SelectSingleNode("sm:Request", nsmgr); if (xnRequest == null) throw (new System.Exception("Request parameter not specified in Service Description")); ParseRequest(xnRequest); XmlNode xnLayer = xnCapability.SelectSingleNode("sm:Layer", nsmgr); if (xnLayer == null) throw (new System.Exception("No layer tag found in Service Description")); _Layer = ParseLayer(xnLayer); XmlNode xnException = xnCapability.SelectSingleNode("sm:Exception", nsmgr); if (xnException != null) ParseExceptions(xnException); }
/// <summary> /// Iterates through the layer nodes recursively /// </summary> /// <param name="xmlLayer"></param> /// <returns></returns> 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); if (xmlLayer.Attributes != null) { XmlAttribute attr = xmlLayer.Attributes["queryable"]; layer.Queryable = (attr != null && attr.InnerText == "1"); } else { layer.Queryable = false; } layer.SRIDBoundingBoxes = new List <SpatialReferencedBoundingBox>(); 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 = null; if (_version == "1.1.0" || _version == "1.1.1") { xnlCrs = xmlLayer.SelectNodes("sm:SRS", _nsmgr); // <--I think this needs to be version specific } else { 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 && node.Attributes != null) { layer.Style[i].LegendUrl = new WmsStyleLegend(); layer.Style[i].LegendUrl.Size = new 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]); } } //LatLonBoundingBox is specific for WMS 1.1.1 servers node = xmlLayer.SelectSingleNode("sm:LatLonBoundingBox", _nsmgr); if (node != null) { double minx = WebUtilities.ParseNodeAsDouble(node.Attributes["minx"], -180.0); double miny = WebUtilities.ParseNodeAsDouble(node.Attributes["miny"], -90.0); double maxx = WebUtilities.ParseNodeAsDouble(node.Attributes["maxx"], 180.0); double maxy = WebUtilities.ParseNodeAsDouble(node.Attributes["maxy"], 90.0); layer.LatLonBoundingBox = new Envelope(minx, maxx, miny, maxy); } else { //EX_GeographicBoundingBox is specific for WMS 1.3.0 servers node = xmlLayer.SelectSingleNode("sm:EX_GeographicBoundingBox", _nsmgr); if (node != null) { //EX_GeographicBoundingBox is specific for WMS1.3.0 servers so this will be parsed if LatLonBoundingBox is null double minx = WebUtilities.ParseNodeAsDouble(node.SelectSingleNode("sm:westBoundLongitude", _nsmgr), -180.0); double miny = WebUtilities.ParseNodeAsDouble(node.SelectSingleNode("sm:southBoundLatitude", _nsmgr), -90.0); double maxx = WebUtilities.ParseNodeAsDouble(node.SelectSingleNode("sm:eastBoundLongitude", _nsmgr), 180.0); double maxy = WebUtilities.ParseNodeAsDouble(node.SelectSingleNode("sm:northBoundLatitude", _nsmgr), 90.0); layer.LatLonBoundingBox = new Envelope(minx, maxx, miny, maxy); } else { //Not sure what to do in this case. PDD. layer.LatLonBoundingBox = null; } } //if the layer has a specific spatial reference system, the boundingbox in this reference system should be parsed and placed in //the SRIDboundingbox XmlNodeList bboxes = xmlLayer.SelectNodes("sm:BoundingBox", _nsmgr); foreach (XmlNode bbox in bboxes) { double minx; double miny; double maxx; double maxy; int epsg; if (!WebUtilities.TryParseNodeAsDouble(bbox.Attributes["minx"], out minx)) { continue; } if (!WebUtilities.TryParseNodeAsDouble(bbox.Attributes["miny"], out miny)) { continue; } if (!WebUtilities.TryParseNodeAsDouble(bbox.Attributes["maxx"], out maxx)) { continue; } if (!WebUtilities.TryParseNodeAsDouble(bbox.Attributes["maxy"], out maxy)) { continue; } if (!WebUtilities.TryParseNodeAsEpsg(WebUtilities.FindEpsgNode(bbox), out epsg)) { continue; } layer.SRIDBoundingBoxes.Add(new SpatialReferencedBoundingBox(minx, miny, maxx, maxy, epsg)); } return(layer); }
/// <summary> /// Iterates through the layer nodes recursively /// </summary> /// <param name="xmlLayer"></param> /// <returns></returns> // ReSharper disable once FunctionComplexityOverflow // ReSharper disable once CyclomaticComplexity private WmsServerLayer ParseLayer(XmlNode xmlLayer) { var wmsServerLayer = new WmsServerLayer(); var node = xmlLayer.SelectSingleNode("sm:Name", _nsmgr); wmsServerLayer.Name = node?.InnerText; node = xmlLayer.SelectSingleNode("sm:Title", _nsmgr); wmsServerLayer.Title = node?.InnerText; node = xmlLayer.SelectSingleNode("sm:Abstract", _nsmgr); wmsServerLayer.Abstract = node?.InnerText; if (xmlLayer.Attributes != null) { var attr = xmlLayer.Attributes["queryable"]; wmsServerLayer.Queryable = attr != null && attr.InnerText == "1"; } var xnlKeywords = xmlLayer.SelectNodes("sm:KeywordList/sm:Keyword", _nsmgr); if (xnlKeywords != null) { wmsServerLayer.Keywords = new string[xnlKeywords.Count]; for (int i = 0; i < xnlKeywords.Count; i++) { wmsServerLayer.Keywords[i] = xnlKeywords[i].InnerText; } } wmsServerLayer.CRS = ParseCrses(xmlLayer); XmlNodeList xnlBoundingBox = xmlLayer.SelectNodes("sm:BoundingBox", _nsmgr); if (xnlBoundingBox != null) { wmsServerLayer.BoundingBoxes = new Dictionary <string, BoundingBox>(); for (var i = 0; i < xnlBoundingBox.Count; i++) { var xmlAttributeCollection = xnlBoundingBox[i].Attributes; if (xmlAttributeCollection != null) { var crs = (xmlAttributeCollection["CRS"] ?? xmlAttributeCollection["SRS"]).Value; wmsServerLayer.BoundingBoxes[crs] = new BoundingBox( double.Parse(xmlAttributeCollection["minx"].Value, NumberFormatInfo.InvariantInfo), double.Parse(xmlAttributeCollection["miny"].Value, NumberFormatInfo.InvariantInfo), double.Parse(xmlAttributeCollection["maxx"].Value, NumberFormatInfo.InvariantInfo), double.Parse(xmlAttributeCollection["maxy"].Value, NumberFormatInfo.InvariantInfo)); } } } XmlNodeList xnlStyle = xmlLayer.SelectNodes("sm:Style", _nsmgr); if (xnlStyle != null) { wmsServerLayer.Style = new WmsLayerStyle[xnlStyle.Count]; for (int i = 0; i < xnlStyle.Count; i++) { node = xnlStyle[i].SelectSingleNode("sm:Name", _nsmgr); wmsServerLayer.Style[i].Name = (node != null ? node.InnerText : null); node = xnlStyle[i].SelectSingleNode("sm:Title", _nsmgr); wmsServerLayer.Style[i].Title = (node != null ? node.InnerText : null); node = xnlStyle[i].SelectSingleNode("sm:Abstract", _nsmgr); wmsServerLayer.Style[i].Abstract = (node != null ? node.InnerText : null); node = xnlStyle[i].SelectSingleNode("sm:LegendURL", _nsmgr) ?? xnlStyle[i].SelectSingleNode("sm:LegendUrl", _nsmgr); if (node != null) { wmsServerLayer.Style[i].LegendUrl = new WmsStyleLegend(); if (node.Attributes["width"]?.InnerText != null && node.Attributes["height"]?.InnerText != null) { wmsServerLayer.Style[i].LegendUrl.Size = new Size { Width = int.Parse(node.Attributes["width"].InnerText), Height = int.Parse(node.Attributes["height"].InnerText) }; } wmsServerLayer.Style[i].LegendUrl.OnlineResource.OnlineResource = node.SelectSingleNode("sm:OnlineResource", _nsmgr).Attributes["xlink:href"].InnerText; wmsServerLayer.Style[i].LegendUrl.OnlineResource.Type = node.SelectSingleNode("sm:Format", _nsmgr).InnerText; } node = xnlStyle[i].SelectSingleNode("sm:StyleSheetURL", _nsmgr); if (node != null) { wmsServerLayer.Style[i].StyleSheetUrl = new WmsOnlineResource(); wmsServerLayer.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) { wmsServerLayer.ChildLayers = new WmsServerLayer[xnlLayers.Count]; for (int i = 0; i < xnlLayers.Count; i++) { wmsServerLayer.ChildLayers[i] = ParseLayer(xnlLayers[i]); } } node = xmlLayer.SelectSingleNode("sm:LatLonBoundingBox", _nsmgr); if (node != null) { double minx; double miny; double maxx; double maxy; if (!double.TryParse(node.Attributes["minx"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out minx) & !double.TryParse(node.Attributes["miny"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out miny) & !double.TryParse(node.Attributes["maxx"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxx) & !double.TryParse(node.Attributes["maxy"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxy)) { throw new ArgumentException("Invalid LatLonBoundingBox on layer '" + wmsServerLayer.Name + "'"); } wmsServerLayer.LatLonBoundingBox = new BoundingBox(minx, miny, maxx, maxy); } return(wmsServerLayer); }
/// <summary> /// Iterates through the layer nodes recursively /// </summary> /// <param name="xmlLayer"></param> /// <returns></returns> 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) { node = xmlLayer.SelectSingleNode("sm:BoundingBox", 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 = SharpMap.Converters.Geometries.GeometryFactory.CreateEnvelope(minx, maxx, miny, maxy); } return(layer); }
/// <summary> /// Iterates through the layer nodes recursively /// </summary> /// <param name="xmlLayer"></param> /// <returns></returns> private WmsServerLayer ParseLayer(XmlNode xmlLayer) { var wmsServerLayer = new WmsServerLayer(); XmlNode node = xmlLayer.SelectSingleNode("sm:Name", nsmgr); wmsServerLayer.Name = (node != null ? node.InnerText : null); node = xmlLayer.SelectSingleNode("sm:Title", nsmgr); wmsServerLayer.Title = (node != null ? node.InnerText : null); node = xmlLayer.SelectSingleNode("sm:Abstract", nsmgr); wmsServerLayer.Abstract = (node != null ? node.InnerText : null); XmlAttribute attr = xmlLayer.Attributes["queryable"]; wmsServerLayer.Queryable = (attr != null && attr.InnerText == "1"); XmlNodeList xnlKeywords = xmlLayer.SelectNodes("sm:KeywordList/sm:Keyword", nsmgr); if (xnlKeywords != null) { wmsServerLayer.Keywords = new string[xnlKeywords.Count]; for (int i = 0; i < xnlKeywords.Count; i++) wmsServerLayer.Keywords[i] = xnlKeywords[i].InnerText; } wmsServerLayer.CRS = ParseCrses(xmlLayer); XmlNodeList xnlBoundingBox = xmlLayer.SelectNodes("sm:BoundingBox", nsmgr); if (xnlBoundingBox != null) { wmsServerLayer.BoundingBoxes = new Dictionary<string, BoundingBox>(); for (var i = 0; i < xnlBoundingBox.Count; i++) { var xmlAttributeCollection = xnlBoundingBox[i].Attributes; if (xmlAttributeCollection != null) { var crs = (xmlAttributeCollection["CRS"] ?? xmlAttributeCollection["SRS"]).Value; wmsServerLayer.BoundingBoxes[crs] = new BoundingBox( double.Parse(xmlAttributeCollection["minx"].Value), double.Parse(xmlAttributeCollection["miny"].Value), double.Parse(xmlAttributeCollection["maxx"].Value), double.Parse(xmlAttributeCollection["maxy"].Value)); } } } XmlNodeList xnlStyle = xmlLayer.SelectNodes("sm:Style", nsmgr); if (xnlStyle != null) { wmsServerLayer.Style = new WmsLayerStyle[xnlStyle.Count]; for (int i = 0; i < xnlStyle.Count; i++) { node = xnlStyle[i].SelectSingleNode("sm:Name", nsmgr); wmsServerLayer.Style[i].Name = (node != null ? node.InnerText : null); node = xnlStyle[i].SelectSingleNode("sm:Title", nsmgr); wmsServerLayer.Style[i].Title = (node != null ? node.InnerText : null); node = xnlStyle[i].SelectSingleNode("sm:Abstract", nsmgr); wmsServerLayer.Style[i].Abstract = (node != null ? node.InnerText : null); node = xnlStyle[i].SelectSingleNode("sm:LegendURL", nsmgr) ?? xnlStyle[i].SelectSingleNode("sm:LegendUrl", nsmgr); if (node != null) { wmsServerLayer.Style[i].LegendUrl = new WmsStyleLegend(); wmsServerLayer.Style[i].LegendUrl.Size = new Size(); wmsServerLayer.Style[i].LegendUrl.Size.Width = int.Parse(node.Attributes["width"].InnerText); wmsServerLayer.Style[i].LegendUrl.Size.Height = int.Parse(node.Attributes["height"].InnerText); wmsServerLayer.Style[i].LegendUrl.OnlineResource.OnlineResource = node.SelectSingleNode("sm:OnlineResource", nsmgr).Attributes["xlink:href"].InnerText; wmsServerLayer.Style[i].LegendUrl.OnlineResource.Type = node.SelectSingleNode("sm:Format", nsmgr).InnerText; } node = xnlStyle[i].SelectSingleNode("sm:StyleSheetURL", nsmgr); if (node != null) { wmsServerLayer.Style[i].StyleSheetUrl = new WmsOnlineResource(); wmsServerLayer.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) { wmsServerLayer.ChildLayers = new WmsServerLayer[xnlLayers.Count]; for (int i = 0; i < xnlLayers.Count; i++) wmsServerLayer.ChildLayers[i] = ParseLayer(xnlLayers[i]); } node = xmlLayer.SelectSingleNode("sm:LatLonBoundingBox", nsmgr); if (node != null) { double minx; double miny; double maxx; double maxy; if (!double.TryParse(node.Attributes["minx"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out minx) & !double.TryParse(node.Attributes["miny"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out miny) & !double.TryParse(node.Attributes["maxx"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxx) & !double.TryParse(node.Attributes["maxy"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxy)) throw new ArgumentException("Invalid LatLonBoundingBox on layer '" + wmsServerLayer.Name + "'"); wmsServerLayer.LatLonBoundingBox = new BoundingBox(minx, miny, maxx, maxy); } return wmsServerLayer; }
/// <summary> /// Iterates through the layer nodes recursively /// </summary> /// <param name="xmlLayer"></param> /// <returns></returns> 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); if (xmlLayer.Attributes != null) { XmlAttribute attr = xmlLayer.Attributes["queryable"]; layer.Queryable = (attr != null && attr.InnerText == "1"); } else layer.Queryable = false; layer.SRIDBoundingBoxes = new List<SpatialReferencedBoundingBox>(); 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 = null; if(_version == "1.1.0" || _version == "1.1.1") xnlCrs = xmlLayer.SelectNodes("sm:SRS", _nsmgr); // <--I think this needs to be version specific else 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 && node.Attributes != null) { layer.Style[i].LegendUrl = new WmsStyleLegend(); layer.Style[i].LegendUrl.Size = new 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]); } //LatLonBoundingBox is specific for WMS 1.1.1 servers node = xmlLayer.SelectSingleNode("sm:LatLonBoundingBox", _nsmgr); if (node != null) { double minx = WebUtilities.ParseNodeAsDouble(node.Attributes["minx"], -180.0); double miny = WebUtilities.ParseNodeAsDouble(node.Attributes["miny"], -90.0); double maxx = WebUtilities.ParseNodeAsDouble(node.Attributes["maxx"], 180.0); double maxy = WebUtilities.ParseNodeAsDouble(node.Attributes["maxy"], 90.0); layer.LatLonBoundingBox = new BoundingBox(minx, miny, maxx, maxy); } else { //EX_GeographicBoundingBox is specific for WMS 1.3.0 servers node = xmlLayer.SelectSingleNode("sm:EX_GeographicBoundingBox", _nsmgr); if (node != null) { //EX_GeographicBoundingBox is specific for WMS1.3.0 servers so this will be parsed if LatLonBoundingBox is null double minx = WebUtilities.ParseNodeAsDouble(node.SelectSingleNode("sm:westBoundLongitude", _nsmgr), -180.0); double miny = WebUtilities.ParseNodeAsDouble(node.SelectSingleNode("sm:southBoundLatitude", _nsmgr), -90.0); double maxx = WebUtilities.ParseNodeAsDouble(node.SelectSingleNode("sm:eastBoundLongitude", _nsmgr), 180.0); double maxy = WebUtilities.ParseNodeAsDouble(node.SelectSingleNode("sm:northBoundLatitude", _nsmgr), 90.0); layer.LatLonBoundingBox = new BoundingBox(minx, miny, maxx, maxy); } else { //Not sure what to do in this case. PDD. layer.LatLonBoundingBox = null; } } //if the layer has a specific spatial reference system, the boundingbox in this reference system should be parsed and placed in //the SRIDboundingbox XmlNodeList bboxes = xmlLayer.SelectNodes("sm:BoundingBox", _nsmgr); foreach (XmlNode bbox in bboxes) { double minx; double miny; double maxx; double maxy; int epsg; if (!WebUtilities.TryParseNodeAsDouble(bbox.Attributes["minx"], out minx)) continue; if (!WebUtilities.TryParseNodeAsDouble(bbox.Attributes["miny"], out miny)) continue; if (!WebUtilities.TryParseNodeAsDouble(bbox.Attributes["maxx"], out maxx)) continue; if (!WebUtilities.TryParseNodeAsDouble(bbox.Attributes["maxy"], out maxy)) continue; if (!WebUtilities.TryParseNodeAsEpsg(WebUtilities.FindEpsgNode(bbox), out epsg)) continue; layer.SRIDBoundingBoxes.Add(new SpatialReferencedBoundingBox(minx, miny, maxx, maxy, epsg)); } return layer; }
/// <summary> /// Iterates through the layer nodes recursively /// </summary> /// <param name="xmlLayer"></param> /// <returns></returns> private WmsServerLayer ParseLayer(XmlNode xmlLayer) { var 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"); node = xmlLayer.SelectSingleNode("sm:MinScaleDenominator", _nsmgr); layer.MinScaleDenominator = (node != null ? node.InnerText : null); node = xmlLayer.SelectSingleNode("sm:MaxScaleDenominator", _nsmgr); layer.MaxScaleDenominator = (node != null ? node.InnerText : null); 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++) { if (xnlCrs[i].InnerText != null) { layer.Crs[i] = xnlCrs[i].InnerText.Replace("EPSG:", ""); } } } 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.Width = int.Parse(node.Attributes["width"].InnerText); layer.Style[i].LegendUrl.Height = 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]); } } if (this._wmsVersion == "1.3.0") { node = xmlLayer.SelectSingleNode("sm:EX_GeographicBoundingBox", _nsmgr); } else { node = xmlLayer.SelectSingleNode("sm:LatLonBoundingBox", _nsmgr); } if (node != null) { double minx = 0.0, miny = 0.0, maxx = 0.0, maxy = 0.0; //if (!double.TryParse(node.Attributes["westBoundLongitude"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out minx) & // !double.TryParse(node.Attributes["southBoundLatitude"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out miny) & // !double.TryParse(node.Attributes["eastBoundLongitude"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxx) & // !double.TryParse(node.Attributes["northBoundLatitude"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxy)) //{ // throw new ArgumentException("Invalid LatLonBoundingBox on layer '" + layer.Name + "'"); //} if (this._wmsVersion == "1.3.0") { double.TryParse(node.SelectSingleNode("sm:westBoundLongitude", _nsmgr).InnerText, NumberStyles.Any, CultureInfo.InvariantCulture, out minx); double.TryParse(node.SelectSingleNode("sm:southBoundLatitude", _nsmgr).InnerText, NumberStyles.Any, CultureInfo.InvariantCulture, out miny); double.TryParse(node.SelectSingleNode("sm:eastBoundLongitude", _nsmgr).InnerText, NumberStyles.Any, CultureInfo.InvariantCulture, out maxx); double.TryParse(node.SelectSingleNode("sm:northBoundLatitude", _nsmgr).InnerText, NumberStyles.Any, CultureInfo.InvariantCulture, out maxy); } else { double.TryParse(node.Attributes["minx"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out minx); double.TryParse(node.Attributes["miny"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out miny); double.TryParse(node.Attributes["maxx"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxx); double.TryParse(node.Attributes["maxy"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxy); } layer.LatLonBoundingBox = new Extent(minx, miny, maxx, maxy); } return(layer); }
/// <summary> /// Iterates through the layer nodes recursively /// </summary> /// <param name="xmlLayer"></param> /// <returns></returns> private WmsServerLayer ParseLayer(XmlNode xmlLayer) { var 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.Width = int.Parse(node.Attributes["width"].InnerText); layer.Style[i].LegendUrl.Width = 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, NumberStyles.Any, CultureInfo.InvariantCulture, out minx) & !double.TryParse(node.Attributes["miny"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out miny) & !double.TryParse(node.Attributes["maxx"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxx) & !double.TryParse(node.Attributes["maxy"].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out maxy)) { throw new ArgumentException("Invalid LatLonBoundingBox on layer '" + layer.Name + "'"); } layer.LatLonBoundingBox = new Extent(minx, miny, maxx, maxy); } return(layer); }