2020年4月24日に,国土交通省による国土交通データプラットフォームの提供が開始されました.公式WEBサイトによると,このプラットフォームでは,国・地方自治体の保有する橋梁やトンネル、ダムや水門などの社会インフラ(施設)の諸元や点検結果に関するデータ約8万件と全国のボーリング結果等の地盤データ約14万件の計22万件を地図上に表示可能です.
このプラットフォームのありがたい点は,地図上に表示される各種位置情報を,各種GISソフトで扱うことができるGeoJSON形式で提供していることです(GeoJSONの詳細はこちらのWEBサイトを参照).
このサイトでは,提供されているGeoJSONの使い心地を少しみてみます.
なお,このサイトで使用されている各種関数・パッケージの使い方に関しては,別途チュートリアルサイトを用意してあるので,そちらを参照ください.
今回使うパッケージを全て読み込みます.
library(rvest)
library(dplyr)
library(geojsonsf)
library(stringr)
library(magrittr)
library(ggplot2)
最初に,今回のメインデータセットであるインフラデータをダウンロード・読み込みします.今回は,一連のデータセットから,橋梁GeoJSONデータをダウンロード・読み込みします.
ダウンロードページでは,1県に対して1つのGeoJSONのリンクが置いてあります.しかし,リンクアドレスには都道府県コードなどに基づく規則性がないので,for文を使ってリンクアドレスを変えながら全県のGeoJSONを一括ダウンロードができません.
そこで,WEBスクレイピングのテクニックを使って,1県ずつリンクをクリック&保存という煩雑な作業を避けつつ,一括ダウンロードを行う方法を用います(RによるWEBスクレイピングに関しては,このWEBサイトを参照).
rvestパッケージの関数が適用されている部分が,WEBスクレイピングを行っている箇所になります.
各県のGeoJSONデータのダウンロードが済んだら,全県のレコードを縦結合し,後程使う「点検の結果_総合」変数がNAでないレコードのみを残します.
#「社会資本情報プラットフォーム(道路-橋梁)」ページのソースを読み込み
page <- xml2::read_html("https://www.geospatial.jp/ckan/dataset/ipf0101")
#ソースから,リンクを抽出
json_url <- page %>% rvest::html_nodes("a") %>%
#リンクのURLを抽出
rvest::html_attr("href") %>%
#URLが".geojson"で終わるものを抽出
stringr::str_subset("\\.geojson")
#上で作成したリスト内の全てのgeojsonをダウンロードし,縦結合
bridge <- do.call(rbind,lapply(json_url,function(x){geojsonsf::geojson_sf(x)})) %>%
magrittr::set_colnames(gsub(" ","_",colnames(.)))
#点検の結果がNAになっているレコードを削除した上で,ポイントデータに変換
bridge_noNA <- bridge %>% dplyr::filter(!is.na(点検の結果_総合)) %>%
sf::st_as_sf(sf_column_name="geometry") %>%
sf::st_transform(sf::st_crs(4612))
head(bridge_noNA)
## Simple feature collection with 6 features and 24 fields
## geometry type: POINT
## dimension: XY
## bbox: xmin: 143.1011 ymin: 42.01722 xmax: 143.3161 ymax: 42.12472
## geographic CRS: JGD2000
## 分野名称_1 橋長 管理者名称_1 分野名称_4 幅員 分野名称_2
## 1 道路 24 国の機関-国土交通省北海道開発局 橋梁 8.5 -
## 2 道路 178.9 国の機関-国土交通省北海道開発局 橋梁 6 -
## 3 道路 8.4 国の機関-国土交通省北海道開発局 橋梁 8.5 -
## 4 道路 19.8 国の機関-国土交通省北海道開発局 橋梁 8.5 -
## 5 道路 35 国の機関-国土交通省北海道開発局 橋梁 9.5 -
## 6 道路 6.3 国の機関-国土交通省北海道開発局 橋梁 10.5 -
## 分野名称_3 管理者名称_2_code 分野名称_4_code 分野名称_1_code 管理者名称_2
## 1 国道336号 - D010 04 -
## 2 国道336号 - D010 04 -
## 3 国道336号 - D010 04 -
## 4 国道336号 - D010 04 -
## 5 国道336号 - D010 04 -
## 6 国道336号 - D010 04 -
## 管理者名称_3 都道府県_code 管理者名称_4 都道府県 管理者名称_1_code
## 1 - 01 - 北海道 022
## 2 - 01 - 北海道 022
## 3 - 01 - 北海道 022
## 4 - 01 - 北海道 022
## 5 - 01 - 北海道 022
## 6 - 01 - 北海道 022
## geometry 点検の結果_総合 位置_経度 施設所在地1 施設名称
## 1 POINT (143.2131 42.02583) Ⅱ 143.2131 えりも町 伏見橋
## 2 POINT (143.3161 42.12472) Ⅱ 143.3161 えりも町 猿留橋
## 3 POINT (143.1469 42.01722) Ⅰ 143.1469 えりも町 幌泉橋
## 4 POINT (143.2631 42.02306) Ⅰ 143.2631 えりも町 阿津橋
## 5 POINT (143.3069 42.075) Ⅰ 143.3069 えりも町 新咲梅橋
## 6 POINT (143.1011 42.04667) Ⅰ 143.1011 えりも町 笛舞橋
## 位置_緯度 時期_完成もしくは供用開始年 管理者名称_3_code 点検実施年度
## 1 42.02583 1972 - H30年度
## 2 42.12472 1960 - H29年度
## 3 42.01722 1965 - H30年度
## 4 42.02306 1973 - H30年度
## 5 42.07500 2004 - H28年度
## 6 42.04667 1972 - H27年度
# #[NOTRUN]緯度経度変数を使ってもポイントデータに変換可能
# bridge_noNA <- bridge %>% dplyr::filter(!is.na(点検の結果_総合)) %>%
# sf::st_as_sf(coords=c("位置_経度","位置_緯度"),crs=sf::st_crs(4612))
市区町村境界のshapefileをダウンロード・読み込みします.手続きに関しては,チュートリアルサイトに記したものと全く同じです.
読み込み後,市区町村境界を都道府県ごとに融合し,都道府県境界ポリゴンを作成します.その際,都道府県名を,後程都道府県境界ポリゴン内の変数として用いたいので,st_union関数ではなく,summarise関数に基づきポリゴンを融合しています.
#一時ディレクトリを作成
boundary <- tempfile()
#shapefileが入っているzipファイルを一時ディレクトリにダウンロード
curl::curl_download(url="https://www.esrij.com/cgi-bin/wp/wp-content/uploads/2017/01/japan_ver81.zip",destfile=boundary)
#zipファイルを解凍
unzip(zipfile=boundary,exdir=getwd())
#一時ディレクトリの削除
unlink(boundary);rm(boundary)
#市区町村境界shapefileの読み込み(一部不正なポリゴンがあったので,st_make_validで整形)
bound <- sf::st_read(dsn=getwd(),layer="japan_ver81",stringsAsFactors=F,options="ENCODING=CP932",quiet=TRUE) %>%
sf::st_make_valid(.)
head(bound)
## Simple feature collection with 6 features and 9 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: 140.9905 ymin: 42.78073 xmax: 141.4735 ymax: 43.18944
## geographic CRS: JGD2000
## JCODE KEN SICHO GUN SEIREI SIKUCHOSON CITY_ENG
## 1 01101 北海道 石狩振興局 <NA> 札幌市 中央区 Sapporo-shi, Chuo-ku
## 2 01102 北海道 石狩振興局 <NA> 札幌市 北区 Sapporo-shi, Kita-ku
## 3 01103 北海道 石狩振興局 <NA> 札幌市 東区 Sapporo-shi, Higashi-ku
## 4 01104 北海道 石狩振興局 <NA> 札幌市 白石区 Sapporo-shi, Shiroishi-ku
## 5 01105 北海道 石狩振興局 <NA> 札幌市 豊平区 Sapporo-shi, Toyohira-ku
## 6 01106 北海道 石狩振興局 <NA> 札幌市 南区 Sapporo-shi, Minami-ku
## P_NUM H_NUM geometry
## 1 230382 136592 MULTIPOLYGON (((141.335 43....
## 2 283392 147700 MULTIPOLYGON (((141.3982 43...
## 3 259826 138498 MULTIPOLYGON (((141.4472 43...
## 4 210479 117531 MULTIPOLYGON (((141.4735 43...
## 5 219071 121796 MULTIPOLYGON (((141.3663 43...
## 6 140809 72126 MULTIPOLYGON (((141.0964 43...
#都道府県単位にポリゴンを融合
bound_pref <- bound %>% dplyr::group_by(KEN) %>% dplyr::summarize()
各ポイントが,橋梁の位置を表しています.また,「点検の結果_総合」変数に基づいてポイントの色分けを行っています.
どういうわけか,茨城県外の場所にもポイントがプロットされているので,元データの座標値に誤りがあると思われます(GeoJSONに付与されているgeometry変数を用いても,緯度経度座標変数を用いても同じ結果でした).
#市区町村境界ポリゴンから,茨城県に含まれるもののみ抽出
bound_ibaraki <- bound %>% dplyr::filter(KEN=="茨城県")
#橋梁ポイントから茨城県に該当するもののみ抽出
bridge_noNA_ibaraki <- bridge_noNA %>% dplyr::filter(都道府県=="茨城県")
#まずは市区町村境界ポリゴン(白地図)をプロットし,その上に橋梁ポイント(点検の結果カテゴリに基づき着色)を重ね描きする
ggplot2::ggplot() +
ggplot2::geom_sf(data=bound_ibaraki,fill="white") +
ggplot2::geom_sf(data=bridge_noNA_ibaraki,aes(color=点検の結果_総合)) +
ggplot2::theme_gray(base_family="HiraKakuPro-W3")
#なぜか茨城県外にプロットされてしまうポイントを特定する(もっと良い方法があるように思える)
bridge_noNA_ibaraki_ID <- bridge_noNA_ibaraki %>% dplyr::mutate(FID=dplyr::row_number())
bridge_noNA_ibaraki_ID_within_ibaraki <- sf::st_intersection(bridge_noNA_ibaraki_ID,bound_ibaraki)
bridge_noNA_ibaraki_ID %>% dplyr::filter(!FID%in%(bridge_noNA_ibaraki_ID_within_ibaraki$FID))
## Simple feature collection with 2 features and 25 fields
## geometry type: POINT
## dimension: XY
## bbox: xmin: 140.0645 ymin: 36.90278 xmax: 141.3383 ymax: 37.28472
## geographic CRS: JGD2000
## 分野名称_1 橋長 管理者名称_1 分野名称_4 幅員 分野名称_2 分野名称_3
## 1 道路 11.6 国の機関-国土交通省 橋梁 1.5 - 国道6号
## 2 道路 13.5 国の機関-国土交通省 橋梁 1.8 - 国道6号
## 管理者名称_2_code 分野名称_4_code 分野名称_1_code 管理者名称_2 管理者名称_3
## 1 03 D010 04 関東地方整備局 -
## 2 03 D010 04 関東地方整備局 -
## 都道府県_code 管理者名称_4 都道府県 管理者名称_1_code
## 1 08 - 茨城県 021
## 2 08 - 茨城県 021
## geometry 点検の結果_総合 位置_経度 施設所在地1
## 1 POINT (141.3383 37.28472) Ⅱ 141.3383 北茨城市
## 2 POINT (140.0645 36.90278) Ⅱ 140.0645 取手市
## 施設名称 位置_緯度 時期_完成もしくは供用開始年
## 1 沢尻川側道橋 37.28472 2004
## 2 取手跨線橋側道橋(上) 36.90278 1984
## 管理者名称_3_code 点検実施年度 FID
## 1 - H26年度 24
## 2 - H30年度 26
都道府県別に「点検の結果_総合」がⅢ(早期措置段階)かⅣ(緊急措置段階)である橋梁の割合を計算し,地図にプロットします.
#変数「点検の結果_総合」が"Ⅲ"もしくは"Ⅳ"のレコードで1をとり,さもなくば0をとる変数dangを作成
bridge_noNA_bin <- bridge_noNA %>%
dplyr::mutate(dang=ifelse(点検の結果_総合=="Ⅲ"|点検の結果_総合=="Ⅳ",1,0))
#変数dangが付与された橋梁ポイントからジオメトリを除去し,都道府県でグループ化した後に,変数dangの平均(=dangが1になる割合)dang_ratioを計算
bridge_noNA_bin_sum <- bridge_noNA_bin %>% sf::st_set_geometry(value=NULL) %>% dplyr::group_by(都道府県) %>%
dplyr::summarise(dang_ratio=mean(dang)) %>% as.data.frame(stringsAsFactors=F)
#都道府県ポリゴンにdang_ratioを結合
bound_pref_dang_ratio <- bound_pref %>% dplyr::left_join(bridge_noNA_bin_sum,by=c("KEN"="都道府県"))
#dang_ratioを都道府県地図上にプロット
plot_pref <- ggplot2::ggplot() +
ggplot2::geom_sf(data=bound_pref_dang_ratio,aes(fill=dang_ratio),size=0.005)
plot_pref
# #[NOTRUN]プロットを画像に保存したければ実行
# ggplot2::ggsave(file="plot_pref_dang_ratio.png",plot=plot_pref,width=5,height=5,dpi=300)