====== Source Code WebAPIEditionSample DrawEditFeatures.zip ====== ====DrawEditFeaturesController.cs==== using System; using System.Collections.ObjectModel; using System.Drawing; using System.Drawing.Imaging; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Web; using System.Web.Http; using System.Web.SessionState; using System.Xml.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.WebApiEdition; namespace DrawingAndEditing.Controllers { [RoutePrefix("edit")] public class DrawingAndEditingController : ApiController { private static string jsonArrayTemplate = "[{0}]"; [Route("{z}/{x}/{y}")] public HttpResponseMessage GetTile(int z, int x, int y) { // Create the layerOverlay for displaying the map. LayerOverlay layerOverlay = new LayerOverlay(); InMemoryFeatureLayer shapesFeatureLyaer = GetLayer(); if (shapesFeatureLyaer != null && shapesFeatureLyaer.InternalFeatures.Count > 0) { layerOverlay.Layers.Add(shapesFeatureLyaer); } using (Bitmap bitmap = new Bitmap(256, 256)) { GdiPlusGeoCanvas geoCanvas = new GdiPlusGeoCanvas(); RectangleShape boundingBox = WebApiExtentHelper.GetBoundingBoxForXyz(x, y, z, GeographyUnit.Meter); geoCanvas.BeginDrawing(bitmap, boundingBox, GeographyUnit.Meter); layerOverlay.Draw(geoCanvas); geoCanvas.EndDrawing(); MemoryStream memoryStream = new MemoryStream(); bitmap.Save(memoryStream, ImageFormat.Png); HttpResponseMessage responseMessage = new HttpResponseMessage(HttpStatusCode.OK); responseMessage.Content = new ByteArrayContent(memoryStream.ToArray()); responseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png"); return responseMessage; } } [Route("getshapes")] public string GetShapes() { InMemoryFeatureLayer shapesFeatureLayer = GetLayer(); // Return the shapes in JSON saved on server side to client side. return string.Format(CultureInfo.InvariantCulture, jsonArrayTemplate, string.Join(",", shapesFeatureLayer.InternalFeatures.Select(f => f.GetGeoJson()))); } [Route("saveshapes")] [HttpPost] public void SaveShapes([FromBody] string modifiedShapesInJson) { if (!string.IsNullOrEmpty(modifiedShapesInJson)) { // Parse the JSON. // There are 2 groups of shapes, one is for shapes removed on client side, // and the other is for shapes added on client side. JObject jObject = JObject.Parse(modifiedShapesInJson); InMemoryFeatureLayer shapesFeatureLayer = GetLayer(); shapesFeatureLayer.Open(); // Deal with removed shapes. string[] ids = jObject["removedIds"].ToObject(); foreach (var id in ids) { if (shapesFeatureLayer.InternalFeatures.Count > 0) { shapesFeatureLayer.InternalFeatures.Remove(id); } } // Deal with newly added shapes. string featureGeoJsons = jObject["newShapes"].ToString(); foreach (Feature feature in CreateFeaturesFromGeoJsons(featureGeoJsons)) { shapesFeatureLayer.InternalFeatures.Add(feature.Id, feature); } shapesFeatureLayer.Close(); } } private static Collection CreateFeaturesFromGeoJsons(string geoJsons) { Collection features = new Collection(); foreach (JToken item in JArray.Parse(geoJsons)) { Feature feature = null; string geoJson = item.ToString(); if (geoJson.Contains("\"type\": \"Circle\"")) { // Circle is not supported in standard GeoJSON, it's only defined in this sample. feature = CreateCircleFeatureFromGeoJson(geoJson); } else { feature = Feature.CreateFeatureFromGeoJson(geoJson); } if (feature != null && feature.GetWellKnownBinary() != null) { features.Add(feature); } } return features; } private static Feature CreateCircleFeatureFromGeoJson(string geoJson) { dynamic featureEntity = JsonConvert.DeserializeObject(geoJson); dynamic geometryEntity = JsonConvert.DeserializeObject(featureEntity.geometry.ToString()); double x = Convert.ToDouble(geometryEntity.coordinates[0].ToString(), CultureInfo.InvariantCulture); double y = Convert.ToDouble(geometryEntity.coordinates[1].ToString(), CultureInfo.InvariantCulture); double radius = Convert.ToDouble(geometryEntity.radius.ToString(), CultureInfo.InvariantCulture); DistanceUnit distanceUnit = (DistanceUnit)Enum.Parse(typeof(DistanceUnit), geometryEntity.radiusUnit.ToString(), true); EllipseShape circleShape = new EllipseShape(new PointShape(x, y), radius, GeographyUnit.DecimalDegree, distanceUnit); Feature feature = new Feature(circleShape); foreach (var item in featureEntity.properties) { feature.ColumnValues[item.Name] = item.Value.ToString(); } return feature; } // Get layer from the Session so each session has its own test data. private static InMemoryFeatureLayer GetLayer() { IHttpSessionState session = SessionStateUtility.GetHttpSessionStateFromContext(HttpContext.Current); if (session["shapesFeatureLayer"] == null) { InMemoryFeatureLayer shapesFeatureLayer = new InMemoryFeatureLayer(); shapesFeatureLayer.Open(); shapesFeatureLayer.Columns.Add(new FeatureSourceColumn("Name")); shapesFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(100, GeoColor.FromHtml("#676e51")), GeoColor.SimpleColors.Black); shapesFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimpleCircleStyle(GeoColor.FromHtml("#2b7a05"), 14, GeoColor.SimpleColors.Black); shapesFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.FromHtml("#676e51"), 2, true); shapesFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("Name", "Arial", 12, DrawingFontStyles.Bold, GeoColor.StandardColors.Gray, GeoColor.StandardColors.White, 2); shapesFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; string dataFilePath = GetFullPath(@"App_Data\Data.xml"); XElement xElement = XElement.Load(dataFilePath); foreach (var geometryXElement in xElement.Descendants("Geometry")) { Feature feature = new Feature(geometryXElement.Value); feature.ColumnValues.Add("name", geometryXElement.Attribute("name").Value); shapesFeatureLayer.InternalFeatures.Add(feature.Id, feature); } Proj4Projection proj4 = new Proj4Projection(); proj4.InternalProjectionParametersString = Proj4Projection.GetWgs84ParametersString(); proj4.ExternalProjectionParametersString = Proj4Projection.GetSphericalMercatorParametersString(); shapesFeatureLayer.FeatureSource.Projection = proj4; proj4.Open(); session["shapesFeatureLayer"] = shapesFeatureLayer; } return (InMemoryFeatureLayer)session["shapesFeatureLayer"]; } private static string GetFullPath(string fileName) { Uri uri = new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); string rootDirectory = Path.GetDirectoryName(Path.GetDirectoryName(uri.LocalPath)); return Path.Combine(rootDirectory, fileName); ; } } } ====Default.htm(LeafLet)==== Draw edit features
The name of drawn shape
The name is required.
OK
====Default.htm(OpenLayers)==== Draw edit features
The name of drawn shape
The name is required.
OK