Пример #1
0
        internal static OGCService Create(XElement layer)
        {
            GISEnvelope env = new GISEnvelope();

            OGCService service = new OGCService("");

            //            <CRS>CRS:84</CRS>
            //<EX_GeographicBoundingBox>
            //    <westBoundLongitude>-180.0</westBoundLongitude>
            //    <eastBoundLongitude>180.0</eastBoundLongitude>
            //    <southBoundLatitude>-90.0</southBoundLatitude>
            //    <northBoundLatitude>90.0</northBoundLatitude>
            //</EX_GeographicBoundingBox>

            foreach (XElement el in layer.Elements())
            {
                if (el.Name == "Name")
                {
                    service._serviceName = layer.Element("Name").Value;
                }
                else if (el.Name == "Title")
                {
                    service._description = el.Value;
                }
                else if (el.Name == "SRS")
                {
                    env.CoordinateSystem = el.Value;
                }
                else if (el.Name == "CRS")
                {
                    env.CoordinateSystem = el.Value;
                }
                else if (el.Name == "LatLonBoundingBox")
                {
                    env.minX = double.Parse(el.Attribute("minx").Value);
                    env.maxX = double.Parse(el.Attribute("maxx").Value);
                    env.minY = double.Parse(el.Attribute("miny").Value);
                    env.maxY = double.Parse(el.Attribute("maxy").Value);
                }
                else if (el.Name == "BoundingBox")
                {
                    env.minX = double.Parse(el.Attribute("minx").Value);
                    env.maxX = double.Parse(el.Attribute("maxx").Value);
                    env.minY = double.Parse(el.Attribute("miny").Value);
                    env.maxY = double.Parse(el.Attribute("maxy").Value);
                    env.CoordinateSystem = el.Attribute("SRS") != null ? el.Attribute("SRS").Value : el.Attribute("CRS").Value;
                }
                else if (el.Name == "Layer")
                {
                    service._baseLayers.Add(OGCLayer.Create(el));
                }
            }

            service._baseExtent = env;
            return service;
        }
Пример #2
0
 public override GISService AddService(string serviceName, string serviceId, ServiceType serviceType)
 {
     OGCService svc = new OGCService(serviceName) { _type = serviceType, _serviceId = serviceId };
     Server._services.Add(svc);
     return svc;
 }
Пример #3
0
        private string GetUrl(OGC_OPERATION operation, OGC_SERVICE_TYPE type, OGCService service, IEnumerable<OGCLayer> layers, OGCEnvelope envelope, int width, int height, int x = 0, int y = 0)
        {
            StringBuilder requestUrl = new StringBuilder();

            requestUrl.AppendFormat("http://{0}/{1}?", Server.Host, Server.ServletPath);

            string stylename = string.Empty;

            switch (operation)
            {
                case OGC_OPERATION.GetCapabilities:
                    requestUrl.AppendFormat("request=GetCapabilities&version={0}&service={1}", Server.Version, type);
                    break;
                case OGC_OPERATION.GetMap:
                    requestUrl.AppendFormat(OGC_URL, service._getMapUrl, operation, type, Server.Version);

                    if (layers.Any() && layers.First().Style != null && layers.First().Style.Count > 0)
                    {
                        var style = from xx in layers where xx.Style != null && xx.Style.Count > 0 select xx.Style.First();
                        stylename = style.First().Name;
                    }

                    var fixedLayer = from qq in layers where qq.FixedHeight > 0 select qq;

                    if (fixedLayer.Count() > 0)
                    {
                        if (fixedLayer.First().Style != null && fixedLayer.First().Style.Count > 0)
                        {
                            stylename = fixedLayer.First().Style.First().Name;
                        }

                        requestUrl.AppendFormat(OGC_MAP, fixedLayer.First().FixedWidth, fixedLayer.First().FixedHeight, fixedLayer.First().Id, envelope, stylename);
                    }
                    else
                    {
                        string currentlayerId = BuildLayerString(layers, ref stylename);

                        requestUrl.AppendFormat(OGC_MAP, _imageWidth, height, currentlayerId, envelope, stylename, service.Format);
                    }
                    break;
                case OGC_OPERATION.GetFeatureInfo:
                    string layerString = BuildLayerString(layers, ref stylename);
                    requestUrl.AppendFormat(OGC_URL, service._getMapUrl, operation, type, Server.Version);
                    requestUrl.AppendFormat(OGC_FEATURE_INFO, Server.Version, envelope, layerString, type, _imageWidth, _imageHeight, x, y);
                    break;
                case OGC_OPERATION.GetFeature:
                    string layerString2 = BuildLayerString(layers, ref stylename);
                    requestUrl.AppendFormat(OGC_URL, service._getFeatureUrl, operation, type, "1.0.0");
                    requestUrl.AppendFormat(OGC_FEATURE, layerString2, envelope);
                    break;
                case OGC_OPERATION.GetLegendGraphic:
                    if (layers.First().Style != null && layers.First().Style.Count > 0)
                    {
                        var url = from xx in layers.First().Style where !string.IsNullOrEmpty(xx.LegendURL) select xx;

                        if (url.Count() > 0) return url.First().LegendURL;
                    }

                    string legendlayerId = BuildLayerString(layers, ref stylename);
                    requestUrl.AppendFormat(OGC_URL, service._getMapUrl, operation, type, Server.Version);
                    requestUrl.AppendFormat(LEGEND_URL, Server.Version, legendlayerId, service.Format);
                    break;
            }

            if (!string.IsNullOrEmpty(Server.Map))
            {
                requestUrl.AppendFormat("&map={0}", Server.Map);
            }

            return requestUrl.ToString();
        }
