library(sf)
library(tidyverse)
library(here)
はじめに
このページでは、RでGISを使う上での基本について説明します。
R 言語では主にsf
パッケージを使ってGISを扱います。また、tidyverse
パッケージ群を使うことで、データの前処理や可視化を行うことができます。
また、R Projectを作成し使用することを前提とします1。
パッケージ
sf
, tidyverse
とhere
の3つを使用します。
# インストール
::pak(c("sf", "tidyverse", "here")) pak
使用するデータ
福島県の行政区域データ(2024年、ポリゴン)
福島県の公園データ(2011年、ポイント)
これらのデータを、ワーキングディレクトリにdata
フォルダを作って入れておいてください。
作業
このセクションでやることは、データの抽出と可視化です。
データの抽出
データの読み込み
sf
パッケージのread_sf()
関数を用います。
Shift_JISで書かれたような変なデータがたまにあるので、そのようなときはオプションで指定しましょう。options = "ENCODING=Shift_JIS"
を追加してください。
read_sf()
は、st_read()
の細かい設定を省いてくれた関数、というイメージです。
具体的には、
read_sf(dsn)
st_read(dsn, quiet = TRUE, stringsAsFactors = FALSE, as_tibble = TRUE)
この2つが同じです2。詳しくは?st_read()
をコンソールに打ち込みドキュメントを読んでみてください。
基本的にはread_sf()
で十分だと思います。
また、公園のデータはCRSが設定されていないようです。その設定も行います。CRSについては後の回で説明します。
<- read_sf(here("data/N03-20240101_07_GML/N03-20240101_07.shp"))
fukushima
<- read_sf(here("data/P13-11_07_GML/P13-11_07.shp"),
park options = "ENCODING=Shift_JIS") |>
st_set_crs(st_crs(4612)) |> # JGD2000/(B, L) データ本来のCRS
st_transform(st_crs(6668)) # JGD2011/(B, L) 変換したいCRS
データを見てみる
公園のデータを見てみます。
P13_001 | P13_002 | P13_003 | P13_004 | P13_005 | P13_006 | P13_007 | P13_008 | P13_009 | P13_010 | geometry |
---|---|---|---|---|---|---|---|---|---|---|
福島県 | NA | 福島空港公園 | 6 | 福島県 | 須賀川市 | 1993 | 520900 | 1 | NA | POINT (140.4202 37.24667) |
福島県 | NA | あづま総合運動公園 | 6 | 福島県 | 福島市 | 1980 | 982000 | 1 | NA | POINT (140.362 37.722) |
福島県 | NA | 逢瀬公園 | 4 | 福島県 | 郡山市 | 1979 | 346000 | 1 | NA | POINT (140.2739 37.41234) |
福島県 | NA | 会津レクリエーション公園 | 6 | 福島県 | 会津若松市 | 1998 | 426000 | 1 | NA | POINT (140.0166 37.51643) |
福島県 | NA | 東ヶ丘公園 | 6 | 福島県 | 南相馬市 | 1995 | 212000 | 1 | NA | POINT (140.9671 37.6326) |
福島県 | NA | いわき公園 | 6 | 福島県 | いわき市 | 1987 | 713000 | 1 | NA | POINT (140.9216 37.01329) |
国土数値情報ダウンロードサイトの説明を見てみると、各列は以下のようになっています。
P13_001
:管理都道府県・整備局P13_002
:管理市区町村P13_003
:公園名P13_004
:公園種別P13_005
:所在地都道府県名
P13_006
:所在地市区町村名P13_007
:供用開始年P13_008
:供用済面積P13_009
:都市計画決定P13_010
:備考
抽出
今回は公園名、所在地都道府県、所在地市区町村、そしてポイントを表すgeometry
の列だけが必要だとします。
dplyr::select()
関数を使って列を抽出し、同時に名前も変更します。
select()
内で変換後と変換前をイコールで結ぶことにより、列名を変更できます。
<- park |>
park_s select(
name_park = P13_003, # 公園名
name_pref = P13_005, # 都道府県名
name_muni = P13_006, # 市区町村名
# プロットに必要
geometry )
name_park | name_pref | name_muni | geometry |
---|---|---|---|
福島空港公園 | 福島県 | 須賀川市 | POINT (140.4202 37.24667) |
あづま総合運動公園 | 福島県 | 福島市 | POINT (140.362 37.722) |
逢瀬公園 | 福島県 | 郡山市 | POINT (140.2739 37.41234) |
会津レクリエーション公園 | 福島県 | 会津若松市 | POINT (140.0166 37.51643) |
東ヶ丘公園 | 福島県 | 南相馬市 | POINT (140.9671 37.6326) |
いわき公園 | 福島県 | いわき市 | POINT (140.9216 37.01329) |
このようにtidyverse
の強みを活かしてデータハンドリングを行えます3。
可視化
tidyverse
に含まれるggplot2
を使って、ここまでのデータをプロットしていきます。
基本的な書き方は以下の通りです。データフレームからggplot()
を繋いで記述していきます。
|>
park_s ggplot() +
geom_sf() # 地図をプロットするためのコマンド

これだとやや分かりにくいので、背景を消しましょう。theme_void()
やtheme_bw()
、theme_classic()
などがよいと思います。
|>
park_s ggplot() +
geom_sf() +
theme_void()

これだけだとどこなのかわからないので、先ほどダウンロードした福島県の行政区域を重ねてプロットします。
ggplot
を使うときは、記述した順に上に重なっていくので、場合によっては順番を意識しないとポイントなどが見えなくなることがあります。
今回は行政区域をベースとし、その上に公園をプロットするので、先に行政区域をプロットします。
geom_sf()
でデータを指定する引数は data
であり、これは第2引数なので、シンプルに geom_sf(fukushima)
と書くとプロットがうまくいきません4。geom_sf(data = fukushima)
と書く必要がある点にご注意ください。
ggplot() +
geom_sf(data = fukushima) +
geom_sf(data = park_s, color = "orange") + # 点の色も指定
theme_void()

ここまでがプロットの方法です。
今後も可視化の際に ggplot2
を使いますので、その都度紹介します。
ファイルの出力
先ほど作成したpark_s
をShapefileとして出力します。
GISデータは重いものが多いので、いちいち生データを読み込んで処理をすると時間がかかります。
# フォルダがない場合に作成する
if (!dir.exists(here("data/output/1_intro"))) {
dir.create(here("data/output/1_intro"), recursive = TRUE)
}
write_sf(park_s, here("data/output/1_intro/Park_selected.shp"),
layer_options = "ENCODING=UTF-8")
次回以降はPark_selected.shp
を読み込めばここから作業を開始できます。
おわりに
今回はここまでです。
RでGISデータを読み込み、データを抽出してプロット、最後にシェープファイルに出力しました。
データのハンドリングについてはRでできることが多いので、強みが活かせると思います。プロジェクトに合わせて応用させてみてください。