Пример #1
0
        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)));
        }
Пример #2
0
        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);
        }