Пример #4
0
        private bool ProcessServiceReturn(string responseString)
        {
            _requestProcessing = false;

            //      <BoundingBox SRS="EPSG:4269" minx="-180" miny="-90" maxx="180" maxy="90"/>
            //<Layer queryable="1">
            //  <Name>world_countries_label</Name>
            //  <Title>Map Background - World Countries Labels</Title>
            //  <SRS>EPSG:4326</SRS>
            //  <LatLonBoundingBox minx="-180" miny="-90" maxx="180" maxy="90"/>
            //</Layer>
            try
            {
                string baseTag = "WMT_MS_Capabilities";
                string xnamespace = string.Empty;

                int idx = responseString.IndexOf("<WMT_MS_Capabilities");

                if (idx < 0)
                {
                    idx = responseString.IndexOf("<WMS_Capabilities");
                    baseTag = "WMS_Capabilities";
                    xnamespace = "http://www.opengis.net/wms";
                }

                XElement document = XElement.Parse(responseString.Substring(idx), LoadOptions.SetBaseUri);

                IEnumerable<XElement> serviceElements = document.Elements(XName.Get("Capability", xnamespace)).First().Elements(XName.Get("Layer", xnamespace));

                if (serviceElements.Count() == 1 && serviceElements.First().Elements(XName.Get("Layer", xnamespace)).Count() == 0)
                {
                }
                else if (serviceElements.Count() == 1 && serviceElements.First().Elements(XName.Get("Layer", xnamespace)).First().Elements(XName.Get("Layer", xnamespace)).Count() > 0)
                {
                    serviceElements = serviceElements.First().Elements(XName.Get("Layer", xnamespace));
                }

                _Server._services.Clear();

                foreach (XElement selement in serviceElements)
                {
                    GISService newSvc = new OGCService(selement.Elements(XName.Get("Title", xnamespace)).First().Value) { _description = selement.Elements(XName.Get("Title", xnamespace)).First().Value };
                    newSvc.BaseExtent = GetExtentFromElement(selement, xnamespace);

                    var layers = selement.Elements(XName.Get("Layer", xnamespace));

                    if (layers.Count() > 0)
                    {
                        foreach (XElement element in layers)
                        {
                            //                        <Layer queryable="1">
                            //  <Name>world_countries_label</Name>
                            //  <Title>Map Background - World Countries Labels</Title>
                            //  <SRS>EPSG:4326</SRS>
                            //  <LatLonBoundingBox minx="-180" miny="-90" maxx="180" maxy="90" />
                            //</Layer>

                            if (element.Descendants(XName.Get("Name", xnamespace)).Count() > 0)
                            {
                                GISLayerInfo layer = new OGCLayer(element.Descendants(XName.Get("Title", xnamespace)).First().Value, element.Descendants(XName.Get("Name", xnamespace)).First().Value);

                                if (element.Attribute(XName.Get("queryable", xnamespace)) != null)
                                {
                                    layer.IsQueryable = element.Attribute(XName.Get("queryable", xnamespace)).Value == "1";
                                }

                                layer.BaseExtent = GetExtentFromElement(element, xnamespace);

                                newSvc.BaseLayers.Add(layer);
                            }
                            else if (element.Descendants(XName.Get("Layer", xnamespace)).Count() > 0)
                            {
                                IEnumerable<XElement> childElements = element.Descendants(XName.Get("Layer", xnamespace));

                                foreach (XElement childElement in childElements)
                                {
                                    GISLayerInfo layer = new OGCLayer(element.Descendants(XName.Get("Title", xnamespace)).First().Value, childElement.Descendants(XName.Get("Name", xnamespace)).First().Value);

                                    if (childElement.Attribute(XName.Get("queryable", xnamespace)) != null)
                                    {
                                        layer.IsQueryable = childElement.Attribute(XName.Get("queryable", xnamespace)).Value == "1";
                                    }

                                    layer.BaseExtent = GetExtentFromElement(childElement, xnamespace);

                                    newSvc.BaseLayers.Add(layer);
                                }
                            }
                        }
                    }
                    else if (selement.Descendants().Count() > 0)
                    {
                        GISLayerInfo layer = new OGCLayer(selement.Descendants(XName.Get("Title", xnamespace)).First().Value, selement.Descendants(XName.Get("Name", xnamespace)).First().Value);

                        if (selement.Attribute(XName.Get("queryable", xnamespace)) != null)
                        {
                            layer.IsQueryable = selement.Attribute(XName.Get("queryable", xnamespace)).Value == "1";
                        }

                        layer.BaseExtent = GetExtentFromElement(selement, xnamespace);

                        newSvc.BaseLayers.Add(layer);
                    }
                    else
                    {
                        GISLayerInfo layer = new OGCLayer(newSvc._serviceName, newSvc._serviceId == null ? newSvc._serviceName : newSvc._serviceId);

                        layer.BaseExtent = GetExtentFromElement(selement, xnamespace);

                        newSvc.BaseLayers.Add(layer);
                    }

                    if (newSvc.Id == null) newSvc._serviceId = newSvc.Name;
                    _Server._services.Add(newSvc);
                }

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }