====== 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
====Default.htm(OpenLayers)====
Draw edit features