「川と流域地図タイル」のレシピ その1

前にブログに書いた軽い気持ちで始めた「川と流域地図」、現在も絶賛開発中なのですが、どんなことをやっているのか、この1ヶ月ほどで泥縄で身につけた現時点でのあれこれをちょっとまとめてみようと思います。

そもそも何を作っているの?

「地図タイル」とか「マップタイル」と呼ばれるいろんな縮尺で作成した小さな画像ファイルに分割された大量の地図画像を作成しています。
具体的にはこんなの。

こういう、地図を小さく分割した画像ファイルを決まったディレクトリ・ファイル構成に従って作成すると、GoogleMapsのようなスムーズに操作が可能なWeb地図として公開できたり、あるいはカシミール3Dみたいなツールから参照できたりと、利用者が活用しやすい形でネット上に地図を公開することができるわけです。

どうやって作るの?

現在公開しているバージョンの川と流域地図は200万枚以上の画像ファイルで構成されていてこれを人の手で1枚1枚作るというのはあまりにも非現実的、そもそも地図画像自体どうやって作るのか作り始めるまでは想像もできませんでした。ところが、現在、地理情報関係のオープンソースソフトウェア(FOSS4Gと呼ばれてます)がかなり充実してきていまして、それらをうまく使ってみると意外と簡単に地図タイルを作り出すことができちゃったりするんですね。
何はともあれどんなものを使ってどういう風に作っているのか、ちょっと図にまとめてみました。

地図タイルの制作工程の中で核となるツールが図中下段にある「QGIS」と「TileMill」です。

QGISプロジェクトへようこそ!
http://qgis.org/ja/site/

QGISオープンソースマルチプラットフォームGISソフトウェアで、具体的にはShapeファイルという形式で提供される「国土交通省・国土数値情報ダウンロードサービス」の流域と河川のデータについて編集や演算、参照するために使用しています。このQGISですが日本語化もきちんと対応されていて、また、解説書関係も結構充実しているので、わりととっつきやすい状況になっていると思います。地図タイル抜きにしても一度触れてみるとこんなものがあったんだ…!って結構びっくりすると思いますよ。

QGIS入門 第2版

QGIS入門 第2版

そしてこのShapeファイルから地図タイル画像を生成するのがTileMillです。

TileMill | Mapbox
https://www.mapbox.com/tilemill/

CartoCSSと呼ばれるweb開発でおなじみのあのCSSみたいな言語で「川の色は青色で、水系の境界線は黒の太線、流域面積が小さい川はzoomレベルが10以上の場合だけ表示…」みたいな地図のスタイルを記述していくと、Shapeファイルなどの地理データから画像を生成することができます。ただ、QGISではマウスでぽちぽちクリックすればそういう指定ができちゃうんですけど、TileMillの場合テキストエディタが提供されるだけで1行1行CartoCSSの書式を記述する必要があります。まあ、でも、それほど難しい感じではなくて

LearnOSM
http://learnosm.org/ja/map-design/tilemill/

の解説読んでサンプルの地図のコードをあれこれいじってみたりしているうちに結構簡単に理解できるんじゃないかなと思います(できました)。
ちなみにCartoCSSの条件指定はQGISのそれに比べるとかなり非力で、そういう書式を実現させたい場合あらかじめQGISなどで条件に合うかどうかのフラグ項目を作成したりするなどの下準備をしてTileMillで処理できるshapeファイルを用意する必要があります。QGISとTileMillの二つのツールを行ったり来たりしてるうちに地図ができあがっていく感じでした。
さて、TileMillで生成されるファイルはmbTilesという形式のファイルで、一般のWebサーバで公開するにはここからpngjpegファイルを取り出してあげる必要があります。その変換を行うのがmb-utilというユーティリティ、Pythonが動く環境が必要です。

GitHub - mapbox/mbutil: Importer and Exporter of MBTiles
https://github.com/mapbox/mbutil

このユーティリティを使うときちんとルールに従ったディレクトリ構成の大量の画像ファイルが生成されるので、そのままWebサーバで公開すれば良いのですが、なにぶんファイルが大量にあってそこらへんを考慮したWebサーバのチューニングしないといけないんでしょうけど、まだそこまで手が回ってません。
さて、基本的にはこれらのツールを使いこなせば個人でも地図タイルをわりと簡単に作成することできる感じなのですが、今回の川と流域地図の場合、国土数値情報の提供する「流域メッシュ」データの品質に問題があっていろいろ手を入れないと欲しいデータが得られない感じでした。そのためにデータを直接プログラムで操作する必要が生じたのですが、そこで登場するのがgeoJSONです。

GeoJSON フォーマット仕様
http://s.kitazaki.name/docs/geojson-spec-ja.html

geoJSONはshapeファイルなどと同じ地理情報を取り扱うためのファイルフォーマットなのですが、shapeファイルと大きく違うのはその名の通りJSONフォーマットのテキスト形式なファイルなんです。つまり、最近の各種プログラム言語なら大体サポートしてるであろうJSONファイルのライブラリを使用してデータの処理ができるんですね。さらに、QGISはgeoJSONに対応しているので、読み込ませたり逆に出力したりすることができるわけです。この使い慣れたプログラム言語使ってデータを直接編集できるというのは制作環境として非常に強力でした。
というわけで、地図タイル制作のざっくりとした話を書いてみました。地図タイル自体はまだまだ開発中でして、僕も1ヶ月ほど前にゼロから始めたものなのでいろいろあれな点もきっとあるんだろうなーとは思いますが、一応最初から最後まで出来たことのマイルストーンみたいな感じでまずまとめてみました。次回は「流域メッシュ」に手を入れたあれこれの話を書こうと思います。