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; }
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; }
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(); }
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; } }