2016-09-01

MapnikRasterizer による画像作成 - 基盤地図情報等高線と標高点

複数のベクター、ラスターレイヤを重ね合わせ、ひとつの地図として視覚的に表現することは、GISが得意とするところです。FMEはGISではありませんが、MapnikRasterizer トランスフォーマーによって、GISにも匹敵する高度な地図画像(ラスター)を作成することも可能です。

名前からも分かるように、このトランスフォーマーは Mapnik というオープンソースの地図レンダリング用ツールキットを内部で使用することにより、非常に多彩な表現をサポートしています。

ここでは、基盤地図情報基本項目「等高線」および「標高点」のレンダリングを例として、MapnikRasterizer の基本的な使い方を示すワークスペース例を掲げます。

【ソースデータ】
三宅島周辺の二次メッシュ4区画(513903, 513904, 513913, 513914)について、基盤地図情報ダウンロードサービスサイトからダウンロードした基盤地図情報基本項目の等高線および標高点データ(GML形式)

【変換内容】
等高線をライン、標高点の位置をマーカー、標高点の標高値をテキストとしてレンダリングする。
等高線は「100m間隔」、「50m間隔」、「その他」に分類し、それぞれ異なる色で表現する。
変換結果は、三次メッシュ区画単位でPNG形式のファイルに出力する。

FME 2016.1.1.0 build 16609

FME ワークスペース例





















[GML] リーダー: 基盤地図情報等高線、標高点データ(GML形式)を読み込む。
JpStdGridAccumulator: 入力フィーチャーをカバーする範囲の三次メッシュ区画ポリゴンを作成する。
BoundsExtractor: 各メッシュ区画の東西端、南北端の座標を抽出する。
Clipper: メッシュ区画ポリゴンで等高線、標高点をクリップする。
GeometryFilter: ラインフィーチャー(等高線)とポイントフィーチャー(標高点)に振り分ける。
TestFilter: 等高線を「100m間隔」、「50m間隔」、「その他」の3区分に振り分ける。
MapnikRasterizer: メッシュ区画ごとに等高線(ライン)、標高点(マーカー、テキスト)をレンダリングする。
[PNGRASTER] ライター: メッシュ区画ごとにラスターをPNG形式のファイルに出力する。

基盤地図情報基本項目データはGML形式で提供されており、FMEは基盤地図情報応用スキーマをバンドルしているので、標準のGMLリーダーで直接読み込むことができます。

JpStdGridAccumulator は FME Hub で公開しているカスタムトランスフォーマーで、パラメーターの設定に応じて、入力フィーチャーをカバーする範囲の一次~1/10細分メッシュ区画ポリゴンまたはポイントを作成するとともに、それらにメッシュコードを属性として付加します。この例では、三次メッシュ区画ポリゴンを作成しました。

BoundsExtractor は、各フィーチャーのバウンディングボックス境界の座標を抽出します。この例では各三次メッシュ区画の境界の座標が得られ、それらによって後述の MapnikRasterizer で画像の作成範囲を指定しています。

Clipper によって、等高線と標高点をメッシュ区画ポリゴンでクリップしました。このとき、Clipper のパラメーター設定画面で Merge Attributes(属性を結合する)オプションをオンにすることにより、メッシュコードやバウンディングボックス境界座標を格納したメッシュ区画ポリゴンの属性が、区画ごとにその内部となる全ての等高線、標高点に結合されます。

GeometryFilter でフィーチャーの流れをライン(等高線)とポイント(標高点)に分岐した後、等高線についてはさらに、TestFilter によって、各フィーチャーが持っている標高値(alti属性の値)に応じて「100m間隔」、「50m間隔」、「その他」の3区分に振り分けました。

MapnikRasterizer には、必要に応じて任意の数の入力ポートを追加することができ、ポートごとに、そこから入力されるフィーチャーに対するひとつ以上のレンダリングルール(視覚的な表現方法)を設定することができます。

レンダリングルールの設定内容は多岐にわたります。主なものだけ挙げると、ラインについては線幅、色、ダッシュスタイル(実線部の長さ、間隔の任意の繰り返しパターン)など、マーカーについてはサイズ、色、あるいは外部画像ファイルなど、テキストについてはフォント、サイズ、色、ポイントに対する相対的な位置などです。

MapnikRasterizer パラメーター設定画面









































ソースデータ(二次メッシュ4区画)のうち、等高線、標高点が存在する三次メッシュ区画数は70でした。そのうち、雄山(おやま)火口周辺の次の9区画(下記)の画像をモザイク(結合)した結果を示します。
5139-14-11, 5139-14-12
5139-14-01, 5139-14-02
5139-04-91, 5139-04-92
この画像の解像度は、上記 MapnikRasterizer での設定と同じ(三次メッシュ1区画あたり1200 x 800ピクセル)です。ただし、ファイルサイズを小さくするため、パレット(エントリー数=16)つきの1バンドラスターに変換しました。ピクセル等倍でご覧になるには、ダウンロードして適当なビューアーで開いてください。







































一見、うまくいっているようですが、上記ワークスペース例には、メッシュ区画境界付近で標高点テキストが描画されないことがあるという欠陥があります。上の図では、画像下部、三次メッシュ区画 5139-04-91 と 5139-04-92 の境界付近の 5139-04-91 側、つまり、西側の区画の東端付近にある標高点について、標高値テキストが描画されていません。これは、MapnikRasterizer では、指定した画像作成範囲をはみ出すようなテキストはレンダリングされないためです。

これは、ワークスペースに次のような改良を加えることによって解消することができます。
・MapnikRasterizerによる画像作成範囲を三次メッシュ区画ぴったりの範囲でなく、隣接区画の標高点テキスト描画範囲を含むのに十分な範囲まで拡大する。
・作成するラスターの解像度(縦横のピクセル数)をその範囲にあわせて修正する。
・MapnikRasterizerで作成された画像を、対応する三次メッシュ区画の範囲によってクリップする。

この改良を行うために追加したり置き換えたりするトランスフォーマーは、Scaler, SpatialRelator, ListExploder, JpMeshCodeReplacer (FME Hub) などです。

==========
2016-09-08 追記: クリップではなく、RasterSubsetter によって三次メッシュ区画に相当する範囲のラスターに変換する方法もあり、場合によってはその方が効率が良いかも知れません。
==========

改良後のワークスペースで作成した三次メッシュ区画 5139-04-91, 5139-04-92 の画像をモザイクした結果は次のとおりです。改良前には描画できなかった中央付近の標高値テキスト「723」も描画されました。














MapnikRasterizer は、複数のベクター、ラスターデータをまとめてひとつの地図画像を作成するのに非常に便利なトランスフォーマーですが、現時点では、非ASCII文字を含むテキストのレンダリングについて、MS UI Gothic (Normal) 以外のフォントがサポートされていないという制約があります。

その他のフォント(MS ゴシック、MS 明朝など)での日本語文字の描画が必要な場合、TextAdder 等によってテキストフィーチャーを作成し、さらに TextStroker によってフォントを指定してポリゴンに変換したうえでレンダリングするという代替策はありますが、サイズや位置の調整が少し面倒になるかも知れません。近い将来、MS UI Gothic 以外の非ASCII文字フォントのサポートも追加されることを期待しています。

0 件のコメント:

コメントを投稿