QGISでタイル地図を手抜きで作る方法
WEB地図で使用できるタイル地図を手抜きで作る方法です。
手抜きなのでちゃんと作ってる人に怒られそうな気がしますが、こんな作り方もあるよ、ということで共有しておきます。
まずは作ったものを見ていただきましょう。
OpenLayers3で表示したデモページ
- QGISで調製
- プリントコンポーザを起動
- ワールドファイル付きで出力
-
gdal_translate
でGeoTiffを作る -
gdal2tiles.py
を実行
QGISで調製
適当に調製します。ここでは試しに基盤地図情報10mメッシュ標高データから作成した八溝山の地図を出力します。
なおレイヤーは以下の通り
- 標高
- 陰影図
- 傾斜量図
- Morphometric Protection Index
一番最後のMorphometric Protection IndexはQGISのツールボックスで利用できるSAGA GISで生成できるもので、このレイヤーによって尾根は明るく、谷は暗く表現することができます。
なお基盤地図情報を使って新たに地図を作成しウェブで公開する場合は、測量成果の複製・使用承認の申請が必要です。(正直このデモページもグレーゾーげふんげふん)
プリントコンポーザを起動
QGISの地図を画像やpdfで出力したい場合はプリントコンポーザを利用します。
タイルにしたい範囲を適当に調整し、プリントコンポーザで出力します。
ワールドファイル付きで出力
QGISのプリントコンポーザでは、生成した画像(jpgやtiff)と共にワールドファイルという位置情報を持ったファイルを生成することができます。
ちなみにプリントコンポーザで出力する画像のサイズは紙のサイズ(mm)と解像度(dpi)の組み合わせに依ります。
例えば、A4サイズ(210mm x 297mm)、300dpiでpngファイルを出力すると画像のサイズは2480px x 3508pxとなります。
ここでは適当にA4サイズ、600dpiとしておきます。
地理情報を持たない画像ファイルA.pngとワールドファイルA.pgwが生成されます。
gdal_translate
でGeoTiffを作る
ワールドファイルについてですが、自分もあまりよくわかってないのですが、これによって、地理情報を持たない画像ファイルA.pngは地理情報を持つ画像ファイルとして振る舞うようになります。試しにQGISでA.pngをラスターレイヤーとして追加してみてください。A.pngは地理情報を持っていないにも関わらず正しい位置に配置されるはずです。
GDALのコマンドgdal_translate
でA.pngから地理情報を持つGeoTiffファイルを作成します。
ちょっと待って、A.pngはワールドファイルによって地理情報を持つように振る舞うのだから、この行程必要ないんじゃないの?と思いますが、それだとgdal2tiles.py
が正しく動きません(理由はわからない)。よって必要な行程となります。
コマンドラインを起動します。
gdalinfo --version
と打って、GDAL Frameworksにパスが通ってるかどうかを確認してください。
次にA.pngを保存したディレクトリに移動して、
gdal_translate A.png B.tiff
と打ちましょう。新たに地理情報を持つGeoTiffファイルB.tiffが生成されます。
gdal2tiles.py
を実行
gdal2tiles.py -r "bilinear" -s "EPSG:3857" -z "11-14" B.tiff
オプションの-r
は生成するタイル画像のデフォルトは"average"
ですが、ここでは"bilinear"
(バイリニア法)に設定しています。
続いて-s
というオプションですが、変換元の投影法です。"EPSG:3857"
(Google WEBメルカトル)を設定します。
最後に-z
というオプションですが、これで生成するタイルのズームレベルを指定できます。本来なればインプットする画像(ここではB.tiff)のサイズから画質の劣化なく生成できるサイズを計算し指定するのが望ましいと思うのですが、手抜き法なので適当にズームレベル11から14と設定します。
オプションの詳しい説明はgdal2tilesのドキュメントを参照ください。
QGISで調製した地図を手抜き法でタイルにするのはあまり良い方法ではないかもしれませんが、ワールドファイルを使って地図画像を制御する方法は意外と応用が効くかもしれません。
例えば、
- A4サイズの白地図とワールドファイルを生成
- 白地図に手書きで書き込み
- 白地図の解像度と同じ解像度でスキャン
- ワールドファイルをスキャンした地図に使って
gdal_translate
-
gdal2tiles.py
でタイル化
というようなこともできるのではないかと思います。