海岸線のレンダリング[2021.12.13]

1.はじめに

厄介なことに、海岸線データは Shapefile で提供される[1]。 前地図システムでは、PostgreSQL/PostGISデータベースに取り込んで、 CSVファイルでエクスポートしたものを使っていた。 Shapefileを C#の基本機能だけで読み込むのは困難である。 SharpMap[2]などを使う方法もあるが、 広く一般に使われているものではないので、手軽には使えない。

QGISまたはPostgreSQL/PostGISを使って、 CSVファイルでエクスポートする。

QGISの方が操作は簡単である[3]。 simplified-land-polygons-complete-3857.zipおよび land-polygons-split-3857.zip をダウンロードして、タブ区切りファイルとした。

3857形式の方が レンダリングでの座標変換が簡単であるから、 パフォーマンス上は有利であるが、極座標の方が分かりやすいため、 4326形式でエキスポートする。

それならば land-polygons-complete-4326.zip の方がいいと言えるが、 低ズーム用がないため、ダウンロードは 3857 で揃えた。

2.プログラム

形式上は MultiPolygon であるが、実際は閉ループひとつのシングルポリゴンである。

地図システム Ver. 2 では、16進表示のテキストファイルであったが、 Ver 3. では osm(xml)ファイルと同様にバイナリファイルに変換する。

低ズーム用はゾーン分割しないが、中・高ズーム用も日本地図領域に限定し、ファイルサイズが 十分小さければゾーン分割をやめ、ファイル全体をメモリに読み込み空間検索を行う。

WKT,FID
"MULTIPOLYGON (((-4.732901 55.524961,-4.736315 55.525553,-4.738457 55.528084,-4.733933 55.527892,-4.732901 55.524961)))","0"
"MULTIPOLYGON (((-1.9880991 50.6819996,-1.9893854 50.684027,-1.9812813 50.6845458,-1.9828153 50.6817161,-1.9880991 50.6819996)))","1"
...

低ズーム用のバイナリファイルは 10.5MB、高ズーム用は日本地図境界ボックスに限定すると 14.3MB となった。

zoom 15で皇居を中心としてレンダリングしたときの結果を下に示す。 この場合の land polygon はひとつだけで、ノード数は 65819 である。 最初のタイル 15_29103_12901 のレンダリングで読み込むため、 レンダリングと合わせて 67 msかかっている。その後はレンダリングだけであるが、ノードが多いため、 平均的には 30数ms かかっている。

以前はもっと小さく分割されていたように思うが、変わったのかも知れない。

land polygon ではなく、water polygon を使えば、内陸部ではレンダリングがなくなるが、 何故か、何故か地図の一部の描画に乱れがある。

c:\gis3>gis3
GPSLog.Load
Archive.Load: d:/gisarc/japan/15/1818/806.arc
Archive.Load: d:/gisarc/japan/15/1819/806.arc
OSM初期化完了 
GetAllBytes: d:/osmzone/japan/7/113.dat 48ms
GetAllBytes: d:/osmzone/japan/10/909.dat 46ms
GetAllBytes: d:/osmzone/japan/13/7275.dat 15ms
OSM.GetOSM3: 336 12073 22073
Render: ready 1ms
15_29103_12901 1
65819
Render: coastline 67ms
Render: Append 84ms
Render: landcover 202ms
Render: waterway 300ms
Render: 道路など 637ms
Render: 15_29103_12901 34482 合計 1193ms
OSM.GetOSM3: 598 8313 10697
Render: ready 2ms
15_29103_12902 1
65819
Render: coastline 35ms
Render: Append 39ms
Render: landcover 61ms
Render: waterway 92ms
Render: 道路など 347ms
Render: 15_29103_12902 19608 合計 482ms
OSM.GetOSM3: 760 11419 10827
Render: ready 1ms
15_29103_12904 1
65819
Render: coastline 37ms
Render: Append 41ms
Render: landcover 72ms
Render: waterway 130ms
Render: 道路など 433ms
Render: 15_29103_12904 23006 合計 561ms
GetAllBytes: d:/osmzone/japan/13/7276.dat 19ms
OSM.GetOSM3: 715 28062 17670
Render: ready 0ms
15_29104_12901 1
65819
Render: coastline 29ms
Render: Append 34ms
Render: landcover 64ms
Render: waterway 129ms
Render: 道路など 536ms
Render: 15_29104_12901 46447 合計 820ms
GetAllBytes: d:/osmzone/japan/7/113.dat 62ms
GetAllBytes: d:/osmzone/japan/10/909.dat 53ms
OSM.GetOSM3: 1034 16104 7922
Render: ready 1ms
15_29104_12902 1
65819
Render: coastline 28ms
Render: Append 30ms
Render: landcover 54ms
Render: waterway 107ms
Render: 道路など 455ms
Render: 15_29104_12902 25060 合計 571ms
OSM.GetOSM3: 951 16777 9025
Render: ready 1ms
15_29104_12904 1
65819
Render: coastline 40ms
Render: Append 42ms
Render: landcover 59ms
Render: waterway 111ms
Render: 道路など 544ms
Render: 15_29104_12904 26753 合計 652ms
OSM.GetOSM3: 667 34460 27966
Render: ready 1ms
15_29106_12901 1
65819
Render: coastline 33ms
Render: Append 39ms
Render: landcover 77ms
Render: waterway 176ms
Render: 道路など 808ms
Render: 15_29106_12901 63093 合計 1074ms
OSM.GetOSM3: 920 15018 15074
Render: ready 1ms
15_29106_12902 1
65819
Render: coastline 29ms
Render: Append 33ms
Render: landcover 51ms
Render: waterway 94ms
Render: 道路など 532ms
Render: 15_29106_12902 31012 合計 663ms
OSM.GetOSM3: 701 10449 8688
Render: ready 1ms
15_29106_12904 1
65819
Render: coastline 28ms
Render: Append 31ms
Render: landcover 49ms
Render: waterway 83ms
Render: 道路など 342ms
Render: 15_29106_12904 19838 合計 441ms
GPSLog.Load: 23340 12s

