地球地図を利用した地図タイルの作成 - foss4g tokyo 2014 全体セッション2

61
地球地図を利用した 地図タイルの作成 Taro Matsuzawa Georepublic Japan FOSS4G TOKYO 2014 全体セッション2 手軽に使えるグローバル地理空間情報とFOSS4G

Upload: taro-matsuzawa

Post on 08-Jun-2015

1.102 views

Category:

Engineering


12 download

DESCRIPTION

FOSS4G TOKYO 2014の全体セッション2でやった(これから発表する)スライドです。 地球地図をタイル化します。 ただそれだけです。 きっとそれだけです...

TRANSCRIPT

地球地図を利用した 地図タイルの作成

Taro Matsuzawa Georepublic Japan

FOSS4G TOKYO 2014 全体セッション2 手軽に使えるグローバル地理空間情報とFOSS4G

自己紹介• プログラマ

• 過去に某OSSの組で組長をやっていました

• 地理空間情報系の経験は約3年

• 学生時代のアルバイト(馬場さんの元部下)半年

• Georepublic Japan で二年ちょい

• ブレイクコアガチ勢

執筆とか

• Firefox 3 Hacks, Firefox Hacks Rebooted (O’REILLY JAPAN)

• C Magazine

• Software Design

• いずれもFirefoxの話

肩書• Georepublic Japan シニアエンジニア

• 日本UNIXユーザ会理事

• OSMFJメンバー

• OSGeo財団日本支部運営委員<-New

• 株式会社Coaido CTO (副業) <- New

アカウント

• github: https://github.com/smellman/

• Twitter: @smellman

• Facebook: 名前で探せば出てくる

面倒なので 組長と呼ばれてます

専門家?• たまたま国土地理院の「地球地図Web提供用データ整備ツール作成 」を受注できた

• JICAの講習(10/29-30)を担当

• 同じネタを使ってFOSS4G TOKYOのハンズオンを担当(10/31)

• ベースはいずれも国土地理院の案件の知見

今日のトピック• タイルの話

• 地球地図のベクターファイルをタイルにする

• 地球地図のラスターファイルをタイルにする

• タイルを使ったデモ

• 細かいやり方はワークショップのテキストを公開するのでそっちを見て欲しい

ポイント

• 今回の話は地球地図を使っているけど、地球地図以外でも使える話

• タイルを作る勉強用の素材としても地球地図は使える

• タイル仕様をdisる

タイルの話

ややこしいタイル• 有名な仕様が二つある

• TMS, WMTS

• TMSとWMTSは原点が違う

• TMSは左下(数学的)

• WMTSは右上(コンピュータ的)

世界は雑

• TMSもWMTSも面倒

• TMSのY座標を逆にすればよくね?

• Y coordinate flipped

• OpenStreetMap

メタデータなにそれ?• TMSもWMTSもメタデータの仕様がある

• どのようなURLでタイルにアクセスできるか?

• どのようなタイルが利用可能なのか?

• みんなもはや無視してる

• http://…/{z}/{x}/{y}.png でいいだろ

無視した事案

• OpenStreetMap

• メタデータ見たことない

• 国土地理院

• 仕様に見当たらない

本当に欲しいもの

XMLっぽく言うと

我々が必要だったのはWSDLでもSOAPでもなくXML-RPCだった

だろ?

そもそもJSONで?

タイルも二の舞いになってはいけない

xyzタイル

• y coordinate flipped TMS と WMTS がだいたい同じタイルを出している

• 便宜上xyzタイルと呼ぶ

• 今回作るのはこいつ

もういいよこれで

http://portal.cyberjapan.jp/help/development/siyou.html

悪巧み• xyz tileをRFC化

• 4/1にリリースして世界を混乱させよう

_人人人人人人人人_ > タイル三兄弟 < ‾Y^Y^Y^Y^Y^Y^Y‾

タイルを作る

用意するもの• OSGeoLive 8.0

• ベースはこれだけでOK!

• OSGeo4W+Tilemillでも別々に入れてもOK

• batchファイルをいれる必要がある

• tms2xyz.pyというプログラムは別途紹介

ダウンロード• https://iscgm.org/gmd/

ベクタから変換の ワークフロー

ogr2ogr

Tilemill

mb-util

gmlファイルをshpファイルに変換

デザインを作成して、 mbtiles形式でタイルを出力

mbtiles形式のタイルを xyzタイルに変換

mbtiles• MapBoxが作成したタイルの仕様

• SQLiteにタイルを格納するもの

• 取り出しもクエリ吐くだけでよい

• 中身のY座標はTMS準拠

• 作者が後悔してて笑える

• スマートフォンに入れてオフラインマップとかできる

• MapBox iOS SDK, MapBox Android

gmlからshpに変換• ogr2ogrを使って変換を行う

