Esempio n. 1
0
        private void DeleteFeatures(IServiceRequestContext context)
        {
            try
            {
                var editRequest = JsonConvert.DeserializeObject <JsonFeatureServerEditRequest>(context.ServiceRequest.Request);

                using (var serviceMap = context.CreateServiceMapInstance())
                {
                    var featureClass = GetFeatureClass(serviceMap, editRequest);
                    var dataset      = featureClass.Dataset;
                    var database     = dataset?.Database as IFeatureUpdater;
                    if (database == null)
                    {
                        throw new Exception("Featureclass is not editable");
                    }

                    foreach (int objectId in editRequest.ObjectIds.Split(',').Select(s => int.Parse(s)))
                    {
                        if (!database.Delete(featureClass, objectId))
                        {
                            throw new Exception(database.lastErrorMsg);
                        }
                    }

                    context.ServiceRequest.Succeeded = true;
                    context.ServiceRequest.Response  = JsonConvert.SerializeObject(
                        new JsonFeatureServerResponse()
                    {
                        DeleteResults = new JsonFeatureServerResponse.JsonResponse[]
                        {
                            new JsonFeatureServerResponse.JsonResponse()
                            {
                                Success = true
                            }
                        }
                    });
                }
            }
            catch (Exception ex)
            {
                context.ServiceRequest.Succeeded = false;
                context.ServiceRequest.Response  = JsonConvert.SerializeObject(new JsonFeatureServerResponse()
                {
                    DeleteResults = new JsonFeatureServerResponse.JsonResponse[]
                    {
                        new JsonFeatureServerResponse.JsonResponse()
                        {
                            Success = false,
                            Error   = new JsonFeatureServerResponse.JsonError()
                            {
                                Code        = 999,
                                Description = ex.Message.Split('\n')[0]
                            }
                        }
                    }
                });
            }
        }
Esempio n. 2
0
        private byte[] GetCompactTileBytes(IServiceRequestContext context, string path, int row, int col, string format)
        {
            string compactTileName = CompactTileName(row, col);

            string bundleFilename      = path + @"\" + compactTileName + ".tilebundle";
            string bundleIndexFilename = path + @"\" + compactTileName + ".tilebundlx";

            FileInfo fi = new FileInfo(bundleIndexFilename);

            if (!fi.Exists)
            {
                return(CreateEmpty(format));
            }

            CompactTileIndex bundleIndex = new CompactTileIndex(bundleIndexFilename);

            int bundleStartRow = CompactTileStart(row);
            int bundleStartCol = CompactTileStart(col);

            try
            {
                int tileLength, tilePosition = bundleIndex.TilePosition(row - bundleStartRow, col - bundleStartCol, out tileLength);

                if (tilePosition < 0)
                {
                    return(CreateEmpty(format));
                }

                using (FileStream fs = File.Open(bundleFilename, FileMode.Open, FileAccess.Read, FileShare.Read)) //new FileStream(bundleFilename, FileMode.Open, FileAccess.Read))
                {
                    fs.Position = tilePosition;

                    byte[] data = new byte[tileLength];
                    fs.Read(data, 0, tileLength);
                    return(data);
                }
            }
            catch (Exception ex)
            {
                using (var serviceMap = context.CreateServiceMapInstance())
                {
                    TileServiceMetadata metadata = serviceMap.MetadataProvider(_metaprovider) as TileServiceMetadata;
                    using (System.Drawing.Bitmap bm = new Bitmap(metadata.TileWidth, metadata.TileHeight))
                        using (System.Drawing.Graphics gr = Graphics.FromImage(bm))
                            using (System.Drawing.Font font = new Font("Arial", 9f))
                            {
                                gr.DrawString(ex.Message, font, Brushes.Red, new RectangleF(0f, 0f, (float)bm.Width, (float)bm.Height));

                                MemoryStream ms = new MemoryStream();
                                bm.Save(ms, format == ".png" ? ImageFormat.Png : ImageFormat.Jpeg);

                                return(ms.ToArray());
                            }
                }
            }
        }
