OSRMのDockerイメージをApple Silicon用にビルドして、Rから使う

R
Docker
作者

伊東宏樹

公開

2025年5月28日

更新日

2025年5月29日

Docker Hubにあるosrm/osrm-backendは、Apple SiliconのMacのDockerでは正常に動作しませんでした。そこで、Apple Silicon用にビルドして、使えるようにしてみました。

ビルド

ここは、ARMアーキテクチャ向けにDockerイメージをビルドする for ラズパイを参考にしました。

GitHubからosrm-backendのプロジェクトファイルをコピーします。

git clone https://github.com/Project-OSRM/osrm-backend.git

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.pbf
docker run -t -v "${PWD}:/data" osrm-backend-arm64 osrm-partition \
/data/chubu-latest.osrm
docker 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")

kanazawa_eki <- c(136.647893, 36.577984)
kenrokuen <- c(136.662603, 36.562085)

route <- osrmRoute(src = kanazawa_eki, dst = kenrokuen)
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,
          (kanazawa_eki[2] + kenrokuen[2]) / 2,
          zoom = 15) |>
  addPolylines(data = route) |>
  addMarkers(kanazawa_eki[1], kanazawa_eki[2]) |>
  addMarkers(kenrokuen[1], kenrokuen[2]) |>
  mapview::mapshot(file = "figures/kenrokuen.png")