「Dotspatial」を利用して、WMSサービスの簡易版を作成する
以前に「Geoserver」のWMSサービスを表示させましたが、脱javaを進めていますので、ASP.NET Webアプリケーションで、「Dotspatial」を利用した、WMSサービスを提供できないか検証してみました。
使用したソフトウェアは以下の通りです。
・Dotspatial
・NetTopologySuite
・ASP.NET
・IIS
1.WMSサービス用のプロジェクトの作成
ASP.NET Webアプリケーションを作成します。デフォルトの場合、色々と不要なファイルが追加されるので、今回は空のプロジェクトを作成します。本プロジェクトでは「Dotspatial」を利用するので、参照に「Dotspatial」のdllを追加しておきます。

2.WMSサービスのクラスを作成
ブラウザからのリクエストに対し、該当するレイヤの画像を作成し、ブラウザに返却するWMSサービスのクラスを作成します。
今回は手っ取り早く表示させるだけなので、DBを使わずに、shpファイルを読み込ませています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
using DotSpatial.Controls; using DotSpatial.Data; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Web; namespace DotSpatial.WMS.Handlers { public class WmsHandler : IHttpHandler { public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext context) { var width = int.Parse(context.Request.QueryString["width"]); var height = int.Parse(context.Request.QueryString["height"]); var layers = context.Request.QueryString["layers"]; var bbox = context.Request.QueryString["bbox"].Split(',').Select(x => double.Parse(x)).ToArray(); using (var image = this.CreateMapImage(width, height, layers, bbox)) { var output = context.Response.OutputStream; image.Save(output, ImageFormat.Png); output.Flush(); } context.Response.ContentType = "image/png"; } private Image CreateMapImage(int width, int height,string layers, double[] bbox) { var buffer = new Bitmap(width, height, PixelFormat.Format32bppArgb); using (var graphic = Graphics.FromImage(buffer)) { var targetEnvelope = new Extent(bbox); var targetRectangle = new Rectangle(0, 0, width, height); var args = new MapArgs(targetRectangle, targetEnvelope, graphic); var shp = ""; IFeatureSet fs = null; IMapLayer layer = null; if (layers == "water") { shp = @"C:\shape\一般面\一般面.shp"; fs = new PolygonShapefile(shp); layer = new MapPolygonLayer(fs); } else if (layers == "area") { shp = @"C:\shape\行政界線\行政界線(広域).shp"; fs = new LineShapefile(shp); layer = new MapLineLayer(fs); } layer.DrawRegions(args, new List { args.GeographicExtents }, false); } return buffer; } } |
2.WMSサービスをIISに配備
IISに作成したWebアプリケーションを置きます。Web.Configの内容は以下の通りです。wms.aspxでアクセスすると、DotSpatial.WMS.Handlers.WmsHandlerが呼ばれるようにしています。
|
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <add name="WmsHandler" path="wms.aspx" verb="GET" type="DotSpatial.WMS.Handlers.WmsHandler"/> </handlers> <system.web> <compilation debug="true" targetFramework="4.7.2"/> <httpRuntime targetFramework="4.7.2"/> </system.web> </configuration> |
以下のようなファイル構成になります。

3.WMSサービスにアクセス
ブラウザから以下のURLにアクセスします。
|
1 |
http://localhost/DotSpatial.WMS/wms.aspx?width=512&height=512&bbox=54700.93,-178817.66,78273.55,-158133.22&layers=water |

該当するレイヤの画像が表示されました。
続いて、レイヤ名を変更してアクセスします。
|
1 |
http://localhost/DotSpatial.WMS/wms.aspx?width=512&height=512&bbox=54700.93,-178817.66,78273.55,-158133.22&layers=area |

変更したレイヤの画像が表示されました。
「Dotspatial」では、WinFormアプリケーションなので、画像が表示されるか心配していましたが、WinFormなしで、レイヤの描画が簡単にできました。
レイヤの読み込み処理、スタイルの管理など検討事項はありますが、意外と簡単に作れそうです。