Esempio n. 3
0
        async public Task Request(IServiceRequestContext context)
        {
            try
            {
                if (context == null || context.ServiceRequest == null)
                {
                    return;
                }

                using (var serviceMap = await context.CreateServiceMapInstance())
                {
                    if (serviceMap == null)
                    {
                        return;
                    }

                    if (_mapServer == null)
                    {
                        context.ServiceRequest.Response = "<FATALERROR>MapServer Object is not available!</FATALERROR>";
                        return;
                    }

                    TileServiceMetadata metadata = serviceMap.MetadataProvider(_metaprovider) as TileServiceMetadata;
                    if (metadata == null || metadata.Use == false)
                    {
                        context.ServiceRequest.Response = "<ERROR>Service is not used with Tile Service</ERROR>";
                    }

                    string service = context.ServiceRequest.Service;
                    string request = context.ServiceRequest.Request;
                    if (request.ToLower().StartsWith("path="))
                    {
                        request = request.Substring(5);
                    }

                    string[] args = request.Split('/');

                    string command        = args[0].ToLower();
                    bool   renderOnTheFly = false;
                    if (command.Contains(":"))
                    {
                        switch (command.Split(':')[1])
                        {
                        case "render":
                            renderOnTheFly = true;
                            break;
                        }

                        command = command.Split(':')[0];
                    }

                    switch (command)
                    {
                    case "metadata":
                        XmlStream stream = new XmlStream("metadata");
                        metadata.Save(stream);
                        StringWriter sw = new StringWriter();
                        stream.WriteStream(sw);
                        sw.Close();
                        context.ServiceRequest.Response = sw.ToString();
                        break;

                    case "osm":
                    case "tms":
                        if (args.Length == 4)
                        {
                            int epsg = int.Parse(args[1]);
                            if (metadata.EPSGCodes.Contains(epsg))
                            {
                                context.ServiceRequest.Response = TmsCapabilities(context, serviceMap, metadata, epsg);
                            }
                        }
                        else if (args.Length == 7)     // tms/srs/1.0.0/service/0/0/0.png
                        {
                            int    epsg   = int.Parse(args[1]);
                            double scale  = metadata.Scales[int.Parse(args[4])];
                            int    row    = (args[0] == "tms" ? int.Parse(args[5]) : int.Parse(args[6].Split('.')[0]));
                            int    col    = (args[0] == "tms" ? int.Parse(args[6].Split('.')[0]) : int.Parse(args[5]));
                            string format = ".png";
                            if (args[6].ToLower().EndsWith(".jpg"))
                            {
                                format = ".jpg";
                            }

                            await GetTile(context, serviceMap, metadata, epsg, scale, row, col, format, (args[0] == "tms" ? GridOrientation.LowerLeft : GridOrientation.UpperLeft), renderOnTheFly);
                        }
                        else if (args.Length == 10)      // tms/srs/service/01/000/000/001/000/000/001.png
                        {
                            int    epsg   = int.Parse(args[1]);
                            double scale  = metadata.Scales[int.Parse(args[3])];
                            int    col    = int.Parse(args[4]) * 1000000 + int.Parse(args[5]) * 1000 + int.Parse(args[6]);
                            int    row    = int.Parse(args[7]) * 1000000 + int.Parse(args[8]) * 1000 + int.Parse(args[9].Split('.')[0]);
                            string format = ".png";
                            if (args[9].ToLower().EndsWith(".jpg"))
                            {
                                format = ".jpg";
                            }

                            await GetTile(context, serviceMap, metadata, epsg, scale, row, col, format, (args[0] == "tms" ? GridOrientation.LowerLeft : GridOrientation.UpperLeft), renderOnTheFly);
                        }
                        break;

                    case "init":
                        if (args.Length >= 5)
                        {
                            string cacheFormat = args[1].ToLower() == "compact" ? "compact" : "";
                            if (args[2].ToLower() != "ul" &&
                                args[2].ToLower() != "ll")
                            {
                                throw new ArgumentException();
                            }

                            int    epsg   = int.Parse(args[3]);
                            string format = "image/" + args[4].ToLower();
                            if (args[4].ToLower().EndsWith(".jpg"))
                            {
                                format = ".jpg";
                            }

                            WriteConfFile(context, serviceMap, metadata, cacheFormat, epsg, format,
                                          (args[2].ToLower() == "ul" ? GridOrientation.UpperLeft : GridOrientation.LowerLeft));
                        }
                        break;

                    case "tile":
                        if (args.Length == 5)
                        {
                            int    epsg   = int.Parse(args[1]);
                            double scale  = GetScale(metadata, args[2]);    // double.Parse(args[2].Replace(",", "."), _nhi);
                            int    row    = int.Parse(args[3]);
                            int    col    = int.Parse(args[4].Split('.')[0]);
                            string format = ".png";
                            if (args[4].ToLower().EndsWith(".jpg"))
                            {
                                format = ".jpg";
                            }

                            await GetTile(context, serviceMap, metadata, epsg, scale, row, col, format, GridOrientation.UpperLeft, renderOnTheFly);
                        }
                        else if (args.Length == 6)
                        {
                            if (args[1].ToLower() != "ul" &&
                                args[1].ToLower() != "ll")
                            {
                                throw new ArgumentException();
                            }

                            int    epsg   = int.Parse(args[2]);
                            double scale  = GetScale(metadata, args[3]);    // double.Parse(args[3].Replace(",", "."), _nhi);
                            int    row    = int.Parse(args[4]);
                            int    col    = int.Parse(args[5].Split('.')[0]);
                            string format = ".png";
                            if (args[5].ToLower().EndsWith(".jpg"))
                            {
                                format = ".jpg";
                            }

                            await GetTile(context, serviceMap, metadata, epsg, scale, row, col, format,
                                          (args[1].ToLower() == "ul" ? GridOrientation.UpperLeft : GridOrientation.LowerLeft), renderOnTheFly);
                        }
                        else if (args.Length >= 7)
                        {
                            string cacheFormat = args[1].ToLower();
                            if (args[2].ToLower() != "ul" &&
                                args[2].ToLower() != "ll")
                            {
                                throw new ArgumentException();
                            }

                            int    epsg   = int.Parse(args[3]);
                            double scale  = GetScale(metadata, args[4]);    // double.Parse(args[4].Replace(",", "."), _nhi);
                            int    row    = int.Parse(args[5]);
                            int    col    = int.Parse(args[6].Split('.')[0]);
                            string format = ".png";
                            if (args[6].ToLower().EndsWith(".jpg"))
                            {
                                format = ".jpg";
                            }

                            if (cacheFormat == "compact")
                            {
                                var boundingTiles = args.Length > 7 ? new BoundingTiles(args[7]) : null;

                                await GetCompactTile(context, serviceMap, metadata, epsg, scale, row, col, format,
                                                     (args[2].ToLower() == "ul" ? GridOrientation.UpperLeft : GridOrientation.LowerLeft), boundingTiles, renderOnTheFly);
                            }
                            else
                            {
                                await GetTile(context, serviceMap, metadata, epsg, scale, row, col, format, (args[2].ToLower() == "ul" ? GridOrientation.UpperLeft : GridOrientation.LowerLeft), renderOnTheFly);
                            }
                        }
                        else
                        {
                            throw new ArgumentException();
                        }

                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                if (context != null && context.ServiceRequest != null)
                {
                    context.ServiceRequest.Response = "<Exception>" + ex.Message + "</Exception>";
                }
            }
        }
Esempio n. 4
0
        public void Request(IServiceRequestContext context)
        {
            using (var serviceMap = context.CreateServiceMapInstance())
            {
                if (context == null || context.ServiceRequest == null || serviceMap == null)
                {
                    return;
                }

                if (_mapServer == null)
                {
                    context.ServiceRequest.Response = "<FATALERROR>MapServer Object is not available!</FATALERROR>";
                    return;
                }

                TileServiceMetadata metadata = serviceMap.MetadataProvider(_metaprovider) as TileServiceMetadata;
                if (metadata == null || metadata.Use == false)
                {
                    context.ServiceRequest.Response = "<ERROR>Service is not used with Tile Service</ERROR>";
                    return;
                }

                string service = context.ServiceRequest.Service;
                string request = context.ServiceRequest.Request;

                //_mapServer.Log("WMTSRequest", loggingMethod.request_detail, request);

                if (request.Contains("=")) // QueryString
                {
                    QueryString queryString = new QueryString(request);
                    if (queryString.HasValue("service", "wmts") && queryString.HasValue("request", "getcapabilities") && queryString.HasValue("version", "1.0.0"))
                    {
                        WmtsCapabilities100(context, metadata);
                        return;
                    }
                }

                string[] args = request.Split('/');

                if (args.Length == 7)
                {
                    string cacheFormat = args[0].ToLower();
                    if (args[1].ToLower() != "ul" &&
                        args[1].ToLower() != "ll")
                    {
                        throw new ArgumentException();
                    }

                    int    epsg   = int.Parse(args[2]);
                    string style  = args[3].ToLower();
                    double scale  = GetScale(metadata, args[4]); // double.Parse(args[4].Replace(",", "."), _nhi);
                    int    row    = int.Parse(args[5]);
                    int    col    = int.Parse(args[6].Split('.')[0]);
                    string format = ".png";
                    if (args[6].ToLower().EndsWith(".jpg"))
                    {
                        format = ".jpg";
                    }

                    byte[] imageData = null;
                    if (scale > 0)
                    {
                        if (cacheFormat == "compact")
                        {
                            imageData = GetCompactTile(context, metadata, epsg, scale, row, col, format, (args[1].ToLower() == "ul" ? GridOrientation.UpperLeft : GridOrientation.LowerLeft));
                        }
                        else
                        {
                            imageData = GetTile(context, metadata, epsg, scale, row, col, format, (args[1].ToLower() == "ul" ? GridOrientation.UpperLeft : GridOrientation.LowerLeft));
                        }

                        if (style != "default")
                        {
                            throw new NotImplementedException("Not in .Net Standoard...");
                            //ImageProcessingFilters filter;
                            //if (Enum.TryParse<ImageProcessingFilters>(style, true, out filter))
                            //    imageData = ImageProcessing.ApplyFilter(imageData, filter, format == ".png" ? ImageFormat.Png : ImageFormat.Jpeg);
                        }
                    }

                    context.ServiceRequest.Response = new MapServerResponse()
                    {
                        Data        = imageData ?? _emptyPic,
                        ContentType = "image/jpg",
                        Expires     = DateTime.UtcNow.AddDays(7)
                    }.ToString();
                }
            }
            return;
        }
Esempio n. 5
0
        private byte[] GetCompactTile(IServiceRequestContext context, TileServiceMetadata metadata, int epsg, double scale, int row, int col, string format, GridOrientation orientation)
        {
            if (!metadata.EPSGCodes.Contains(epsg))
            {
                throw new ArgumentException("Wrong epsg argument");
            }

            if (orientation != GridOrientation.UpperLeft)
            {
                throw new ArgumentException("Compact Tiles Orientation must bei Upper Left!");
            }

            scale = metadata.Scales.GetScale(scale);
            if (scale <= 0.0)
            {
                throw new ArgumentException("Wrong scale argument");
            }

            //IEnvelope bounds = metadata.GetEGPSEnvelope(epsg);
            //if (bounds == null || bounds.Width == 0.0 || bounds.Height == 0.0)
            //    throw new Exception("No bounds defined for EPSG:" + epsg);
            IPoint origin = metadata.GetOriginUpperLeft(epsg);

            if (origin == null)
            {
                throw new Exception("No origin defined for EPSG:" + epsg);
            }

            format = format.ToLower();
            if (format != ".png" && format != ".jpg")
            {
                throw new Exception("Unsupported image format");
            }
            if (format == ".png" && metadata.FormatPng == false)
            {
                throw new Exception("Format image/png not supported");
            }
            if (format == ".jpg" && metadata.FormatJpg == false)
            {
                throw new Exception("Format image/jpeg no supported");
            }

            string path = _mapServer.TileCachePath + @"\" + MapName(context) + @"\_alllayers\compact\" +
                          TileServiceMetadata.ScalePath(orientation, epsg, scale);

            string compactTileName = CompactTileName(row, col);

            string bundleFilename     = path + @"\" + compactTileName + ".tilebundle";
            string bundleDoneFilename = path + @"\" + compactTileName + ".tilebundle.done";
            string bundleCalcFilename = path + @"\" + compactTileName + ".tilebundle.calc";

            if (new FileInfo(bundleFilename).Exists)
            {
                return(GetCompactTileBytes(context, path, row, col, format));
            }



            if (IsDirectoryEmpty(path))
            {
                #region On The Fly

                using (IServiceMap map = context.CreateServiceMapInstance())
                {
                    ISpatialReference sRef = SpatialReference.FromID("epsg:" + epsg);

                    map.Display.SpatialReference = sRef;
                    map.Display.dpi = metadata.Dpi;

                    map.Display.iWidth  = metadata.TileWidth;
                    map.Display.iHeight = metadata.TileHeight;

                    double res = (double)scale / (metadata.Dpi / 0.0254);
                    if (map.Display.MapUnits != GeoUnits.Meters)
                    {
                        GeoUnitConverter converter = new GeoUnitConverter();
                        res = converter.Convert(res, GeoUnits.Meters, map.Display.MapUnits);
                    }

                    origin = orientation == GridOrientation.UpperLeft ? metadata.GetOriginUpperLeft(epsg) : metadata.GetOriginLowerLeft(epsg);

                    double H = metadata.TileHeight * res;
                    double y = (orientation == GridOrientation.UpperLeft ?
                                origin.Y - H * (row + 1) :
                                origin.Y + H * row);

                    double W = metadata.TileWidth * res;
                    double x = origin.X + W * col;

                    map.Display.ZoomTo(new Envelope(x, y, x + W, y + H));
                    map.Render();

                    bool maketrans = map.Display.MakeTransparent;
                    map.Display.MakeTransparent = true;
                    MemoryStream ms = new MemoryStream();
                    map.SaveImage(ms, format == ".jpg" ? System.Drawing.Imaging.ImageFormat.Jpeg : System.Drawing.Imaging.ImageFormat.Png);
                    map.Display.MakeTransparent = maketrans;

                    return(ms.ToArray());
                }

                #endregion
            }


            return(null);
        }
Esempio n. 6
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
                    }
                });
            }
        }
