====== Source Code WebAPIEditionSample Overlays.zip ======
====Global.asax.cs====
using System.Web.Http;
namespace ThinkGeo.MapSuite.Overlays
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
WebApiConfig.Register(GlobalConfiguration.Configuration);
}
}
}
====WebApiConfig.cs====
using System.Web.Http;
namespace ThinkGeo.MapSuite.Overlays
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.EnsureInitialized();
}
}
}
====OverlayController.cs====
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
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.Http;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WebApiEdition;
namespace ThinkGeo.MapSuite.Overlays
{
[RoutePrefix("Overlays")]
public class OverlayController : ApiController
{
private static readonly string baseDirectory;
private static Collection customLayers;
static OverlayController()
{
baseDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data");
InitializeCustomLayers();
}
///
/// Refresh WorldMapKitLayer with dynamic layers.
///
[Route("WorldMapKit/{dynamicLayersNames}/{z}/{x}/{y}")]
[HttpGet]
public HttpResponseMessage LoadWorldMapKitLayer(string dynamicLayersNames, int z, int x, int y)
{
LayerOverlay layerOverlay = new LayerOverlay();
AddDynamicLayersToLayerOverlay(layerOverlay, dynamicLayersNames);
return DrawTileImage(layerOverlay, z, x, y);
}
///
/// Refresh OpenStreetMapLayer with dynamic layers.
///
[Route("OpenStreetMap/{dynamicLayersNames}/{z}/{x}/{y}")]
[HttpGet]
public HttpResponseMessage LoadOpenStreetMapLayer(string dynamicLayersNames, int z, int x, int y)
{
LayerOverlay layerOverlay = new LayerOverlay();
OpenStreetMapLayer openStreetMapLayer = new OpenStreetMapLayer();
layerOverlay.Layers.Add(openStreetMapLayer);
AddDynamicLayersToLayerOverlay(layerOverlay, dynamicLayersNames);
return DrawTileImage(layerOverlay, z, x, y);
}
///
/// Refresh BingMaps with key and dynamic layers.
///
[Route("BingMaps/{key}/{dynamicLayersNames}/{z}/{x}/{y}")]
[HttpGet]
public HttpResponseMessage LoadBingMapsLayer(string key, string dynamicLayersNames, int z, int x, int y)
{
LayerOverlay layerOverlay = new LayerOverlay();
BingMapsLayer bingMapsLayer = new BingMapsLayer();
bingMapsLayer.Name = "bingMapsAerialLayer";
bingMapsLayer.MapType = BingMapsMapType.Road;
bingMapsLayer.ApplicationId = key;
layerOverlay.Layers.Add(bingMapsLayer);
AddDynamicLayersToLayerOverlay(layerOverlay, dynamicLayersNames);
return DrawTileImage(layerOverlay, z, x, y);
}
///
/// Refresh GoogleMaps with dynamic layers.
///
[Route("GoogleMaps/{dynamicLayersNames}/{z}/{x}/{y}")]
[HttpGet]
public HttpResponseMessage LoadGoogleMapsLayer(string dynamicLayersNames, int z, int x, int y)
{
LayerOverlay layerOverlay = new LayerOverlay();
GoogleMapsLayer googleMapsLayer = new GoogleMapsLayer();
googleMapsLayer.MapType = GoogleMapsMapType.Satellite;
layerOverlay.Layers.Add(googleMapsLayer);
AddDynamicLayersToLayerOverlay(layerOverlay, dynamicLayersNames);
return DrawTileImage(layerOverlay, z, x, y);
}
///
/// Validates key for BingMaps.
///
[Route("BingMapsValidate")]
[HttpPost]
public bool ValidateBingMapsKey([FromBody] string postData)
{
bool updateSuc = true;
try
{
Dictionary parameters = JsonConvert.DeserializeObject>(postData);
ValidateBingMapsKeyStr(parameters);
}
catch (Exception ex)
{
updateSuc = false;
}
return updateSuc;
}
///
/// Draw the map and return the image back to client in an HttpResponseMessage.
///
private HttpResponseMessage DrawTileImage(LayerOverlay layerOverlay, int z, int x, int y)
{
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 ms = new MemoryStream();
bitmap.Save(ms, ImageFormat.Png);
HttpResponseMessage msg = new HttpResponseMessage(HttpStatusCode.OK);
msg.Content = new ByteArrayContent(ms.ToArray());
msg.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
return msg;
}
}
///
/// Initializes custom layers.
///
private static void InitializeCustomLayers()
{
ManagedProj4Projection wgs84ToGoogleProjection = new ManagedProj4Projection();
wgs84ToGoogleProjection.InternalProjectionParametersString = Proj4Projection.GetWgs84ParametersString(); //4326
wgs84ToGoogleProjection.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString(); //900913
wgs84ToGoogleProjection.Open();
customLayers = new Collection();
string shpFilePathName = string.Format(@"{0}\POIs\Schools.shp", baseDirectory);
string schoolImage = string.Format(@"{0}\Images\school.png", baseDirectory);
ShapeFileFeatureLayer schoolsLayer = new ShapeFileFeatureLayer(shpFilePathName);
schoolsLayer.Name = "schoolLayer";
schoolsLayer.Transparency = 200f;
schoolsLayer.ZoomLevelSet.ZoomLevel10.DefaultPointStyle = new PointStyle(new GeoImage(schoolImage));
schoolsLayer.ZoomLevelSet.ZoomLevel10.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
schoolsLayer.FeatureSource.Projection = wgs84ToGoogleProjection;
customLayers.Add(schoolsLayer);
}
///
/// Validates key for BingMaps.
///
/// key string for bing map
private void ValidateBingMapsKeyStr(Dictionary parameters)
{
string loginServiceTemplate = "http://dev.virtualearth.net/REST/v1/Imagery/Metadata/{0}?&incl=ImageryProviders&o=xml&key={1}";
string loginServiceUri = string.Format(CultureInfo.InvariantCulture, loginServiceTemplate, BingMapsMapType.Road, parameters["keyStr"]);
WebRequest request = WebRequest.Create(loginServiceUri);
request.GetResponse();
}
///
/// Adds dynamic layers to LayerOverlay.
///
/// target LayerOverlay
/// dynamic layer names
private void AddDynamicLayersToLayerOverlay(LayerOverlay layerOverlay, string dynamicLayersNames)
{
List dynamicLayersName = new List(dynamicLayersNames.Split(','));
foreach (var name in dynamicLayersName)
{
switch (name)
{
case "CustomOverlay":
layerOverlay.Layers.Add(customLayers.Single(l => l.Name == "schoolLayer"));
break;
}
}
}
}
}
====AssemblyInfo.cs====
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Overlays")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Overlays")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("9d9d03f8-b15b-4cd7-94f0-32437782a8bc")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
====Global.asax.cs====
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Routing;
namespace ThinkGeo.MapSuite.Overlays
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
WebApiConfig.Register(GlobalConfiguration.Configuration);
}
}
}
====WebApiConfig.cs====
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace ThinkGeo.MapSuite.Overlays
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.EnsureInitialized();
}
}
}
====AssemblyInfo.cs====
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Overlays")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Overlays")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("8edc958e-049c-4932-9590-97303462170d")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]