沿岸(福井県)では下のように、ノード数が少ない無数のポリゴンが含まれているが、レンダリング時間は2,3倍になる。 大きな比重を占めるのは、ノード数 87346 の巨大ポリゴンであろう。

OSM.GetOSM3: 2241 3809 0
Render: ready 0ms
87346 8 13 6 6 6 9 9 9 10 8 9 9 8 11 8 8 11 12 11 10 8 8 9 9 8 9 8 8 8 7 7 8 8 11 8 5 10 9 8 7 8 14 8 10 9 5 10 7 8 15 8 5 8 7 7 20 8 8 11 8 7 8 9 10 9 9 7 7 10 10 12 11 8 6 8 15 6 6 7 6 7 7 7 7 8 5 6 8 7 8 15 6 8 7 9 6 14 7 6 7 6 5 7 6 6 8 7 8 6 6 8 7 8 9 5 7 9 8 9 7 42 8 15 12 8 6 7 7 8 6 15 7 6 7 6 6 8 5 7 7 6 19 7 10 9 8 8 6 7 6 10 7 6 6 12 10 7 7 6 8 6 7
Render: coastline 34ms
Render: Append 34ms
Render: landcover 48ms
Render: waterway 54ms
Render: 道路など 62ms
Render: 10_898_401 6050 合計 72ms
OSM.GetOSM3: 3528 10943 0
Render: ready 0ms
87346 9 8 7 13 8 14 10 7 6 10 6 12 10 8 8 16 11 20 7 12 7 21 6 7 7 7 10 10 15 8 8 12 11 6 8 6 10 8 12 11 10 8 13 7 8 8 23 8 16 14 9 9 7 6 6 14 8 10 8 6 9 7 7 9 8 7 21 22 7 7 13 7 7 6 17 10 7 8 5 7 5 6 7 6 10 7 6 12 5 8 18 10 6 6 6 6 7 10 7 5 7 6 8 7 8 7 7 22 7 13 6 6 7 8 9 7 11 9 7 6 5 7 6 7 6 10 8 23 13 9 7 13 7 10 7 6 5 11 8 8 8 8 10 10 7 8 10 10 6 6 8 8 20 6 8 7 8 9 10 8 7 7 9 8 9 6 9 10 9 9 7 18 9 9 9 10 9 11 9 10 8 9 8 6 9 8 8 6 9 10 8 7 10 8 9 7 7 7 10 11 7 8 15 9 7 9 8 12 8 10 8 9 10 7 15 7 10 7 11 12 9 9 7 10 6 7 7 7 8 8 9 10 13 9 9 8 7 6 7 7 10 9 9 6 10 10 7 7 9 7 8 6 7 9 8 8 10 7 9 8 9 12 8 7 6 8 9 8 6 7 6 6 10 7 10 6 33 14 7 10 10 11 7 8 7 11 7 7 5 7 6 9 9 7 7 7 8 11 7 8 8 7 8 6 7 8 7 5 8 8 7 8 6 8 7 6 7 8 6 8 13 7 6 7 6 6 8 6 8 9 7 12 7 6 9 7 5 7 9 18 8 16 23 25 5 9 7 18 7 7 9 5 7 19 7 15 6 15 6 21 17 7 5 8 8 7 11 9 7 9 11 10 12 7 8 9 9 11 16 9 17 26 11 9 7 9 12 6 6 8 11 15 11 7 6 8 9 9 16 6 14 7 5 9 7 6 8 8 7 6 8 7 6 9 7 8 8 8 7 7 8 8 6 8 7 10 6 6 6 4 7 9 4 9 6 5 6 8 6 4 6 7 8 7 6 7 9 8 6 7 9 6 11 7 6 6 9 8 8 8 7 7 7 7 9 9 8 7 7 8 8 7 6 5 7 8 7 8 5 7 8 6 7 7 6 9 7 7 6 8 6 4 5 6
Render: coastline 50ms
Render: Append 52ms
Render: landcover 79ms
Render: waterway 94ms
Render: 道路など 112ms
Render: 10_898_402 14471 合計 139ms
OSM.GetOSM3: 4732 37913 0
Render: ready 0ms
87346 7 7 9 7 8 9 8 7 10 8 9 9 8 12 6 9 8 10 8 8 8 8 10 14 24 30 17 16 5 12 13 10 9 9 8 11 15 48 10 22 9 8 9 10 7 6 6 6 5 5 5 4 4 6 4 8 8 8 9 6 7 7 7 9 8 8 9 7 10 11 8 13 7 10 6 6 11 14 8 8 8 6 9 8 6 6 6 5 7 15 42 17 9 9 7 23 10 7 10 7 9 7 12 6 10 11 12 17 6 8 7 6 6 5 10 10 4 9 6 6 10 9 10 13 9 11 9 623 6 7 10 10 10 11 8 9 12 7 11 13 14 10 10 11 9 9 6 11 9 10 7 8 12 5 9 7 12 7 6 10 12 6 9 7 13 8 8 7 15 9 8 8 20 9 13 20 8 6 15 6 16 8 9 9 7 7 9 8 8 12 16 9 14 50 10 9 8 19 15 34 8 6 40 15 8 9 14 7 11 10 10 6 7 6 9 5 17 15 9 8 9 13 8 8 7 7 7 9 5 8 8 8 7 7 5 6 7 6 5 6 10 8 7 30 6 8 9 6 6 8 6 8 6 7 9 9 8 6 7 7 8 8 9 6 6 8 6 8 10 11 6 8 17 9 7 21 6 14 9 11 14 6 13 15 7 9 15 7 7 11 18 16 12 12 15 10 5 9 5 6 7 19 7 8 7 212 8 9 15 9 8 8 8 16 7 9 13 7 6 17 15 8 8 8 20 11 10 9 7 6 10 7 7 8 6 8 7 9 8 8 30 13 12 8 10 18 13 15 7 9 8 8 6 9 17 15 8 6 10 21 7 6 7 7 9 8 11 10 15 12 10 9 6 7 8 7 8 9 16 8 7 10 14 10 10 6 7 8 7 7 6 6 7 10 8 15 10 4 19 9 17 7 16 7 18 9 5 11 7 6 8 7 8 9 8 6 6 8 7 7 7 6 11 7 7 9 9 10 8 9 9 8 7 9 9 9 8 9 9 9 9 9 8 8 8 9 9 8 9 9 9 9 9 9 9 8 8 10 9 9 10 8 13 9 8 9 8 7 8 7 7 9 8 9 9 9 8 7 9 8 9 6 8 7 13 19 9 9 7 16 8 6 7 8 8 10 8 9 6 7 6 5 9 9 9 7 8 9 8 6 9 9 8 8 7 9 8 7 8 8 9 9 9 9 10 14 9 8 7 9 8 11 9 7 8 9 8 9 8 10 9 10 8 7 8 10 8 8 15 7 9 9 8 9 8 7 9 7 7 9 10 9 11 11 15 8 10 15 8 6 8 8 8 13 17 7 9 9 8 16 6 6 8 12 7 8 9 8 8 7 9 8 8 8 8 9 8 8 7 10 7 8 8 8 9 15 7 7 8 12 12 8 9 10 8 7 9 8 7 8 7 8 7 7 8 9 7 9 7 7 9 9 8 7 8 12 7 7 8 7 8 7 8 8 7 10 8 8 7 5 8 9 9 11 8 10 9 9 9 8 8 9 9 9 8 8 9 8 10 7 9 6 8 8 8 7 9 7 8 14 7 25 7 7 7 7 6 8 7 8 7 8 9 10 9 9 9 7 12 9 7 7 9 9 9 8 9 8 10 8 8 9 8 8 8 9 8 9 9 9 8 9 8 10 6 9 9 7 10 10 7 9 9 9 8 8 8 9 9 9 7 9 7 7 8 9 9 8 7 8 6 9 9 9 7 8 8 11 9 9 8 6 7 6 6 8 9 9 12 5 9 9 8 9 8 8 9 8 8 9 10 7 9 7 7 7 7 7 9 10 23 21 11 6 6 6 6 6 6 8 6 7 8 7 6 6 6 7 6 8 5 7 7 8 6 9 6 11 7 8 5 7 6
Render: coastline 80ms
Render: Append 86ms
Render: landcover 155ms
Render: waterway 225ms
Render: 道路など 294ms
Render: 10_898_403 42645 合計 449ms

A.リファレンス

[1] Data Derived from OpenStreetMap for Download
[2] [C# GIS]SharpMapでシェープファイルの情報を読み取ってみる
[3] QGIS を使ってシェープファイル(Shapefile)を CSV に変換する方法
[4] Daylight Coastlines

B.来歴およびノート

2021.12.11