玄天黄地

学生時代、箸にも棒にも掛からなかったアホの子が、やっと普通のアホになれるか?

QGIS Dufour でレンダリング

 初心者にも優しいGISであるQGIS、最新版(CodeName Dufour, ver.2.0.1)になってさらに使いやすくなりました。この項では、そのうち、QGISレンダリング機能について紹介します。
 地図のレンダリングは、例えば書籍【Infographics】や【Illustrator で地図を表現する3行レシピ】など、既にいくつか良書があります。Illustratorを使えば様々なレンダリングができたとしても驚くべきことではありません。それを、QGISでどこまでできるか、が本稿の主眼です。


 図1は地理院地図です。地理院地図は平成25年10月30日からウェブ公開されています。この地理院地図の公開にあたっては、内部処理でOpenLayersが利用されていますので、外部からのアクセスがしやすくなりました。私は既に11月1日のFOSS4G TokyoにおけるLightning Talkで、QGISのOpenLayersPluginを用いてQGIS上で地理院地図を表示させる方法について話しました(図2)。

この方法では、予め地理院レンダリングしたタイル画像を順に読み出して配置しているに過ぎません。これをベクタデータ(shapeファイル)でどこまで再現できるかが今回の勝負です。
 地理院地図は、地理院が無償公開している基盤地図情報よりも明らかに詳細なデータを使用しています。完全に同じものではないのですが、国土基本情報というものがあり、標準地域2次メッシュ単位で170円で販売されています。試しにつくばエリアを2メッシュほど購入してみました。各メッシュはShapeファイルで350Mbytesほどあります。販売データには、位置情報以外の情報は何も付与されていません。つまり、建物記号や土地利用記号などのシンボルデータ、個々のshapeの色、線幅などの情報も付与されていません。従って、これをいきなりQGISで開くと、図3のように悲惨なことになります(笑)。

 最初はレイヤがアルファベット順に並んでいるので、上から順に一つずつプロパティを確かめて線幅、塗りつぶし色、透明度などを順番に設定していきます。その過程で、上下関係を入れ替えた方が良いレイヤも幾組かありますので、入れ替えていきます。レイヤの上下関係は、おおざっぱに言って、

  1. 注記、点図形、線図形、面図形の順
  2. 人工物、自然物、仮想物の順

