1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

自転車ルート検索 彩湖~葛西臨海公園 with Strava Global Heatmap

Last updated at Posted at 2019-09-25

いよいよ自前のルーティングアルゴリズムに挑戦

いよいよ本当にやりたかった自前のルーティングアルゴリズムに挑戦します
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での手順

  1. ラスタ(R) --> ジオリファレンサ(G)
  2. pngとpointファイルを読み込む
  3. 変換の設定 --> □ワールドファイルの作成のみ(リニア変換)にチェック
  4. ジオリファレンサすの開始
  5. .wldファイルが出力されるので、コピーして拡張子を .pgw に変更

③ ②のASCII形式のラスターデータに変換

QGISでできる様子
https://wiki.tuflow.com/index.php?title=QGIS_Export_Raster_to_asc

  1. 上記 PNG + PGW をQGISに読み込み(レイヤの追加・ラスタ)
  2. レイヤを選択
  3. ラスタ(R) --> 変換 --> 形式変換(gdal_translate)
  4. 出力ファイルの...をクリック --> ファイルに保存
  5. ファイルの種類 "ADC files (*.asc)
  6. ファイル名を適当に決める --> 保存
  7. 実行

【注意】実はこれで出力されるファイルは osrm が食べる形式と違う

異なる部分は

  1. ヘッダ情報不要
  2. ヘッダ情報にあたる情報は raster:load のパラメタに入れる必要あり

よって、以下の作業をします

  1. ヘッダ部分削除 --> 同.ascとして保存
  2. ヘッダ情報収集 --> 緯度経度は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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?