git clone https://github.com/Project-OSRM/osrm-backend.git
Docker Hubにあるosrm/osrm-backendは、Apple SiliconのMacのDockerでは正常に動作しませんでした。そこで、Apple Silicon用にビルドして、使えるようにしてみました。
ビルド
ここは、ARMアーキテクチャ向けにDockerイメージをビルドする for ラズパイを参考にしました。
GitHubからosrm-backendのプロジェクトファイルをコピーします。
Dockerfile
をプロジェクトディレクトリのトップにコピーします。
cd osrm-backend/docker
cp Dockerfile ../
cd ..
platformをlinux/arm64/v8としてビルドします。
docker buildx build --platform linux/arm64/v8 --tag osrm-backend-arm64:latest .
データの作成
前の記事で、Intel版のDockerのOSRMを使って作成したOpenStreetMapのデータを今回作成したDockerイメージで使おうとするとエラーになりました。
File is incompatible with this version of OSRM: /data/kanto-latest.osrm.cells prepared with OSRM 5.26.0 but this is v6.0.0 (at include/storage/tar.hpp:201)
では、ということで、データを作り直します。中部地方のデータchubu-latest.osm.pbf
のあるディレクトリで以下のコマンドを実行します。
docker run -t -v "${PWD}:/data" osrm-backend-arm64 osrm-extract \
-p /opt/foot.lua /data/chubu-latest.osm.pbfdocker run -t -v "${PWD}:/data" osrm-backend-arm64 osrm-partition \
/data/chubu-latest.osrmdocker run -t -v "${PWD}:/data" osrm-backend-arm64 osrm-customize \
/data/chubu-latest.osrm
Dockerイメージの起動
ここまで来たら、osrm-backendのDockerイメージを起動します。
docker run -t -i -p 5000:5000 -v "${PWD}:/data" osrm-backend-arm64 osrm-routed --algorithm mld /data/chubu-latest.osrm
Rからの利用
Dockerイメージが起動してしまえば、Rからの利用はまったく同じです。
library(osrm)
## Data: (c) OpenStreetMap contributors, ODbL 1.0 - http://www.openstreetmap.org/copyright
## Routing: OSRM - http://project-osrm.org/
library(leaflet)
options(osrm.server = "http://localhost:5000/",
osrm.profile = "foot")
<- c(136.647893, 36.577984)
kanazawa_eki <- c(136.662603, 36.562085)
kenrokuen
<- osrmRoute(src = kanazawa_eki, dst = kenrokuen)
route print(route)
## Simple feature collection with 1 feature and 4 fields
## Geometry type: LINESTRING
## Dimension: XY
## Bounding box: xmin: 136.6482 ymin: 36.56208 xmax: 136.6628 ymax: 36.57813
## Geodetic CRS: WGS 84
## src dst duration distance geometry
## src_dst src dst 33.79833 2.7408 LINESTRING (136.6482 36.577...
leaflet() |>
addTiles() |>
setView((kanazawa_eki[1] + kenrokuen[1]) / 2,
2] + kenrokuen[2]) / 2,
(kanazawa_eki[zoom = 15) |>
addPolylines(data = route) |>
addMarkers(kanazawa_eki[1], kanazawa_eki[2]) |>
addMarkers(kenrokuen[1], kenrokuen[2]) |>
::mapshot(file = "figures/kenrokuen.png") mapview