Esempio n. 7
0
        private void UpdateFeatures(IServiceRequestContext context)
        {
            try
            {
                var editRequest = JsonConvert.DeserializeObject <JsonFeatureServerEditRequest>(context.ServiceRequest.Request);

                using (var serviceMap = context.CreateServiceMapInstance())
                {
                    var featureClass = GetFeatureClass(serviceMap, editRequest);
                    var dataset      = featureClass.Dataset;
                    var database     = dataset?.Database as IFeatureUpdater;
                    if (database == null)
                    {
                        throw new Exception("Featureclass is not editable");
                    }

                    List <IFeature> features = GetFeatures(featureClass, editRequest);
                    if (features.Count == 0)
                    {
                        throw new Exception("No features to add");
                    }

                    if (features.Where(f => f.OID <= 0).Count() > 0)
                    {
                        throw new Exception("Can't update features without existing ObjectId");
                    }

                    if (!database.Update(featureClass, features))
                    {
                        throw new Exception(database.lastErrorMsg);
                    }

                    context.ServiceRequest.Succeeded = true;
                    context.ServiceRequest.Response  = JsonConvert.SerializeObject(
                        new JsonFeatureServerResponse()
                    {
                        UpdateResults = new JsonFeatureServerResponse.JsonResponse[]
                        {
                            new JsonFeatureServerResponse.JsonResponse()
                            {
                                Success = true
                            }
                        }
                    });
                }
            }
            catch (Exception ex)
            {
                context.ServiceRequest.Succeeded = false;
                context.ServiceRequest.Response  = JsonConvert.SerializeObject(new JsonFeatureServerResponse()
                {
                    UpdateResults = new JsonFeatureServerResponse.JsonResponse[]
                    {
                        new JsonFeatureServerResponse.JsonResponse()
                        {
                            Success = false,
                            Error   = new JsonFeatureServerResponse.JsonError()
                            {
                                Code        = 999,
                                Description = ex.Message.Split('\n')[0]
                            }
                        }
                    }
                });
            }
        }
