Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
		/// <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;
		}
Exemple #4
0
		/// <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);
		}
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
0
        /// <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);
        }
Exemple #8
0
        /// <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;
        }
Exemple #9
0
        /// <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;
        }
Exemple #10
0
        /// <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);
        }
Exemple #11
0
        /// <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);
        }