現在、SharpMapを利用してGISを構築すべく、色々試しています。今回は、タイル画像(航空写真)を表示する際のメモです。
「SharpMap」では、「Dotspatial」と同様に、タイル画像の表示に、BruTileを利用しています。
BruTileは、オープンソースの.NETライブラリで、GISアプリケーションでタイルベースのWebマップを取り扱うためのツールセットで、BruTileでは、タイルサーバーからタイルをダウンロードし、タイルをキャッシュし、ローカルでタイルを使用するためのAPIが提供されます。その結果、開発者はタイルベースのWebマップを構築するために必要な、タイルのリクエストや管理などのタスクを容易に実行できます。
とはいえ、BruTileのサンプルにはオープンストリートマップなど、一般的に使われているタイルサーバーの例のみなので、独自のタイル画像を表示させてみました。
参考ソース
■作成するタイルレイヤについて
・ローカルPCにIISをインストールし、HTTP経由で、タイル画像を取得。
・ズームレベルは0~7
・画像サイズは1辺が512px
・座標系は平面直角座標系
・初期時に、タイル画像の範囲とレベルを決めて置き、Resolutionsを作成していきます。
※オープンストリートマップや地理院タイルなどは、Webメルカトル図法の座標参照系のため、
こういった処理は必要ありませんが、平面直角座標系のタイル画像はこのような処理が必要になります。
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 |
var form = new MainForm(); form.SRID = 2446; var minZoomLevel = 0; var maxZoomLevel = 7; var tileSize = 512; var schema = new TileSchema(); schema.Name = "orz_photos"; schema.Extent = new Extent(4800, 115800, 30400, 167000); schema.OriginX = schema.Extent.MinX; schema.OriginY = schema.Extent.MinY; schema.YAxis = YAxis.TMS; schema.Format = "jpg"; schema.Srs = $"EPSG:{form.SRID}"; var scaleFactor = schema.Extent.Width / 2 / tileSize; for (int level = minZoomLevel; level <= maxZoomLevel; level++) { var id = level.ToString(); var unitsPerPixel = 2 * scaleFactor / (1 << level); var res = new Resolution( id, unitsPerPixel, tileSize, tileSize ); schema.Resolutions.Add(res.Id, res); } var tileSource = new HttpTileSource(schema, "http://localhost/SharpMapServer/photos/{z}/{x}_{y}.jpg", new[] { "a", "b", "c" }, name: "orz_photos"); var orzLayer = new SharpMap.Layers.TileLayer(tileSource, "orz_photos"){ LayerTitle = "航空写真"}; form.MapControl.Map.BackgroundLayer.Clear(); form.MapControl.Map.BackgroundLayer.Add(orzLayer); |
画面イメージ
以下、画面イメージです。
拡大したイメージです。