🐙

メモ:交通量 API を R から使ってみる

に公開

(なんと呼べばいいのかよくわからないのでとりあえず「交通量 API」と呼んでいます)

アナウンス

https://www.xroad.mlit.go.jp/database/233/

コード

たぶんこんな感じです。どのパラメータが必須かとかは仕様を参照してください。

library(httr2)

req <- request("https://api.jartic-open-traffic.org/geoserver") |> 
  req_url_query(
    service = "WFS",
    version = "2.0.0",
    request = "GetFeature",
    typeNames = "t_travospublic_measure_1h",
    srsName = "EPSG:4326",
    outputFormat = "application/json",   # これを指定すると結果が GeoJSON になる
    exceptions = "application/json",
    cql_filter = paste(
      "道路種別 = 3",
      "時間コード >= 202505120000",
      "時間コード <= 202505130000",
      "BBOX(ジオメトリ, 139.40, 35.46, 140.05, 35.93, 'EPSG:4326')",
      sep = " AND "
    )
  )

resp <- req |> 
  req_perform()

j <- resp |>
  # sf で GeoJSON を読む必要があるので、resp_body_json() ではなく resp_body_string()
  resp_body_string() |>
  sf::read_sf() |>
  # 不要そうなカラムを削除
  dplyr::select(
    !id,
    !観測年月日,
    !時間帯,
    !道路種別,
    !`収集時間フラグ(5分間/1時間)`
  ) |>
  # 時刻型に変換しておく
  dplyr::mutate(
    時間コード = lubridate::ymd_hm(時間コード, tz = "Japan")
  )
  • データ保持期間は、5分値で過去1か月、1時間値で過去3か月となっているが、このサービスが公開された 202505120000 以降しかデータがなさそう
  • API は4つあるが、たぶん typeNames が違うだけであとのパラメータは同じ
  • pagination はなさそうなので、長い期間をリクエストしたときに重かったりしないか不安

ちなみに、req_perform()path を指定して結果をファイルに保存することもできます。

tmp <- tempfile(fileext = ".geojson")
res <- req |> 
  req_perform(path = tmp)

結果の見た目

こんな感じでした。

dplyr::glimpse(j)
#> Rows: 682
#> Columns: 24
#> $ 地方整備局等番号                 <int> 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,…
#> $ `開発建設部/都道府県コード`     <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",…
#> $ 常時観測点コード                 <int> 3110010, 3110140, 3110160, 3110170, 3110180, 3110230, 3110270, 3110280, 3110400, 3110600, 3110610, 3110620,…
#> $ `収集時間フラグ(5分間/1時間)` <chr> "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2…
#> $ 観測年月日                       <int> 20250512, 20250512, 20250512, 20250512, 20250512, 20250512, 20250512, 20250512, 20250512, 20250512, 2025051…
#> $ 時間帯                           <int> 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,…
#> $ `上り・小型交通量`               <int> 864, 707, 789, 673, 749, 409, 542, 1056, 805, 1417, 1026, 955, 625, 231, 790, 535, 1017, 901, 718, 942, 751…
#> $ `上り・大型交通量`               <int> 172, 150, 304, 416, 314, 39, 163, 569, 136, 167, 224, 363, 389, 239, 171, 113, 268, 246, 123, 248, 209, 140…
#> $ `上り・車種判別不能交通量`       <int> 49, 45, 50, 0, 0, 21, 23, 0, 37, 155, 31, 19, 34, 11, 25, 29, 38, 54, 206, 40, 33, 102, 46, 56, 45, 63, 75,…
#> $ `上り・停電`                     <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0…
#> $ `上り・ループ異常`               <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0…
#> $ `上り・超音波異常`               <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0…
#> $ `上り・欠測`                     <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0…
#> $ `下り・小型交通量`               <int> 916, 825, 747, 825, 693, 381, 708, 1168, 744, 1239, 1288, 970, 291, 196, 904, 536, 885, 938, 777, 0, 894, 6…
#> $ `下り・大型交通量`               <int> 147, 170, 232, 269, 329, 41, 223, 601, 135, 134, 299, 477, 286, 349, 152, 103, 248, 334, 167, 0, 247, 195, …
#> $ `下り・車種判別不能交通量`       <int> 29, 38, 46, 0, 0, 16, 28, 0, 50, 78, 38, 27, 63, 67, 36, 32, 32, 48, 51, 0, 53, 51, 46, 87, 38, 57, 164, 31…
#> $ `下り・停電`                     <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0…
#> $ `下り・ループ異常`               <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0…
#> $ `下り・超音波異常`               <chr> "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0…
#> $ `下り・欠測`                     <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0…
#> $ 道路種別                         <chr> "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3…
#> $ 時間コード                       <dttm> 2025-05-12 11:00:00, 2025-05-12 11:00:00, 2025-05-12 11:00:00, 2025-05-12 11:00:00, 2025-05-12 11:00:00, 2…
#> $ geometry                         <MULTIPOINT [°]> MULTIPOINT ((139.7049 35.58..., MULTIPOINT ((139.8787 35.70..., MULTIPOINT ((139.7273 35.56..., …

Discussion