wget https://download.geofabrik.de/asia/japan/chubu-latest.osm.pbf2025-11-15
ナビゲーションアプリとか
Rでもできる
Open Source Routing Machine
オープンソースの経路探索システム
公式でもサーバーもあるが、Docker1から利用することが多い
Rとは別のソフトウェアだが、Rから利用可能
あらかじめ、経路探索データを作成しておきます
foot.luaを指定して徒歩ルートを指定)DockerでOSRMサーバーを起動します1
RからOSRMを利用するためのパッケージ
CRANから入手可能(CRAN Package:osrm)
金沢駅と兼六園の位置を設定
金沢駅と兼六園の位置を表示
> library(leaflet)
> leaflet() |>
+ addTiles() |>
+ setView(lng = (kanazawa_eki[1] + kenrokuen[1]) / 2,
+ lat = (kanazawa_eki[2] + kenrokuen[2]) / 2,
+ zoom = 14) |>
+ addCircleMarkers(lng = kanazawa_eki[1], lat = kanazawa_eki[2],
+ label = "金沢駅", color = "blue", opacity = 0.9,
+ labelOptions = labelOptions(noHide = TRUE)) |>
+ addCircleMarkers(lng = kenrokuen[1], lat = kenrokuen[2],
+ label = "兼六園", color = "red", opacity = 0.9,
+ labelOptions = labelOptions(noHide = TRUE))osrmRoute関数で探索を実行します
> (route <- osrmRoute(src = kanazawa_eki, dst = kenrokuen))
Simple feature collection with 1 feature and 4 fields
Geometry type: LINESTRING
Dimension: XY
Bounding box: xmin: 136.6483 ymin: 36.56208 xmax: 136.6628 ymax: 36.57815
Geodetic CRS: WGS 84
src dst duration distance geometry
src_dst src dst 33.58167 2.7222 LINESTRING (136.6483 36.577...> leaflet() |>
+ addTiles() |>
+ setView(lng = (kanazawa_eki[1] + kenrokuen[1]) / 2,
+ lat = (kanazawa_eki[2] + kenrokuen[2]) / 2,
+ zoom = 14) |>
+ addCircleMarkers(lng = kanazawa_eki[1], lat = kanazawa_eki[2],
+ label = "金沢駅", color = "blue", opacity = 0.9,
+ labelOptions = labelOptions(noHide = TRUE)) |>
+ addCircleMarkers(lng = kenrokuen[1], lat = kenrokuen[2],
+ label = "兼六園", color = "red", opacity = 0.9,
+ labelOptions = labelOptions(noHide = TRUE)) |>
+ addPolylines(data = route, col = "purple", weight = 4, opacity = 0.9)osrmTable関数を使用して、金沢駅から各避難場所までの所要時間を求める> eki_df <- data.frame(lng = kanazawa_eki[1],
+ lat = kanazawa_eki[2])
> evac_df <- evac_data |>
+ dplyr::select(lng = `経度`, lon = `緯度`)
> results <- osrmTable(src = eki_df,
+ dst = evac_df,
+ measure = "duration")
> results_df <- data.frame(id = 1:nrow(evac_data),
+ duration = results$durations[1, ]) |>
+ dplyr::arrange(duration)所要時間が短い上位5か所の避難場所について経路を探索
> # カラーパレットの作成関数
> pal_fun <- colorNumeric("viridis", domain = 1:6)
>
> leaflet() |>
+ addTiles() |>
+ setView(lng = kanazawa_eki[1], lat = kanazawa_eki[2],
+ zoom = 16) |>
+ addCircleMarkers(data = evac_data,
+ lng = ~`経度`, lat = ~`緯度`,
+ label = ~`名称`,
+ color = "green", opacity = 0.5) |>
+ addPolylines(data = evac_routes,
+ color = pal_fun(1:5),
+ weight = 6, opacity = 0.8) |>
+ addLegend(data = evac_routes,
+ colors = pal_fun(1:5),
+ labels = paste0("避難経路", 1:5),
+ opacity = 1,
+ position = "topright")> evac_sf <- evac_data |>
+ sf::st_as_sf(coords = c("経度", "緯度"), crs = 4326) # WGS84
> evac_routes <- evac_routes |>
+ dplyr::mutate(rank = ordered(rank))
>
> # 金沢駅中心にほぼ2km四方
> lng <- kanazawa_eki[1] + c(-0.0125, 0.0125)
> lat <- kanazawa_eki[2] + c(-0.00833, 0.00833)
> bb <- st_bbox(c(xmin = lng[1], xmax = lng[2],
+ ymin = lat[1], ymax = lat[2]), crs = 4326) # WGS84経路を追加