いよいよ自前のルーティングアルゴリズムに挑戦
いよいよ本当にやりたかった自前のルーティングアルゴリズムに挑戦します
Strava heatmapを使ったOSRM最適化 | ちゃりラボBlog
の記事をトレースさせていただき、Strava Global Heatmap をルート評価に組み込みます。
やる事
① 彩湖~葛西臨海公園を含んだヒートマップの取得 (from Strava)
② ①のGeoTIFF化 (by QGIS)
③ ②のASCII形式のラスターデータに変換
④ ③をosrmに食わせる
⑤ osrmファイル作成 w/ 俺々lua + ラスタファイル
⑥ サーバ起動
⑦ ルート検索(彩湖~葛西臨海公園)
① 彩湖~葛西臨海公園を含んだヒートマップの取得 (from Strava)
タイルの位置の目星をつけておきます。
彩湖
https://heatmap-external-b.strava.com/tiles/ride/hot/11/1818/805.png?px=512
葛西臨海公園
https://heatmap-external-b.strava.com/tiles/ride/hot/11/1819/806.png?px=512
forで回してcurlでタイルを取得
それを convert (imageMagick) でくっつけます
$ for y in {805..806} ; do
> for x in {1818..1819} ; do
> curl https://heatmap-external-b.strava.com/tiles/ride/hot/11/${x}/${y}.png?px=512 > test_${x}.png
> done
> mkdir ${y} ; convert +append *.png ${y}/${y}.png
> done
$ convert -append */*.png arakawa.png
② ①のGeoTIFF化 (by QGIS)
GeoTIFF化の過程で画像の解像度が落ちる?とにかく線がきたない
ので PNG + PGW(ワールドファイル) にします
以下、QGISでの手順
- ラスタ(R) --> ジオリファレンサ(G)
- pngとpointファイルを読み込む
- 変換の設定 --> □ワールドファイルの作成のみ(リニア変換)にチェック
- ジオリファレンサすの開始
- .wldファイルが出力されるので、コピーして拡張子を .pgw に変更
③ ②のASCII形式のラスターデータに変換
QGISでできる様子
https://wiki.tuflow.com/index.php?title=QGIS_Export_Raster_to_asc
- 上記 PNG + PGW をQGISに読み込み(レイヤの追加・ラスタ)
- レイヤを選択
- ラスタ(R) --> 変換 --> 形式変換(gdal_translate)
- 出力ファイルの...をクリック --> ファイルに保存
- ファイルの種類 "ADC files (*.asc)
- ファイル名を適当に決める --> 保存
- 実行
【注意】実はこれで出力されるファイルは osrm が食べる形式と違う
異なる部分は
- ヘッダ情報不要
- ヘッダ情報にあたる情報は raster:load のパラメタに入れる必要あり
よって、以下の作業をします
- ヘッダ部分削除 --> 同.ascとして保存
- ヘッダ情報収集 --> 緯度経度はQGIS上で目視で取得。ピクセル数は1024x1024(512が4枚だからね)
④ ③をosrmに食わせる
OSRM公式ドキュメントの using raster dataを参照
④-0. 俺々luaファイルの準備
rasterbot.luaをベースにして、
以下の2点を修正します。
- i) ラスタファイルの修正
- ii) function process_segment()の修正
i) ラスタファイルの修正
は、0-1で準備したラスタファイルの情報より
raster_source = raster:load(
"arakawa_heatmap_osrm.asc", -- file to load
139.569190, -- longitude min
139.921867, -- longitude max
35.603747, -- latitude min
35.888854, -- latitude max
1024, -- number of rows
1024 -- number of columns
)
緯度経度少しずれています(目視で値を調べたため)
z, x, y から lat, lon を算出する計算機を作りました
緯度経度とタイル座標(z, x, y)の変換装置
ii) は、以下の process_segment() をまるっとコピペ(ありがたや)
my-rasterbot.luaとしてprofileディレクトリに保存
④-1. ラスタファイルを osrm_backend ディレクトリにコピー
たぶん、osrm-extract を実行するディレクトリです
④-2. ラスタファイル、.luaファイルをviで開いて、末尾の ^Z を取り除く
Windows上で秀丸で編集すると入ってしまう...
⑤ osrmファイル作成 w/ 俺々lua + ラスタファイル
$ rm ../osm/kanto_heat/kanto-latest.osrm*
$ osrm-extract ../osm/kanto_heat/kanto-latest.osm.pbf -p profiles/saito-rasterbot.lua
$ osrm-contract ../osm/kanto_heat/kanto-latest.osrm
※ osrm-contractが90%から完了まですごく時間がかかる...(焦らず待つ)
※ osrm-partition + osrm-customize で MLD用のデータを作るほうが地図のビルド時間は短いです
⑥ サーバ起動
$ osrm-routed --ip 127.0.0.1 --port 5000 ../osm/kanto_heat/kanto-latest.osrm
⑦ ルート検索(彩湖~葛西臨海公園)
$ curl --noproxy 127.0.0.1 'http://127.0.0.1:5000/route/v1/bike/139.620100,35.836270;139.855337,35.640767?alternatives=3&geometries=geojson' | jq 'def hexdec(i): "0123456789abcdef"[i:i+1]; {"type": "FeatureCollection", "features": [[.routes[].geometry] | [., keys] | transpose[] | {"geometry": .[0], "type": "Feature", "properties": {"stroke-width": 2, "stroke": ("#" + hexdec(15-.[1]*2) + hexdec(.[1]*2) + hexdec(.[1]*2))}}]}' > routes_saiko_to_kasai.json
⑧ 確認
これを geojson.io に食べさせて確認
おお、それらしきルートを案内している!
ヒートマップの解像度が荒いので、サイクリングロード近くの一般道を案内しちゃったりしているのはご愛嬌
今度は、Stravaにログインして、さらにズーム率の高いヒートマップタイルを取得して
再挑戦してみます。
EOF