国土地理院は「ベクトルタイル提供実験」を行っており、地理院地図 (情報 > 表示できる情報 > 提供実験) で実験中の何種類かのベクターデータ (線、点) を閲覧することができます。ベクタータイルデータを表示するためのソースコード等も GitHub のリポジトリで公開されており、それらを参考にすれば、同実験で公開されているものと同等のウェブアプリケーションを作成するのは難しくありません。
FME ユーザーとしては、地理院地図に表示されるベクターデータが、どのように作成されたかの方に関心があります。「ベクトルタイル提供実験」で提供されているデータは、ウェブマップタイルの単位で作成されている GeoJSON ファイルのセットですが、はじめからそのような形態で作成された地理情報データセットは、まず存在しないでしょう。国土地理院の実験と同様の手法でベクターデータを提供するプロジェクトでは、既存のベクターデータセットをウェブマップタイル単位のデータファイルのセット (ここでは「ベクタータイルデータ」と呼ぶことにします) に変換するプロセスが必要になるはずであり、その部分では FME が活用できるかも知れません。
そのようなデータ変換を行うワークスペースを容易に作成できるよう、カスタムトランスフォーマー WebMapTileClipper を作成し、FME Store で公開しました。このトランスフォーマーは、パラメーターで指定したズームレベルのウェブマップタイルによって入力フィーチャーのジオメトリをクリップし、クリップ後のフィーチャーにズームレベルとタイルインデクスを格納した属性を付加して出力します。
ここでは、WebMapTileClipper を使って国土数値情報で提供されているダムデータ (Esri Shapefile 形式ポイント) をズームレベル10のタイルでクリップし、GeoJSON 形式のベクタータイルデータに変換するワークスペース例を掲げます。
※FME Store で公開されているカスタムトランスフォーマーは、FME Workbench の Transformer Gallery (FME Store フォルダ) に格納されており、標準のトランスフォーマーと同じ操作で任意のワークスペースに追加、利用できます。
FME 2016.0.1.0 build 16174
FMEワークスペース例
[ESRISHAPE] リーダー: Esri Shapefile 形式の国土数値情報ダムデータ (ポイント) を読み込む。
WebMapTileClipper (FME Store): ズームレベル10のウェブマップタイルによってダムデータをクリップする。
Reprojector: WGS 84 緯度経度に座標変換する。
SubstringExtractor: 竣工年属性 (年月日文字列) を「年」のみの文字列 (先頭4桁) に変換する。
[GEOJSON] ライター: GeoJSON 形式でファイルに出力する。
ウェブマップタイルでクリップされたフィーチャーをベクタータイルデータとして使用するには、ズームレベル、タイルインデクスによって識別できるファイルパス (URL) に振り分けて出力する必要があります。地理院地図の「ベクトルタイル提供実験」では、次のようなファイルパスが使用されています。
<ルートフォルダ>/<データ名>/{z}/{x}/{y}.geojson
{z}: ズームレベル
{x}: x 方向のタイルインデクス (西から東に向かって増える方向)
{y}: y 方向のタイルインデクス (北から南に向かって増える方向)
WebMapTileClipper はクリップ後のフィーチャーに次の3つの属性を与えるので、ライターの Fanout Dataset (出力先データセットの振り分け) 機能を使い、これらの値に基づいて各フィーチャーの出力先ファイルを適切に決定することができます。Fanout Dataset の設定方法については後述します。
_zoom_level: ズームレベル
_tile_column: x 方向のタイルインデクス
_tile_row: y 方向のタイルインデクス
WebMapTileClipper に入力するフィーチャーには適切な座標系が設定されている必要があり、また、出力フィーチャーには EPSG:3857 (Spherical Mercator) 座標系が設定されます。国土数値情報 (ダム) データ (Shapefile 形式) には座標系が定義されていないので、リーダーの Coordinate System パラメーターによって LL-JGD2K (JGD2000緯度経度) を設定するとともに、クリップ後のフィーチャーについて、Reprojector によって WGS 84 緯度経度に座標変換を行いました。
結果: ウェブアプリケーションによるダム地点の表示例
地理院地図「ベクトルタイル提供実験」と同様に、Leaflet ライブラリ、および Leaflet GeoJSON Tile Layer プラグインを使用した JavaScript アプリケーションです。ズームレベル10以上のときに、上記ワークスペースによって作成したベクタータイルデータに基づいてダム地点を示すマーカーを表示します。
ベースマップ: OpenStreetMap
※ローカルサーバーでのテスト結果をキャプチャしたものであり、インターネット上では公開していません。
Fanout Dataset の設定
Workbench の Navigator ウィンドウで、ライターの Fanout Expression パラメーターにフィーチャーの属性値を使った文字列式として出力先のデータセット名 (ルートフォルダ以下のファイルパス) を設定することにより、それらの属性値に応じて異なるデータセット (ファイル) にフィーチャーを振り分けて出力することができます。
このワークスペース例では、WebMapTileClipper がクリップ後のフィーチャーに与えたズームレベル、タイルインデクスを使い、国土地理院「ベクトルタイル提供実験」の方式に準じて次のようなファイルパスを設定しました。
ksj_dam/@Value(_zoom_level)/@Value(_tile_column)/@Value(_tile_row).geojson
"@Value(属性名)" は、ワークスペースの実行時にその属性の値に置き換わります。
ディスクシステムには、次のようなフォルダ階層による GeoJSON ファイルのセットが作成されます。
Fanout Dataset は複数のデータセットにフィーチャーを振り分けて出力するための簡便なオプション機能ですが、このオプションを使用するライターは、受け取ったフィーチャーをキャッシュし、すべてのフィーチャーが到着してからファイルへの出力を始めるので、メモリ使用効率が良い仕組みではありません。また、WebMapTileClipper の処理内容でも、フィーチャーをメモリに一時的に格納する部分があります。
国土数値情報でデータが提供されているダム数は全国で 3000 箇所程度に限られており、また、この例ではズームレベルが大きくない (タイル数 = ファイル数が少ない) ので、Fanout Dataset を使ったひとつのワークスペースによって全国分のデータを一括して処理することができました。しかし、データ量が多い、あるいはズームレベルが大きい場合には、この方法では極めて効率が悪くなったり、メモリオーバーフローによって変換が失敗したりする可能性があります。
実務上は、ソースデータの規模や提供形態に応じて妥当な方法を検討する必要があります。例えば、ソースデータがメッシュ区画あるいは行政区域の単位で分割したファイルに保存されている場合には、まず、ソースデータのファイルの単位でクリップ処理を行い、ズームレベル、タイルインデクスを含めてクリップ後のフィーチャーをデータベースに格納しておき、その後、バッチ処理によってタイル (あるいは一定の範囲のタイルのグループ) ごとにデータベースからデータを抽出して GeoJSON 形式に変換・出力するという二段構えのアプローチが良さそうです。
データベースにデータを格納しておくと、ソースデータの一部に変更があったときに該当するタイルのみを更新する仕組みを作ることも容易になり、データの保守の面でも有利であると考えられます。
下の図は、2つのワークスペースによって、基盤地図情報ダウンロードサービスサイトで2次メッシュ区画単位の GML ファイルによって提供されている等高線データのうち、三宅島周辺4区画分をズームレベル15~18の GeoJSON 形式ベクタータイルデータに変換した実験結果です。
まず、入力ファイル (2次メッシュ区画) の単位でタイルによるクリップを行って、その結果を PostGIS データベースに格納するワークスペースを実行し、次に、タイルごとに PostGIS データベースからデータを抽出して GeoJSON ファイルに出力するワークスペースをバッチ処理で実行しました。この方法ならば、仮に全国分のデータを変換するとしてもメモリオーバーフローが生じることはありません。ただし、今回の実験結果からは、全国分の変換を行うのに要する時間は数日のオーダーになると推測されます。FME による一連のデータ変換プロセスは自動化でき、変換を行っている間に人員を拘束するわけではないので「数日」は許容範囲かも知れませんが、パフォーマンスを改善する余地はまだあります。
基盤地図情報 (基本項目) 等高線 (GML) からベクタータイルデータ (GeoJSON) への変換結果
三宅島周辺2次メッシュ4区画分 (2次メッシュコード: 513903, 513904, 513913, 513914) による実験
・ズームレベル15: 100m 刻みの等高線
・ズームレベル16: 50m 刻みの等高線
・ズームレベル17: 20m 刻みの等高線
・ズームレベル18: 全ての等高線
ベースマップ: 地理院タイル (白地図)
※ローカルサーバーでのテスト結果をキャプチャしたものであり、インターネット上では公開していません。
0 件のコメント:
コメントを投稿