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

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

いよいよ本当にやりたかった自前のルーティングアルゴリズムに挑戦します
[Strava heatmapを使ったOSRM最適化 | ちゃりラボBlog](http://charilab.sakura.ne.jp/blog/2017/10/26/001-3/)
の記事をトレースさせていただき、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) でくっつけます

```console
$ 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)
1. pngとpointファイルを読み込む
1. 変換の設定 --> □ワールドファイルの作成のみ(リニア変換)にチェック
1. ジオリファレンサすの開始
1. .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](https://github.com/charilab/osrm-backend/blob/master/docs/profiles.md)を参照

## ④-0. 俺々luaファイルの準備

[rasterbot.lua](https://github.com/Project-OSRM/osrm-backend/blob/master/profiles/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)の変換装置](http://tomo3110.sakura.ne.jp/map/latlon_xyz_calc.html)

ii) は、以下の process_segment() をまるっとコピペ(ありがたや)

http://charilab.sakura.ne.jp/blog/2017/10/26/001-3/

my-rasterbot.luaとしてprofileディレクトリに保存

## ④-1. ラスタファイルを osrm_backend ディレクトリにコピー

たぶん、osrm-extract を実行するディレクトリです

## ④-2. ラスタファイル、.luaファイルをviで開いて、末尾の ^Z を取り除く

Windows上で秀丸で編集すると入ってしまう...

# ⑤ osrmファイル作成 w/ 俺々lua + ラスタファイル

```console
$ 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用のデータを作るほうが地図のビルド時間は短いです

# ⑥ サーバ起動

```console
$ osrm-routed --ip 127.0.0.1 --port 5000 ../osm/kanto_heat/kanto-latest.osrm
```

# ⑦ ルート検索(彩湖～葛西臨海公園)

```console
$ 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](http://geojson.io/) に食べさせて確認
おお、それらしきルートを案内している！
ヒートマップの解像度が荒いので、サイクリングロード近くの一般道を案内しちゃったりしているのはご愛嬌

今度は、Stravaにログインして、さらにズーム率の高いヒートマップタイルを取得して
再挑戦してみます。

EOF