マピオン的Webメルカトルなタイルの作り方
株式会社マピオン
松浦 慎平
Webメルカトルなタ
イル
はじめました
まだ、スマホだけですが
(Androidのネイティブアプリは除く・・・)
お伝えしたい事
専門の企業じゃなくても地図タイ
ルが作れる時代になっている
● タイル生成時のちょっとしたコツ
を共有してもっといろんな地図を
世にだしていっていただきたい!
●
タイル仕様
投影法 = EPSG: 3857 ( 900913 )
タイル
zoom: 0

zoom: 1

256px

256px

0,0

zoom: 2
256px

256px
256px

0,0

1,0

0,1

1,1

256px

0,0

1,0

2,0

3,0

0,1

1,1

2,1

3,1

0,2

1,2

2,2

3,2

0,3

1,3

2,3

3,3
マピオン的なタイル仕様
●

作成範囲
minx=122.17226348794595
– miny=20.263332571433253
– maxx=154.06608467285295
– maxy=45.59148077649201
–

●

zoom範囲
–

5 ~ 19
作成環境
地図タイルストレージ

tile server

tile server

tile server

タイル生成スクリプト
Python
+

タイル生成スクリプト
Python(27processes)
+

タイル生成スクリプト
Python
+

Replication
地図注記DB
(postgres 9.2,
postgis 2.0)

Mapfile, Shapefile, GeoTiff, PNG
Postgresqlを8.2 → 9.2
postgisを1.3 → 2.0
これやったらDBのデータ入れ替えやタイル生成
の
パフォーマンスが大幅にUP!!
10日の工程が2~3日に!
タイル生成スクリプト
の
お仕事
開始!

作るメタタイル名
取得

No

取得できた?

ー

バ

multiprocess

で複
数
サ

で

Yes
対象メタタイル
の範囲を計算

No

Yes
作るべきタイル?

メタタイルをタイル
mapserverに
レンダリングさせる
にカット

タイルに命名して
保存
終了!
タイルとメタタイル
●

なに?
タイルを4x4個集めたも
のに周囲50pxのバッファ
をつけたもの
– 2つ上のzoomレベルの
タイル
–

●

256px
256px

zoom: 2

0,0

1,0

2,0

3,0

0,1

1,1

2,1

3,1

0,2

1,2

2,2

3,2

0,3

1,3

2,3

3,3

なぜメタタイルか
–

効率がよい
●

–

1度に16タイル分作る

タイルだと小さすぎて注
記が制限される
50px

1124px
タイル作成を分散させ
る仕組み
●

各サーバの各プロセスが次に自分
が作るメタタイル情報を取得でき
ればいい
メタタイルに通し番号振ればカウント
アップしてくれる何かがあればいい
● 番号の取得とカウントアップがアト
ミックに行えればよい
● あらたに何かソフトウェアを用意する
ほどのことでもない
●
Postgresql(注記DB)にSequenceで十分!
nextvalはアトミック!
nextval: シーケンスオブジェクトをその次の値に
進め、その値を返します。これは自動的に処理さ
れます。
複数のセッションが同時にnextvalを実行したとし
ても、それぞれのセッションは個別のシーケンス
値を間違いなく受け取ります。
(postgresql ドキュメントより抜粋)
p1

1番つくりま~す

2

p2

2番つくりま~す

3

p3

3番つくりま~す

p4

4番つくりま~す

p5

5番つくりま~す

p6

6番つくりま~す

1

nextval()
nextval()
start_value: 1
last_value: 7
max_value:8000

nextval()
nextval()

4

nextval()
nextval()

5
6
p1

1番つくりま~す

2

p2

2番つくりま~す

7

p3

7番つくりま~す

p4

4番つくりま~す

p5

5番つくりま~す

p6

6番つくりま~す

1

nextval()
nextval()
start_value: 1
last_value: 8
max_value:8000

nextval()
nextval()

4

nextval()
nextval()

5
6
無駄なタイルを作らな
い仕組み
●

容量削減が必要
何も考えずに作ると・・・
2,764,289,568枚
– ストレージない・・・(inode的に)
– 更新スケジュール崩壊
–
●

何も無いところは作らない
必須の地物が存在すれば作る!
– 作成範囲に↑の地物の存在をチェックす
るMapfileを用意
–

●

結果
–

258,476,742枚 (約1TB bk=4k)
import mapscript
m = mapscript.mapObj(“check.map”)
for i in range(m.numlayers):
m.getLayer(i).template =
“./dummy.html”
rect = mapscript.rectObj(minx, miny,
maxx, maxy)
if m.queryByRect(rect) ==
mapscript.MS_SUCCESS:
draw()
else:
skip()
タイル作成スクリプトはpythonで書きましたが、
シェルスクリプトでも十分可能。
(だってpythonでたった1300行)
オープンなデータがあって
FOSS4Gがあれば
自分で地図をつくれる時代になりました!
タイルと緯度経度の変換などの情報はこちらが最
高です

http://wiki.openstreetmap.org/wiki/Slippy_map_tilenam

100万回ぐらいみたと思う
ご清聴ありがとうございました

マピオン的Webメルカトルなタイルの作り方