コード例 #1
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);
        }
コード例 #2
0
        public IActionResult ExportMap(string folder, string id)
        {
            try
            {
                if (folder != DefaultFolder)
                {
                    throw new Exception("Unknown folder: " + folder);
                }

                var interpreter = InternetMapServer.GetInterpreter(typeof(ArcGisServerInterperter));

                #region Request

                JsonExportMap exportMap = Deserialize <JsonExportMap>(
                    Request.HasFormContentType ?
                    (IEnumerable <KeyValuePair <string, StringValues> >)Request.Form :
                    (IEnumerable <KeyValuePair <string, StringValues> >)Request.Query);

                ServiceRequest serviceRequest = new ServiceRequest(id, JsonConvert.SerializeObject(exportMap))
                {
                    OnlineResource = InternetMapServer.OnlineResource,
                    Method         = "export"
                };

                #endregion

                #region Security

                Identity identity = Identity.FromFormattedString(String.Empty);
                identity.HashedPassword = String.Empty;
                serviceRequest.Identity = identity;

                #endregion

                #region Queue & Wait

                IServiceRequestContext context = new ServiceRequestContext(
                    InternetMapServer.Instance,
                    interpreter,
                    serviceRequest);

                InternetMapServer.ThreadQueue.AddQueuedThreadSync(interpreter.Request, context);

                #endregion

                if (serviceRequest.Succeeded)
                {
                    return(Result(JsonConvert.DeserializeObject <JsonExportResponse>(serviceRequest.Response)));
                }
                else
                {
                    return(Result(JsonConvert.DeserializeObject <JsonError>(serviceRequest.Response)));
                }
            }
            catch (Exception ex)
            {
                return(Json(new JsonError()
                {
                    error = new JsonError.Error()
                    {
                        code = 999, message = ex.Message
                    }
                }));
            }
        }
コード例 #3
0
        private void ExportMapRequest(IServiceRequestContext context)
        {
            try
            {
                _exportMap = JsonConvert.DeserializeObject <JsonExportMap>(context.ServiceRequest.Request);
                using (var serviceMap = context.CreateServiceMapInstance())
                {
                    #region Display

                    serviceMap.Display.dpi = _exportMap.Dpi;

                    var size = _exportMap.Size.ToSize();
                    serviceMap.Display.iWidth  = size[0];
                    serviceMap.Display.iHeight = size[1];

                    var bbox = _exportMap.BBox.ToBBox();
                    serviceMap.Display.ZoomTo(new Envelope(bbox[0], bbox[1], bbox[2], bbox[3]));

                    #endregion

                    #region ImageFormat / Transparency

                    var imageFormat = (ImageFormat)Enum.Parse(typeof(ImageFormat), _exportMap.ImageFormat);
                    var iFormat     = System.Drawing.Imaging.ImageFormat.Png;
                    if (imageFormat == ImageFormat.jpg)
                    {
                        iFormat = System.Drawing.Imaging.ImageFormat.Jpeg;
                    }

                    if (_exportMap.Transparent)
                    {
                        serviceMap.Display.MakeTransparent  = true;
                        serviceMap.Display.TransparentColor = System.Drawing.Color.White;
                    }
                    else
                    {
                        serviceMap.Display.MakeTransparent = false;
                    }

                    if (serviceMap.Display.MakeTransparent && iFormat == System.Drawing.Imaging.ImageFormat.Png)
                    {
                        // Beim Png sollt dann beim zeichnen keine Hintergrund Rectangle gemacht werden
                        // Darum Farbe mit A=0
                        // Sonst schaut das Bild beim PNG32 und Antialiasing immer zerrupft aus...
                        serviceMap.Display.BackgroundColor = System.Drawing.Color.Transparent;
                    }

                    #endregion

                    serviceMap.BeforeRenderLayers += ServiceMap_BeforeRenderLayers;
                    serviceMap.Render();

                    if (serviceMap.MapImage != null)
                    {
                        string fileName = serviceMap.Name.Replace(",", "_") + "_" + System.Guid.NewGuid().ToString("N") + "." + iFormat.ToString().ToLower();
                        string path     = (_mapServer.OutputPath + @"/" + fileName).ToPlattformPath();
                        serviceMap.SaveImage(path, iFormat);

                        context.ServiceRequest.Succeeded = true;
                        context.ServiceRequest.Response  = JsonConvert.SerializeObject(new JsonExportResponse()
                        {
                            Href        = _mapServer.OutputUrl + "/" + fileName,
                            Width       = serviceMap.Display.iWidth,
                            Height      = serviceMap.Display.iHeight,
                            ContentType = "image/" + iFormat.ToString().ToLower(),
                            Scale       = serviceMap.Display.mapScale,
                            Extent      = new JsonExtent()
                            {
                                Xmin = serviceMap.Display.Envelope.minx,
                                Ymin = serviceMap.Display.Envelope.miny,
                                Xmax = serviceMap.Display.Envelope.maxx,
                                Ymax = serviceMap.Display.Envelope.maxy
                                       // ToDo: SpatialReference
                            }
                        });
                    }
                    else
                    {
                        context.ServiceRequest.Succeeded = false;
                        context.ServiceRequest.Response  = JsonConvert.SerializeObject(new JsonError()
                        {
                            error = new JsonError.Error()
                            {
                                code    = -1,
                                message = "No image data"
                            }
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                context.ServiceRequest.Succeeded = false;
                context.ServiceRequest.Response  = JsonConvert.SerializeObject(new JsonError()
                {
                    error = new JsonError.Error()
                    {
                        code    = -1,
                        message = ex.Message
                    }
                });
            }
        }