$ ogr2ogr -s_srs "+proj=latlong +datum=WGS84 +axis=neu +wktext" \

-t_srs "+proj=latlong +datum=WGS84 +axis=enu +wktext"

-f "ESRI Shapefile" coastl_lka.shp coastl_lka.gml

Tilemillでデザイン

• Tilemillでshpのレイヤーを追加

• CartoCSSを駆使してデザインをする

• デザインセンスが問われる

コツ• MapBoxにデザイン方法の解説があるのでパクりまくる

• https://www.mapbox.com/tilemill/docs/manual/carto/

• Pointの画像はMakiを利用するとよい

• https://www.mapbox.com/maki/

• zoomレベルによる振り分けは根気よくやる

• 仕様を見ながら表示するものを決める

Tilemillの編集例

Tilemillの編集例

仕様の読み方

mbtilesを出力

mbtilesを出力

mbutilで変換$ git clone https://github.com/mapbox/mbutil.git $ cd mbutil/ $ sudo python setup.py install

$ cd ~/work/lka $ mkdir tiles $ mb-util mbtiles/lka_bnd.mbtiles tiles/lka_bnd

できたものwork/lka/tiles/lka_bnd/9/370/242.png

ラスタから変換の ワークフロー

gdal_buildvrt gdaltraslate

QGIS

gdal2tiles.py

BILファイルからGeoTiffを作成

色付けをしたGeoTiffを作成

GeoTiffからTMSタイルを作成

tms2xyz.py TMSタイルからxyzタイルを作成

GeoTiffを作成• 地球地図で配ってるTiffファイルはgdal2tilesで処理できないのでBILファイルから処理をする

• BILファイルは分割されてるので一つにまとめる

$ gdalbuildvrt --config GDAL_CACHEMAX 2048 \ el_lka.vrt el/globalm/area/raster/el*.bil $ gdal_translate -a_srs EPSG:4326 \ --config GDAL_CACHEMAX 2048 \ el_lka.vrt el_lka.tif

QGISで開く

スタイル付けをする

色付けしたGeoTiff

gdal2tiles.pyを使って TMSタイルを作成

• -r: サンプリング方法

• -e: レジューム

• -z: ズームレベルの範囲

$ gdal2tiles.py -r near -e -v -z 0-11 \ raster/el_lka.tiff tms/el_lka

tms2xyz.pyを使って xyzタイルを作成

• https://github.com/smellman/creating_tiles_with_global_map_support_files

ラスタからの変換時の注意点

• gdal2tilesでたまにコケる

• フィリピンの標高データでひっかかってるのは確認

• gdalwarpで解像度を変更すれば回避可能

• というかgdal2tilesのバグ

デモ

Leafletで表示

とっても簡単var bnd_layer = L.tileLayer( './lka/tiles/lka_bnd/{z}/{x}/{y}.png'); var overlay_layers = { "Boundary": bnd_layer }; L.control.layers(base_layers, overlay_layers).addTo(map);

おまけ

とある質問

• JICAの研修生から質問

• 「なぜコマンドラインのような面倒なものを使うのか?ArcGIS使えばいいのではないか」

使った事ないので 知らない

なぜFOSSで?

• コマンドの方が楽(身も蓋もない話)

• コマンドを使えば繰り返し処理が楽

• OSの壁があまりない(今回のはWindows, Linux, Macで動く)

タイル化の良いとこ

• file urlを使えばローカルで動かせる(PC環境)

• mbtilesを使えば持ち運びはもっと楽

• スマートフォンに地図をいれて調査に出るとか簡単に可能

もっとタイル化• 標高データは上手く加工すれば地理院地図3D的なことも可能

• 標高タイルの分野は結構熱い(Cesium quantized-mesh, heightmap)

• こいつらもTMS準拠でさらにrootが異なるので注意

• 範囲が-90deg ~ 90degなのも注意

タイル化の注意• 世界中を吐き出すと大量のファイルを書き出す

• zoom=18 - 680億ファイルぐらい

• Ext4のデフォルトの限界を超える(40億ファイル)

• ファイルシステムを作るときにファイル作成数及びファイル容量を試算しておく必要がある

gdal2tilesが遅い• 地球地図の全球版のファイルを変換するとすごい時間がかかる

• Core i3+4GB Memoryのマシンで1週間以上かかる

• 遅い理由は分散処理をしてなく1つずつタイルを作るから

高速なgdal2tiles• タイルを作成するプロセスをファイル単位でoffsetを設定して分散化する

プロセス 1 2 3 4

ファイル 0.png 1.png 2.png 3.png

ファイル 4.png 5.png 6.png 7.png

ファイル 8.png 9.png 10.png 11.png

人類のためにgdal2tiles作りなおした方がいい気がする (TMSしか吐かないし!)

以上