library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf)
## Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
library(mapgl)
石川県広域データ連携基盤推進事業 公式note の記事「 2030年の交通空白地をオープンデータで見つけよう」を見て、同様のことをRでやってみました。まったく同じというのもなんなので、2025年の推計人口と公共交通網とをmapglを使って可視化してみます。
準備
パッケージ
今回は、データ整形にtidyverseを、地理情報データにsfを、地図描画にmapglパッケージをそれぞれ使用します。
データの準備
国土数値情報から以下のデータをダウンロードします。いずれもGeoJSON形式のファイルを使います。
-
- 2022年度版の石川県のデータを使用します。
-
- 2022年度版の石川県のデータを使用します。
-
- 2024年版のデータを使用します。
-
- 石川県のデータを使用します。
バス停留所・バスルート・鉄道駅・鉄道路線・人口推計データのそれぞれのGeoJSONファイルをdataディレクトリに置いておきます。
<- c(
data_files "data/P11-22_17.geojson", # Bus stops
"data/N07-22_17.geojson", # Bus routes
"data/N02-24_Station.geojson", # Railway stations
"data/N02-24_RailroadSection.geojson", # Railway lines
"data/250m_mesh_2024_17.geojson") # Population
データ読み込みと整形
データ読み込み
purrrパッケージのmap
関数を使って、データファイルをまとめて読み込みます。読み込んだリストには、各要素に名前を付けておきます。
<- purrr::map(data_files,
data_list read_sf(f))
\(f) names(data_list) <- c("Bus_stop", "Bus_route", "Station", "Rail", "Population")
データの整形
あとで地図のラベルに使用するので、駅名とバス亭名に、事業者と路線名を付ける処理をおこないます。
また、250mメッシュにおける2025年の男女計総数人口(秘匿なし)の最大値を取得しておきます。
# Station
$Station <- data_list$Station |>
data_list::mutate(Label = str_c(N02_004, N02_003, N02_005, sep = " : "))
dplyr
# Bus stop
$Bus_stop <- data_list$Bus_stop |>
data_list::mutate(Label = str_c(P11_002, P11_003_01, P11_001, sep = " : "))
dplyr
# Maximum population in the 250m meshes
<- max(data_list$Population$PTN_2025) max_population
地図作成
mapglを使って地図を作成します。
まずはmaplibreでベースの地図を作成し、人口、鉄道路線、鉄道駅、バスルート、バス停のレイヤーを重ねて行きます。鉄道駅とバス停ではツールチップで情報が表示されるようにしました。
maplibre(style = maptiler_style("basic"),
center = c(136.8, 36.8),
zoom = 8,
pitch = 0,
bearing = 0) |>
add_navigation_control() |>
add_scale_control() |>
# Population
add_fill_layer(
id = "2025年人口",
source = data_list$Population,
fill_color = interpolate(
column = "PTN_2025",
type = "linear",
values = c(0, max_population),
stops = c("#BB0000", "#FFFF00")
),fill_opacity = 0.7
|>
) # Railway
add_line_layer(
id = "鉄道路線",
source = data_list$Rail) |>
# Railway station
add_line_layer(
id = "鉄道駅",
source = data_list$Station,
line_width = 4,
tooltip = "Label") |>
# Bus route
add_line_layer(
id = "バス路線",
source = data_list$Bus_route,
line_color = "skyblue") |>
# Bus stop
add_circle_layer(
id = "バス停",
source = data_list$Bus_stop,
circle_color = "blue",
circle_radius = 4,
min_zoom = 10,
tooltip = "Label") |>
add_layers_control()
このような地図になりました。mapglではインタラクティブな地図が作成されますが、サーバーの都合上、静止画を張り付けてあります。
金沢市中心部です。色は赤いほうが人口が少なく、黄色いほうが多いことを示します。
金沢城公園内はさすがに住んでいる人はいません。
七尾線高松駅あたりは、のと里山海道を通る特急バス以外の路線バスはないようです。
小松市佐美にもバス路線が来ていますが、ここは1日1往復となっています。小松基地内に人口がわりと多そうなところがぽつんとあるのは、職員宿舎でしょうか。