Esempio n. 8
0
        private void Legend(IServiceRequestContext context)
        {
            try
            {
                var legendLayers = new List <Rest.Json.Legend.Layer>();

                using (var serviceMap = context.CreateServiceMapInstance())
                {
                    foreach (var layer in serviceMap.MapElements)
                    {
                        if (!(layer is IFeatureLayer) || ((IFeatureLayer)layer).FeatureRenderer == null)
                        {
                            continue;
                        }

                        var featureLayer = (IFeatureLayer)layer;

                        var tocElement = serviceMap.TOC.GetTOCElement(featureLayer);
                        using (var tocLegendItems = serviceMap.TOC.LegendSymbol(tocElement))
                        {
                            if (tocLegendItems.Items == null || tocLegendItems.Items.Count() == 0)
                            {
                                continue;
                            }

                            var legendLayer = new Rest.Json.Legend.Layer()
                            {
                                LayerId   = featureLayer.ID,
                                LayerName = featureLayer.Title,
                                LayerType = "Feature-Layer",
                                MinScale  = Convert.ToInt32(featureLayer.MaximumScale > 1 ? featureLayer.MaximumScale : 0),
                                MaxScale  = Convert.ToInt32(featureLayer.MinimumScale > 1 ? featureLayer.MinimumScale : 0)
                            };

                            var legends = new List <Rest.Json.Legend.Legend>();
                            foreach (var tocLegendItem in tocLegendItems.Items)
                            {
                                if (tocLegendItem.Image == null)
                                {
                                    continue;
                                }

                                MemoryStream ms = new MemoryStream();
                                tocLegendItem.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

                                legends.Add(new Rest.Json.Legend.Legend()
                                {
                                    Label       = String.Empty,
                                    Url         = Guid.NewGuid().ToString("N").ToString(),
                                    ImageData   = Convert.ToBase64String(ms.ToArray()),
                                    ContentType = "image/png",
                                    Width       = tocLegendItem.Image.Width,
                                    Height      = tocLegendItem.Image.Height
                                });
                            }
                            legendLayer.Legend = legends.ToArray();
                            legendLayers.Add(legendLayer);
                        }
                    }
                }

                context.ServiceRequest.Succeeded = true;
                context.ServiceRequest.Response  = JsonConvert.SerializeObject(new Rest.Json.Legend.LegendResponse()
                {
                    Layers = legendLayers.ToArray()
                });
            }
            catch (Exception ex)
            {
                context.ServiceRequest.Succeeded = false;
                context.ServiceRequest.Response  = JsonConvert.SerializeObject(new JsonError()
                {
                    error = new JsonError.Error()
                    {
                        code    = -1,
                        message = ex.Message
                    }
                });
            }
        }