という原則に従いますが、強調対象が何かによっては多少順序が入れ替わることもあります。このあたりは、昔の紙地図原図(つまりマイラと呼ばれたフィルム)の重ね合わせ順序と本質的に似ています。その上で、他の地物と表示の強さについてバランスを考慮する必要があります。色の濃淡を何度も微妙に変更する必要があり、しかも一箇所いじると他のレイヤも変更したくなります。ともかく、ある程度試行錯誤を繰り返してできたのがこの図4です。

 図4はまったく自己流の色設計ですが、こういうレベルまで来ると、既存の地図の真似がしたくなります。で、地理院地図の真似をしてみたのが図5です。図1と比べると、完全には一致していないことが分かりますが、それでも図1と並べなければかなり近いイメージになっています。ちなみに、基盤地図情報ではここまでの絵は出せません。そもそもレイヤ数もずっと少ないです。

 さて、地図レンダリングにあたって、図5は図4より少しだけ工夫していますので、そのあたりを説明します。
 まず道路です。図5の道路は、図1の道路と同様に、道路種別で色を塗り分けた上で、道路の幅員に応じた表示となっています。QGIS Dufourでは、道路縁と道路中心線を使っています。道路縁は、文字通り道路縁を高い位置精度で取得して得られるベクタデータです。道路中心線は、道路縁よりは若干位置精度は低いと推定されますが、道路のネットワーク構造を考える場合に欠かせないベクタデータです。道路の属性(国道、都道府県道、市町村道、高速道路などの種別と、幅員区分)は、道路中心線の方に付与されています。
 図5では、1) 道路縁を道路中心線より優先させて描画することとした上で、2) 道路中心線はライン属性を二重とし(図6)、3) 下側属性を道路幅員で分類して線幅を決め(図7)、4) さらに線の色を道路種別で分類し(図8)、5) 上側属性として細い線を表示する(図9)、という段階を踏んでいます。ここで、3)4) と二種類の分類を続けてできる点が最新版のQGIS(Dufour, ver.2.0.1)の特徴です。Wroclaw(ver.1.7.4)まではこのような機能はありませんでした(私は日本語環境が不安だったver.1.8は使っていません)。特に、図8で示す case when – then – else – end 文の威力は大きいと思います。これがある御蔭で、道路縁の内側を幅員に応じて塗りつぶすことができ、その際の色を道路種別に応じて変更できているのです。図5では、画面中央の新井付近で県道(黄色)が細い川を横切っています。この黄色い帯がなければ、道路の路面も河川の青が表示されてしまいます。




 ただし、道路中心線の幅員区分は5段階に分類されているだけなので、道路中心線の幅員区分から機械的に発生させた幅広の着色線は道路縁の位置とはぴったり一致してくれません。これは、表示縮尺を一桁拡大してみればよく分かります(図10)。位置精度に拘らないレンダリングをしたい場合は、道路縁を表示させるのではなく、道路中心線に3番目のライン属性を設け、先ほどの?で下側属性を道路幅員で分類して線幅を決めたのと同様に、そのさらに下側に道路幅員で分類してやや太めの線幅の線を灰色や茶色で引く手法もあります。これでも完全には解決しませんが、その例を念のために示します(図11)。


 このほか、【樹木に囲まれた居住地】というポリゴンがあります。これは、集落を含むようなポリゴンで、内部に何軒かの家屋があり、数本の道路が通っています。このポリゴンは薄い色で表現しますが、建物や道路が不明瞭になってはならないので、低めのコントラストで最下層のレイヤとして配置することになります(図12、薄いオレンジ色のポリゴン)。

 このように、QGIS Dufourは地図レンダリングエンジンが大幅に強化されたことがわかります。ここまで凝ったレンダリングをする場合は、設定にそれなりの時間を要します。せっかく位置精度の高いデータを配布しているわけですから、標準的な線属性も.qmlなどで一緒に配布するのも面白いかも知れません。ただし、.qmlだけではレイヤの上下関係は指定できないので、実際には.qgsで配布する方が良いことになります。すると、QGIS専用の設定となりますので、地理院配布よりもOSGeo.jpなどサードパーティ配布の方が適していると言えます。
 さて、ここまでレンダリングしてみると、国土基本情報の側にさらに注文したいことが見えてきます。例えば、実際の道路に工事その他による変更があった場合、道路縁や道路中心線は細かいセグメントに分割されます。しかし、ネットワーク解析を行う場合には、細かいセグメント分割は不要です。従って、交差点から次の交差点までは1路線1セグメントである方が有難いことになります(これは、QGISの上でユーザが加工することも不可能ではありませんので、国土地理院の宿題だとは言わないことにしておきます)。また、道路縁には不可視属性のフィールドがあり、これが1の場合は表示しない扱いとするべきですが、不可視属性をもつセグメントは実際よりも長めであるように思えます。あるいは盛り土の法面情報が不十分なのかも知れません。このあたりは属性情報をどこまで正確に取得するかという話になります。位置精度も位相精度も間違ってはいないので、微妙な話です(この場合も、QGISの上でユーザが加工することで、不可視属性を持つセグメントの長さをクリップすることは可能です)。

 ここまで、QGIS Dufourがレンダリングエンジンとしても使えることを見てきました。ここまでできるとなれば、これまでIllustratorで行っていた地図レンダリングのかなりの部分をQGISでもできることになりますので、これまたプロプライエタリソフトの初級〜中級の部分をFOSS4Gが置き換え可能になる良い例と考えます。地図データを大規模配信する場合は、現時点ではMapServerやGeoServerを(PostGISなどと組み合わせて)使うのでしょうけど、MapServerの設定をどのようにするか、アタリを付けるレベルであればQGISで簡便に確認できるような気がします。Dufourはこういう点でも今までのバージョンから大きく進化しており、まさにメジャーバージョンが2に上がっただけのことはあると考えています。