導入 + ハンドリング

公開

2024年5月16日

最終更新

2024年12月16日

はじめに

このページでは、RでGISを使う上での基本について説明します。

R 言語では主にsfパッケージを使ってGISを扱います。また、tidyverseパッケージ群を使うことで、データの前処理や可視化を行うことができます。

また、R Projectを作成し使用することを前提とします1

パッケージ

sf, tidyversehereの3つを使用します。

# インストール
pak::pak(c("sf", "tidyverse", "here"))
library(sf)
library(tidyverse)
library(here)

使用するデータ

  1. 福島県の行政区域データ(2024年、ポリゴン)

  2. 福島県の公園データ(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については後の回で説明します。

fukushima <- read_sf(here("data/N03-20240101_07_GML/N03-20240101_07.shp"))

park <- read_sf(here("data/P13-11_07_GML/P13-11_07.shp"), 
                options = "ENCODING=Shift_JIS") |> 
  st_set_crs(st_crs(4612)) |>  # JGD2000/(B, L) データ本来のCRS
  st_transform(st_crs(6668))   # JGD2011/(B, L) 変換したいCRS

データを見てみる

公園のデータを見てみます。

図 1: 公園のポイントデータ
表 1: 公園データの中身(一部)
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()関数を使って列を抽出し、同時に名前も変更します。

Note

select()内で変換後と変換前をイコールで結ぶことにより、列名を変更できます。

park_s <- park |> 
  select(
    name_park = P13_003,  # 公園名
    name_pref = P13_005,  # 都道府県名
    name_muni = P13_006,  # 市区町村名
    geometry              # プロットに必要
  )
表 2: 列抽出済みのデータ
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()   # 地図をプロットするためのコマンド
図 2: シンプルなプロット

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

park_s |> 
  ggplot() + 
  geom_sf() + 
  theme_void()
図 3: 背景を削除

これだけだとどこなのかわからないので、先ほどダウンロードした福島県の行政区域を重ねてプロットします。

プロットするとき

ggplot を使うときは、記述した順に上に重なっていくので、場合によっては順番を意識しないとポイントなどが見えなくなることがあります。

今回は行政区域をベースとし、その上に公園をプロットするので、先に行政区域をプロットします。

geom_sf() の注意点

geom_sf() でデータを指定する引数は data であり、これは第2引数なので、シンプルに geom_sf(fukushima) と書くとプロットがうまくいきません4geom_sf(data = fukushima) と書く必要がある点にご注意ください。

ggplot() + 
  geom_sf(data = fukushima) + 
  geom_sf(data = park_s, color = "orange") +  # 点の色も指定
  theme_void()
図 4: 行政区域と公園ポイントのプロット

ここまでがプロットの方法です。

今後も可視化の際に 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でできることが多いので、強みが活かせると思います。プロジェクトに合わせて応用させてみてください。

  1. R Projectと後述のhereについてはこちらを参照して下さい。↩︎

  2. dsnのところがデータです。↩︎

  3. データハンドリングの基礎的な知識を身に付けるには、私たちのRがおすすめです。↩︎

  4. 「○○ =」を省略できるのは、第1引数であるとき、もしくは引数順に書いている場合のみです。↩︎