public override Task <IFeatureCursor> GetFeatures(IQueryFilter filter) { string queryUrl = $"{ _dataaset.ServiceUrl() }/{ this.ID }/query?f=json"; string geometryType = String.Empty, geometry = String.Empty; int outSrefId = (filter.FeatureSpatialReference != null) ? filter.FeatureSpatialReference.EpsgCode : 0, inSrefId = 0; // Bitte nicht ändern -> Verursacht Pagination Error vom AGS und Performance Problem wenn daten im SQL Spatial liegen string featureLimit = String.Empty; //(filter.FeatureLimit <= 0 ? "" : filter.FeatureLimit.ToString()); string separatedSubFieldsString = String.IsNullOrWhiteSpace(filter.SubFields) ? "*" : filter.SubFields.Replace(" ", ","); if (filter is SpatialFilter) { var sFilter = (SpatialFilter)filter; inSrefId = sFilter.FilterSpatialReference != null ? sFilter.FilterSpatialReference.EpsgCode : 0; if (sFilter.Geometry is IPoint) { geometry = RestHelper.ConvertGeometryToJson(((Point)sFilter.Geometry), inSrefId); geometryType = RestHelper.GetGeometryTypeString(((Point)sFilter.Geometry)); } else if (sFilter.Geometry is IMultiPoint) { geometry = RestHelper.ConvertGeometryToJson(((MultiPoint)sFilter.Geometry), inSrefId); geometryType = RestHelper.GetGeometryTypeString(((MultiPoint)sFilter.Geometry)); } // TODO - if needed else if (sFilter.Geometry is IPolyline) { geometry = RestHelper.ConvertGeometryToJson(((Polyline)sFilter.Geometry), inSrefId); geometryType = RestHelper.GetGeometryTypeString(((Polyline)sFilter.Geometry)); } else if (sFilter.Geometry is IPolygon) { geometry = RestHelper.ConvertGeometryToJson(((Polygon)sFilter.Geometry), inSrefId); geometryType = RestHelper.GetGeometryTypeString(((Polygon)sFilter.Geometry)); } else if (sFilter.Geometry is IEnvelope) { geometry = RestHelper.ConvertGeometryToJson(((Envelope)sFilter.Geometry), inSrefId); geometryType = RestHelper.GetGeometryTypeString(((Envelope)sFilter.Geometry)); } else { } } string where = filter.WhereClause; // is always set in featurecursor //string orderBy = this.IDFieldName; var postBodyData = new StringBuilder(); postBodyData.Append($"&geometry={ geometry }&geometryType={ geometryType }&spatialRel=esriSpatialRelIntersects&relationParam=&objectIds="); postBodyData.Append($"&time=&maxAllowableOffset=&outFields={ separatedSubFieldsString }&resultRecordCount={ featureLimit }&f=pjson"); postBodyData.Append($"&returnCountOnly=false&returnIdsOnly=false&returnGeometry={ true }"); return(Task.FromResult <IFeatureCursor>( new GeoServicesFeatureCursor(_dataaset, this, queryUrl, postBodyData.ToString(), where))); }
async public Task <bool> MapRequest(gView.Framework.Carto.IDisplay display) { if (_dataset == null) { return(false); } List <IWebServiceTheme> themes = Themes; if (themes == null) { return(false); } #region Check for visible Layers bool visFound = this.Themes.Where(l => l.Visible).Count() > 0; if (!visFound) { if (_image != null) { _image.Dispose(); _image = null; } return(true); } #endregion Check for visible Layers var serviceUrl = _dataset.ServiceUrl(); //IServiceRequestContext context = display.Map as IServiceRequestContext; var jsonExportMap = new JsonExportMap(); if (display?.Envelope != null) { var env = display.Envelope; jsonExportMap.BBox = $"{env.minx.ToDoubleString()},{env.miny.ToDoubleString()},{env.maxx.ToDoubleString()},{env.maxy.ToDoubleString()}"; } var sRef = display.SpatialReference ?? this.SpatialReference; if (sRef != null) { jsonExportMap.BBoxSRef = sRef.Name.ToLower().Replace("epsg:", ""); } jsonExportMap.Size = $"{display.iWidth},{display.iHeight}"; var layerIds = this.Themes .Where(l => l.Visible && (l.Class is IWebFeatureClass || l.Class is IWebRasterClass)) .Select(l => { if (l.Class is IWebFeatureClass) { return(((IWebFeatureClass)l.Class).ID); } if (l.Class is IWebRasterClass) { return(((IWebRasterClass)l.Class).ID); } return(String.Empty); }); jsonExportMap.Layers = $"show:{String.Join(",", layerIds)}"; var urlParameters = SerializeToUrlParameters(jsonExportMap); var response = await _dataset.TryPostAsync <JsonExportResponse>( serviceUrl .UrlAppendPath("export") .UrlAppendParameters("f=json") .UrlAppendParameters(urlParameters)); bool hasImage = false; if (!String.IsNullOrWhiteSpace(response.Href)) { var bm = WebFunctions.DownloadImage(response.Href); if (bm != null) { hasImage = true; _image = new GeorefBitmap(bm); if (response.Extent != null) { _image.Envelope = new Envelope(response.Extent.Xmin, response.Extent.Ymin, response.Extent.Xmax, response.Extent.Ymax); } _image.SpatialReference = sRef; } } if (!hasImage) { if (_image != null) { _image.Dispose(); _image = null; } return(false); } return(true); return(true); }