国土数値情報の駅データを加工して、ポイントデータにする

データの準備

以下のURLからデータをダウンロードする。
https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-v2_3.html

ライブラリの準備

使うパッケージは以下

library(sf)
## Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1
library(here)
## here() starts at /Users/mac-user/Desktop/park-direct
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.5     ✓ dplyr   1.0.7
## ✓ tidyr   1.1.4     ✓ stringr 1.4.0
## ✓ readr   2.0.2     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(mapview)
## Warning: replacing previous import 'terra::extend' by 'raster::extend' when
## loading 'satellite'
## Warning: replacing previous import 'terra::crop' by 'raster::crop' when loading
## 'satellite'
## Warning: multiple methods tables found for 'crop'
## Warning: multiple methods tables found for 'extend'

分析

データの読み込み

sfパッケージを使って, shpファイルを読み込む.
st_set_crs関数で座標系の指定をしている

data <- read_sf(here("N02-20_GML","N02-20_Station.shp"), options="ENCODING=CP932") %>% 
  st_set_crs(6668)
# データが読み込めているか確認
head(data)
## Simple feature collection with 6 features and 5 fields
## Geometry type: LINESTRING
## Dimension:     XY
## Bounding box:  xmin: 127.7028 ymin: 26.23035 xmax: 139.78 ymax: 35.66328
## Geodetic CRS:  JGD2011
## # A tibble: 6 × 6
##   N02_001 N02_002 N02_003              N02_004            N02_005                  geometry
##   <chr>   <chr>   <chr>                <chr>              <chr>            <LINESTRING [°]>
## 1 11      2       指宿枕崎線           九州旅客鉄道       二月田  (130.6303 31.25405, 130.…
## 2 23      5       沖縄都市モノレール線 沖縄都市モノレール 古島    (127.7028 26.23035, 127.…
## 3 24      5       東京臨海新交通臨海線 ゆりかもめ         お台場… (139.7782 35.62961, 139.…
## 4 24      5       東京臨海新交通臨海線 ゆりかもめ         東京国… (139.7733 35.62109, 139.…
## 5 24      5       東京臨海新交通臨海線 ゆりかもめ         テレコ… (139.78 35.61791, 139.77…
## 6 24      5       東京臨海新交通臨海線 ゆりかもめ         汐留    (139.7604 35.66328, 139.…
# データの型の確認
glimpse(data)
## Rows: 10,267
## Columns: 6
## $ N02_001  <chr> "11", "23", "24", "24", "24", "24", "24", "24", "24", "24", "…
## $ N02_002  <chr> "2", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "…
## $ N02_003  <chr> "指宿枕崎線", "沖縄都市モノレール線", "東京臨海新交通臨海線",…
## $ N02_004  <chr> "九州旅客鉄道", "沖縄都市モノレール", "ゆりかもめ", "ゆりかも…
## $ N02_005  <chr> "二月田", "古島", "お台場海浜公園", "東京国際クルーズターミナ…
## $ geometry <LINESTRING [°]> LINESTRING (130.6303 31.254..., LINESTRING (127.70…

ポリゴンデータとして位置情報が入ってる

セントロイド

st_centroid関数を使う。

data2 <- data %>% 
  mutate(centroid = st_centroid(data$geometry))

ちゃんと駅がプロットできてるか確認してみる。
mapviewパッケージを使う。

mapview::mapview(data2$centroid)

割とうまくいってそう。

データフレーム化

今回はcsvファイルにしたかったので、shpファイルをデータフレームに変換する。
st_drop_geometryで地理データではなくしている。

data3 <- data2 %>% 
  dplyr::mutate(coords = purrr::map(centroid,
                                    ~ as.data.frame(sf::st_coordinates(.x)))) %>% 
  tidyr::unnest(cols = coords) %>% 
  st_drop_geometry()
head(data3)
## # A tibble: 6 × 8
##   N02_001 N02_002 N02_003         N02_004 N02_005            centroid     X     Y
##   <chr>   <chr>   <chr>           <chr>   <chr>           <POINT [°]> <dbl> <dbl>
## 1 11      2       指宿枕崎線      九州旅… 二月田  (130.6301 31.25432)  131.  31.3
## 2 23      5       沖縄都市モノレ… 沖縄都… 古島    (127.7029 26.23064)  128.  26.2
## 3 24      5       東京臨海新交通… ゆりか… お台場… (139.7785 35.62981)  140.  35.6
## 4 24      5       東京臨海新交通… ゆりか… 東京国… (139.7731 35.62136)  140.  35.6
## 5 24      5       東京臨海新交通… ゆりか… テレコ… (139.7797 35.61773)  140.  35.6
## 6 24      5       東京臨海新交通… ゆりか… 汐留    (139.7601 35.66299)  140.  35.7

緯度軽度が生成された。csvにしたければ、centroid列を除外してしまえばOK。

data3 <- data3[,-6]

あとはwrite.csvとかでcsvファイルが完成。
以上!!