Esempio n. 9
0
        private void Query(IServiceRequestContext context, bool isFeatureServer = false)
        {
            try
            {
                var query = JsonConvert.DeserializeObject <JsonQueryLayer>(context.ServiceRequest.Request);

                List <JsonFeature> jsonFeatures             = new List <JsonFeature>();
                List <JsonFeatureResponse.Field> jsonFields = new List <JsonFeatureResponse.Field>();
                string               objectIdFieldName      = String.Empty;
                EsriGeometryType     esriGeometryType       = EsriGeometryType.esriGeometryAny;
                JsonSpatialReference featureSref            = null;

                using (var serviceMap = context.CreateServiceMapInstance())
                {
                    string filterQuery;

                    var tableClasses = FindTableClass(serviceMap, query.LayerId.ToString(), out filterQuery);
                    if (isFeatureServer == true && tableClasses.Count > 1)
                    {
                        throw new Exception("FeatureService can't be used with aggregated feature classes");
                    }

                    foreach (var tableClass in tableClasses)
                    {
                        objectIdFieldName = tableClass.IDFieldName;
                        if (tableClass is IFeatureClass)
                        {
                            esriGeometryType = JsonLayer.ToGeometryType(((IFeatureClass)tableClass).GeometryType);
                        }

                        QueryFilter filter;
                        if (!String.IsNullOrWhiteSpace(query.Geometry))
                        {
                            filter = new SpatialFilter();
                            var jsonGeometry = JsonConvert.DeserializeObject <Rest.Json.Features.Geometry.JsonGeometry>(query.Geometry);
                            ((SpatialFilter)filter).Geometry = jsonGeometry.ToGeometry();
                            ((SpatialFilter)filter).FilterSpatialReference = SRef(query.InSRef);
                        }
                        else
                        {
                            filter = new QueryFilter();
                        }
                        if (query.ReturnCountOnly == true)
                        {
                            filter.SubFields = !String.IsNullOrWhiteSpace(tableClass.IDFieldName) ? tableClass.IDFieldName : "*";
                        }
                        else
                        {
                            filter.SubFields = query.OutFields;
                        }
                        filter.WhereClause = query.Where;

                        if (!String.IsNullOrWhiteSpace(query.OutSRef))
                        {
                            filter.FeatureSpatialReference = SRef(query.OutSRef);
                        }
                        else if (tableClass is IFeatureClass)
                        {
                            filter.FeatureSpatialReference = ((IFeatureClass)tableClass).SpatialReference;
                        }
                        if (filter.FeatureSpatialReference != null)
                        {
                            try
                            {
                                featureSref = new JsonSpatialReference()
                                {
                                    Wkid = int.Parse(filter.FeatureSpatialReference.Name.Split(':')[1])
                                };
                            }
                            catch { }
                        }

                        if (filterQuery != String.Empty)
                        {
                            filter.WhereClause = (filter.WhereClause != String.Empty) ?
                                                 "(" + filter.WhereClause + ") AND " + filterQuery :
                                                 filterQuery;
                        }

                        #region Feature Spatial Reference

                        if (query.OutSRef != null)
                        {
                            filter.FeatureSpatialReference = SRef(query.OutSRef);
                        }

                        #endregion

                        var cursor = tableClass.Search(filter);

                        bool firstFeature = true;
                        if (cursor is IFeatureCursor)
                        {
                            IFeature       feature;
                            IFeatureCursor featureCursor = (IFeatureCursor)cursor;
                            while ((feature = featureCursor.NextFeature) != null)
                            {
                                var jsonFeature    = new JsonFeature();
                                var attributesDict = (IDictionary <string, object>)jsonFeature.Attributes;

                                if (feature.Fields != null)
                                {
                                    foreach (var field in feature.Fields)
                                    {
                                        object val = field.Value;
                                        if (val is DateTime)
                                        {
                                            val = Convert.ToInt64(((DateTime)val - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds);
                                        }
                                        attributesDict[field.Name] = val;

                                        if (firstFeature)
                                        {
                                            var tableField = tableClass.FindField(field.Name);
                                            if (tableField != null)
                                            {
                                                jsonFields.Add(new JsonFeatureResponse.Field()
                                                {
                                                    Name   = tableField.name,
                                                    Alias  = tableField.aliasname,
                                                    Length = tableField.size,
                                                    Type   = JsonField.ToType(tableField.type).ToString()
                                                });
                                            }
                                        }
                                    }
                                }

                                jsonFeature.Geometry = feature.Shape?.ToJsonGeometry();

                                jsonFeatures.Add(jsonFeature);
                                firstFeature = false;
                            }
                        }
                    }
                }

                context.ServiceRequest.Succeeded = true;

                if (isFeatureServer)
                {
                    context.ServiceRequest.Response = JsonConvert.SerializeObject(new JsonFeatureServiceQueryResponse()
                    {
                        ObjectIdFieldName = objectIdFieldName,
                        GeometryType      = esriGeometryType.ToString(),
                        SpatialReference  = featureSref,
                        Fields            = jsonFields.ToArray(),
                        Features          = jsonFeatures.ToArray()
                    });
                }
                else if (query.ReturnCountOnly == true)
                {
                    context.ServiceRequest.Response = JsonConvert.SerializeObject(new JsonFeatureCountResponse()
                    {
                        Count = jsonFeatures.Count()
                    });
                }
                else
                {
                    context.ServiceRequest.Response = JsonConvert.SerializeObject(new JsonFeatureResponse()
                    {
                        GeometryType     = esriGeometryType.ToString(),
                        SpatialReference = featureSref,
                        Fields           = jsonFields.ToArray(),
                        Features         = jsonFeatures.ToArray()
                    });
                }
            }
            catch (Exception ex)
            {
                context.ServiceRequest.Succeeded = false;
                context.ServiceRequest.Response  = JsonConvert.SerializeObject(new JsonError()
                {
                    error = new JsonError.Error()
                    {
                        code    = -1,
                        message = ex.Message
                    }
                });
            }
        }
Esempio n. 10
0
        async private Task <byte[]> GetCompactTileBytes(IServiceRequestContext context, string path, int row, int col, string format)
        {
            string compactTileName = CompactTileName(row, col);

            string bundleFilename      = path + @"/" + compactTileName + ".tilebundle";
            string bundleIndexFilename = path + @"/" + compactTileName + ".tilebundlx";

            FileInfo fi = new FileInfo(bundleIndexFilename);

            if (!fi.Exists)
            {
                return(CreateEmpty(format));
            }

            CompactTileIndex bundleIndex = new CompactTileIndex(bundleIndexFilename);

            int bundleStartRow = CompactTileStart(row);
            int bundleStartCol = CompactTileStart(col);

            try
            {
                var tilePositionResult = await bundleIndex.TilePosition(row - bundleStartRow, col - bundleStartCol);

                int tileLength = tilePositionResult.tileLength, tilePosition = tilePositionResult.position;

                if (tilePosition < 0)
                {
                    return(CreateEmpty(format));
                }

                using (FileStream fs = File.Open(bundleFilename, FileMode.Open, FileAccess.Read, FileShare.Read)) //new FileStream(bundleFilename, FileMode.Open, FileAccess.Read))
                {
                    fs.Position = tilePosition;

                    byte[] data = new byte[tileLength];
                    await fs.ReadAsync(data, 0, tileLength);

                    return(data);
                }
            }
            catch (Exception ex)
            {
                using (var serviceMap = await context.CreateServiceMapInstance())
                {
                    TileServiceMetadata metadata = serviceMap.MetadataProvider(_metaprovider) as TileServiceMetadata;
                    using (var bitmap = Current.Engine.CreateBitmap(metadata.TileWidth, metadata.TileHeight))
                        using (var canvas = bitmap.CreateCanvas())
                            using (var font = Current.Engine.CreateFont("Arial", 9f))
                                using (var redBrush = Current.Engine.CreateSolidBrush(ArgbColor.Red))
                                {
                                    canvas.DrawText(ex.Message, font, redBrush, new CanvasRectangleF(0f, 0f, bitmap.Width, bitmap.Height));
                                    canvas.Flush();

                                    MemoryStream ms = new MemoryStream();
                                    bitmap.Save(ms, format == ".png" ? ImageFormat.Png : ImageFormat.Jpeg);

                                    return(ms.ToArray());
                                }
                }
            }
        }