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