この資料のために書き下ろした内容は CC0 です。
$ docker run -ti --rm unvt/ango
root@09dc97356d7e:~#
* '09dc97356d7e' の部分は異なる
$ curl -O http://ango.vectortiles.xyz/ango-amd64.tar.gz
$ gunzip ango-amd64.tar.gz | docker load
* Raspberry Pi の場合 amd64 → armhf
(# exit) # さっき試した docker run から抜ける
$ docker run -ti --rm -p 3000:3000 -p 8888:8888 unvt/ango
root@fef54f77bc33:~# tippecanoe -v
tippecanoe v1.34.4
root@fef54f77bc33:~# node -v
v10.15.2
作業データを保存したり、持ち込みデータを扱う場合はマウントすることをお勧めします。
-v (ホスト側のディレクトリの絶対パス):/media
$ # /Users/hfu を /media として触れるようにする
$ docker run -ti --rm \
-v /Users/hfu/:/media \
-p 3000:3000 -p 8888:8888 unvt/ango
$ tippecanoe -v # ベクトルタイルを生産
tippecanoe v1.34.5
$ tile-join # ベクトルタイルを操作
Usage: tile-join [-f] [-i] [-pk] [-pC] [-c joins.csv] [-X] [-x exclude ...] -o new.mbtiles source.mbtiles ...
$ ogr2ogr --version # データ変換
GDAL 2.4.2, released 2019/06/28
$ osmium --version # OpenStreetMap のデータ変換
osmium version 1.10.0 (v1.10.0-76-g26674e1)
...
$ node -v # サーバは Node.js で作ります
v10.15.2
$ budo --version # 開発用サーバ
budo v11.6.3
$ pm2 --version # サーバ
3.5.1
$ browserify --version # JavaScript 変換
16.5.0
...
$ vi --version # スタイルを HJSON 形式で書く
VIM - Vi IMproved 8.1 (2018 May 18, compiled Jun 15 2019 16:41:15)
...
$ hjson -v # HJSON を JSON に変換する
Hjson.js 3.1.2
$ gl-style-validate # Mapbox Style を検証する
usage: ...
$ node ~/vt-optimizer/index.js --help # ベクトルタイルサイズ最適化
Vector Tile Weight Loser...
今回のハンズオンでは、基礎編として 1., 2.。
3., 4. は進度に合わせたバリエーションルート。
GeoJSONS をベクトルタイルに変換
$ cd ango-produce
$ rake
tippecanoe --output=tiles.mbtiles --read-parallel --force --layer=ndm --minimum-zoom=7 --maximum-zoom=10 --prefilter='node prefilter.js' ../geojsons-natural-disaster-monuments/data.geojsons
255 features, 14316 bytes of geometry, 2 bytes of separate metadata, 109216 bytes of string pool
99.9% 10/900/404
tile-join --force --output-to-directory=zxy tiles.mbtiles --no-tile-compression
まずは実行してみてください
$ cat Rakefile
task :default do
sh "tippecanoe --output=tiles.mbtiles\
--read-parallel --force --layer=ndm\
--minimum-zoom=7 --maximum-zoom=10\
--prefilter='node prefilter.js'\
../geojsons-natural-disaster-monuments/data.geojsons"
sh "tile-join --force\
--output-to-directory=zxy tiles.mbtiles\
--no-tile-compression"
end
# more ../geojsons-natural-disaster-monuments/data.geojsons
{"geometry":{"type":"Point","coordinates":[128.042983,26.554941]},"type":"Feature","properties":{"ID":"47209-001","LoreName":"津波襲来の碑","LoreYear":"2012","Address":"沖縄県名護市字大浦","DisasterName":"津波<br>(1960年5月24日)","DisasterKind":"津波","DisasterInfo":"昭和35年(1960)5月南米チリでM8.5の地震が起き大津波が発生、津波は太平洋を横
断し日本近海を襲った。当地には数回に亘り襲来。津波高5mにも及び大浦橋が全壊、護岸も決壊した。","Image":"https://maps.gsi.go.jp/legend/disaster_lore/47209/47209-001.jpg","ImageWidth":"1200","ImageHeight":"900"}}
...
一行ごとに GeoJSON Feature が書いてある
RFC 8142: ogr2ogr は GeoJSONS と呼ぶ
tippecanoe --output=tiles.mbtiles\
--read-parallel --force --layer=ndm\
--minimum-zoom=7 --maximum-zoom=10\
--prefilter='node prefilter.js'\
../geojsons-natural-disaster-monuments/data.geojsons
// prefilter.js: 標準入力の各行を `modify()` して出力
const modify = require('./modify.js')
const readline = require('readline')
const rl = readline.createInterface(process.stdin, {})
rl.on('line', (line) => {
console.log(JSON.stringify(modify(JSON.parse(line))))
})
// modify.js: 与えられた地物を修正して返す
module.exports = (f) => {
for (k of [
'DisasterKind', 'DisasterName', 'DisasterInfo', 'LoreName'
]) {
// 余計な <br> タグをとる
f.properties[k] = f.properties[k].replace(/<br>/g, " ")
}
return f
}
tile-join --force\
--output-to-directory=zxy tiles.mbtiles\
--no-tile-compression
ベクトルタイルパッケージをブラウザで見ることができるようにする。
$ cd ~/ango-host # ホストプログラムに移動
$ yarn # 必要なライブラリを導入
$ rake build # 地図サイトを構築
$ rake start # サーバをスタート
まずは実行してみてください。
$ rake stop # サーバを止める
rake build
task :build do # サイトのファイルを作る
sh "hjson -j htdocs/style.hjson > htdocs/style.json"
sh "browserify -o htdocs/bundle.js -t " +
"[ babelify --presets [ @babel/preset-env ] ] app.js"
end
htdocs/style.hjson
{
version: 8
center: [135, 35]
zoom: 7
sources: {
v: {
...
255
]
text-halo-width: 1
}
}
]
}
Mapbox Style を簡明のため HJSON で書いたもの
app.js
const map = new mapboxgl.Map({
container: 'map',
style: 'style.json',
attributionControl: true,
hash: true
})
単なるウェブ地図起動の JavaScript だが、モダンに書きたいので browserify/babelify で変換している。
rake start
task :start do
sh "pm2 start process.yml"
end
process.yml
apps:
- script: index.js
name: ango
instances: 4
exec_mode: cluster
4インスタンスのクラスタモードで起動
rake stop
task :stop do
sh "pm2 stop ango; pm2 delete ango"
end
rake _mapbox
task :_mapbox do
sh "cp ../mapbox-gl-js/dist/mapbox-gl.js htdocs"
sh "cp ../mapbox-gl-js/dist/mapbox-gl.js.map htdocs"
sh "cp ../mapbox-gl-js/dist/mapbox-gl.css htdocs"
end
別途ビルドした Mapbox GL JS から必要ファイルをコピー
オープンジオデータをベクトルタイルに変換する取り組みのアンブレラです。