読者です 読者をやめる 読者になる 読者になる

smellman's Broken Diary

クソみたいなもんです

Tilemillを使ってGeoTiff形式からタイルを作成する

www.mapbox.com

こちらの記事を応用して、TilemillからGeoTiff形式のファイルを作成してみました。

まず、対象となるファイルを用意します。
今回は地球地図を使いました。

Home - International Steering Committee for Global Mapping

こちらからセルビアのLand Cover(土地被覆)とElevation(標高)のデータをダウンロードします。
作業内容は割愛します。

用意したのはbilファイルなので、これをQGISを使ってGeoTiffファイルに変換します。
やり方はまずラスタレイヤーの追加でbilファイルを開いて、ラスタの変換(形式変換)のメニューを開きます。
mapboxのblogではターゲットのSRSがGoogle Mercator(EPSG:900913)になっていますが、これだとうまくいかなかったのでWGS 84(EPSG:4326)を選択します。
最終的に以下のようなコマンドが生成できればOKです。

gdal_translate -a_srs EPSG:4326 -of GTiff (path to globalmap)/gm-srb-el_2_0/el_srb.bil (path to globalmap)/gm-srb-el_2_0/el_srb.tif

もちろん、gdal_translateをそのまま使うという方法でもよいです。

次にTilemillを起動して初期状態で何もないプロジェクトを作ってから、レイヤーにGeoTiffを追加します。
今回はel_srb.tif(標高データ)を対象にします。
追加するときは以下のことに気をつけてください。

  1. 複数の国などを扱う場合はclassを指定しましょう。今回はelというクラスを追加しています。
  2. SRSは先程WGS 84として作成したのでこれを選びます。
  3. Advancedでは対象となるGeoTiffのbandを指定します。今回は band="1" を指定しています。

以下のようになっていればOKです。

f:id:smellman:20150927003928p:plain

これでSaveをします。
それではスタイルを設定していきます。
今回elクラスに対して設定したスタイルは以下のとおりです。

.el {
  raster-opacity:1;
  raster-scaling:bilinear;
  raster-colorizer-default-mode: linear;
  raster-colorizer-default-color: transparent;
  raster-colorizer-stops:
    stop(-9999, #284eb0)
    stop(-9998, #55B499)
    stop(-1000, #4CB896)
    stop(-500, #57BA8A)
    stop(-200, #58BE7E)
    stop(-100, #59C272)
    stop(-50, #5AC666)
stop(-25, #5BCA5A)
stop(-10, #5CCE4E)
stop(-5, #5DD242)
stop(0, #62DD34)
stop(10, #67E037)
stop(25, #6CE33B)
stop(50, #71E73F)
stop(75, #7DEB44)
stop(100, #88F048)
stop(125, #94F54E)
stop(150, #A1F457)
stop(175, #AFF266)
stop(200, #BCF071)
stop(225, #C2EE75)
stop(250, #C9EC78)
stop(275, #CFE97D)
stop(300, #D9E682)
stop(350, #E4DB8E)
stop(400, #EED89A)
stop(450, #ECD18D)
stop(500, #EACB81)
stop(600, #E8C474)
stop(700, #E5B95F)
stop(800, #E1AD4B)
stop(900, #DEA236)
stop(1000, #CD9633)
stop(1500, #BD8A30)
stop(2000, #AC7E2C)
stop(3000, #9C7229)
stop(4000, #896527)
stop(5000, #765825)
stop(6000, #644A23)
stop(7000, #513D22)
stop(9988, transparent)
stop(10000, transparent)
}

かなり長いのですが、二つに分けて解説します。

まず、最初の部分で基本的な設定を行っています。

  raster-opacity:1;
  raster-scaling:bilinear;
  raster-colorizer-default-mode: linear;
  raster-colorizer-default-color: transparent;

ここではレイヤーを不透明にして、レンタリング時のscaleをbilinearにしてなめらかにしています。
raster-colorizer-default-modeはlinearを設定してあとで設定するraster-colorizer-stopsでグラデーションになるようにしています。
raster-colorizer-default-colorは基本の色を指定しているのですが、ここでは透明色を指定しています。

次のstopsが厄介です。

  raster-colorizer-stops:
    stop(-9999, #284eb0)
    stop(-9998, #55B499)
    stop(-1000, #4CB896)
    stop(-500, #57BA8A)
    stop(-200, #58BE7E)
    stop(-100, #59C272)
    stop(-50, #5AC666)
stop(-25, #5BCA5A)
stop(-10, #5CCE4E)
stop(-5, #5DD242)
stop(0, #62DD34)
stop(10, #67E037)
stop(25, #6CE33B)
stop(50, #71E73F)

raster-colorizer-stopsはtagとしてstopを連続して与えていくことになります。
この時二つのstop間の値がグラデーションになるようにしているという定義になります。
詳しいことraster-colorizer自体の説明はMapnikのWikiのRasterColorizerを参照としてください。
ちなみにCartoCSSの公式ドキュメントではここらへんまだ記述されていませんw

github.com

上手くスタイル付けができると以下のようになります。

f:id:smellman:20150927005006p:plain

あとはTilemillでmbtiles形式にexportして、mbutilを使ってmbtilesをzxy形式にバラしてあげればよいです。

github.com

スタイリングのコツとしては標高データのようなグラデーションのものと値がそのまま色になるものの設定を使い分けるのが重要です。

Land Cover(土地被覆)では値がそのまま色になるべきなので、以下のようにしています。

.lc {
  raster-opacity:1;
  raster-scaling:near;
  raster-colorizer-default-mode: exact;
  raster-colorizer-default-color: transparent;
  raster-colorizer-stops:
	stop(0, #000000)
	stop(1, #003200)
	stop(2, #3c9600)
	stop(3, #006e00)
	stop(4, #556e19)
	stop(5, #00c800)
	stop(6, #8cbe8c)
	stop(7, #467864)
	stop(8, #b4e664)
	stop(9, #9bc832)
	stop(10, #ebff64)
	stop(11, #f06432)
	stop(12, #9132e6)
	stop(13, #e664e6)
	stop(14, #9b82e6)
	stop(15, #b4fef0)
	stop(16, #646464)
	stop(17, #c8c8c8)
	stop(18, #ff0000)
	stop(19, #ffffff)
	stop(20, #5adcdc)
	stop(255, transparent)
}

raster-scaling を near に、 raster-colorizer-default-mode を exact にすると綺麗にでます。

これらの違いはQGISで色付けするとき(qmlファイル)にも使いますが、僕の方でJICAの講習用にQGISのスタイルデータを公開しています。

github.com

これらのスタイルをstopに変換する簡単なワンライナーを作っています。


One Liner to get raster-colorizer-stops tags from ...

もし、QGISで色付けをしている資産がある人はこちらも試してみると良いと思います。