日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

RでGISデータを処理する

Tokyo.R #107がジオデータ特集をすると聞いて、GDALを思い出そう思ったのと、折角だし、sfパッケージも勉強して、rgdalとの対比をLTしようともくろんだ。

でも、ちょっと気が変わったので、その準備だけ残しておくことにした。

GISデータ

GISデータは地理的な位置や形状、属性などの情報を持つデータで、ベクター形式やラスター形式などの種類がある。

GISデータは複数のファイルから構成されており、シェープファイル(shpファイル)が図形の情報、shxファイルが図形のインデックス情報、dbfファイルが図形の属性情報をそれぞれ格納している。

shpファイルはESRI社が策定した業界標準フォーマットで、ポイントやラインやポリゴンなどの図形の情報と属性情報を格納したベクター形式データ。

RでGISデータの分析するパッケージ

調べると、RでのGISデータ処理が変わり目にあると知った。

パッケージ 特徴 利点 欠点
rgdal GISデータの読み書きや変換を行うGeospatial Data Abstraction Library (GDAL) を使う ラスターとベクターの地理空間データの取り込み、spオブジェクトの出力 2023年10月に廃止される、sfパッケージに移行することになる
sf Simple FeaturesというGISデータの標準仕様に対応 地理空間データをデータフレームに変換、tidyverseとの互換性 sfオブジェクトを扱うので、spオブジェクトを使えない
spdep 空間自己相関や空間回帰などの空間統計分析 空間統計の定番パッケージ、モラン散布図や地域指標などの分析 sfオブジェクトに対応していない、as_Spatial関数で変換する必要がある
gstat 地理空間データの統計モデリング 点データや面データに対する重回帰分析、kriging法のモデリング モデリングに必要な前処理や後処理が多い
raster 地表面を格子状に区切ったラスター形式のGISデータを扱う ラスターデータの処理、他の地理空間データとの統合 データフレームを扱わない、tidyverseパッケージとの互換性が低い
tmap 地理空間データの可視化 ggplot2に似た文法を使える、静的、動的に処理できる カスタマイズには多くのオプションが必要

RでGISデータを使ってみる

データをダウンロードする

少し前に流行った日本の都道府県のGISデータCOVID-19のデータを重ねてみる

日本の都道府県のGISデータ

wd <- "d:/Desktop/analysis_gis_data/"
setwd(wd)

# 日本の都道府県のGISデータをダウンロード
x <- "https://nlftp.mlt.go.jp/ksj/gml/data/N03/N03-20230101_GML.zip"
file_name <- sub(".*/", "./", x)
download.file(x, file_name)

# ダウンロードしたファイルを解凍
unzip(file_name)
shp_file <- dir(pattern = "\\.shp$", full.names = TRUE)

NHKがまとめたCOVID-19のデータ

# データをダウンロード
x <- "https://www3.nhk.or.jp/n-data/opendata/coronavirus/nhk_news_covid19_prefectures_daily_data.csv"
file_name <- sub(".*/", "./", x)
download.file(x, file_name)

# データを読み込む
covid <- read.csv(file_name)
covid <- subset(covid, select = c(日付, 都道府県名, 各地の死者数_累計))

# データを表示する
head(covid)

$\ast$ JSON形式でも取得できる

# # データをダウンロード
# x <- "https://www3.nhk.or.jp/news/special/coronavirus/data/latest-pref-data.json"
# file_name <- sub(".*/", "./", x)
# download.file(x, file_name)

# # データを読み込む
# covid <- jsonlite::fromJSON(file_name)

Rのパッケージを使う

rgdalパッケージ

# rgdalパッケージを読み込む
library(rgdal)

# 解凍したファイルからGISデータを読み込む
gis_data <- readOGR(shp_file)

# GISデータをプロットする
plot(gis_data)

sfパッケージ

# sfパッケージとggplot2パッケージをインストール
install.packages(c("sf", "ggplot2"))

# sfパッケージとggplot2パッケージを読み込む
library(sf)
library(ggplot2)

# 解凍したファイルからGISデータを読み込む
pref <- st_read("N03-20200101_21_GML/N03-21_200101.shp")

# GISデータをggplot2でプロットする
ggplot(pref) +
  geom_sf() +
  theme_minimal()

spdepパッケージ

# spdepパッケージとtmaptoolsパッケージとtidyverseパッケージをインストール
install.packages(c("spdep", "tmaptools", "tidyverse"))

# spdepパッケージとtmaptoolsパッケージとtidyverseパッケージを読み込む
library(spdep)
library(tmaptools)
library(tidyverse)

# 解凍したファイルからGISデータを読み込む
pref <- read_shape("N03-20200101_21_GML/N03-21_200101.shp")

# GISデータとcovid-19死亡者数と人口密度のデータフレームを結合する
pref_covid <- pref %>%
  left_join(covid, by = c("N03_001" = "pref"))

# GISデータをspオブジェクトに変換する
pref_covid <- as_Spatial(pref_covid)

# 空間的自己相関分析を行うための隣接行列を作成する
nb <- poly2nb(pref_covid, queen = TRUE)

# 空間的自己相関分析を行うための重み行列を作成する
w <- nb2listw(nb, style = "W")

# 死亡者数の空間的自己相関分析を行う
moran.test(pref_covid$death, w)

# モラン散布図をプロットする
moran.plot(pref_covid$death, w)

gstatパッケージ

# gstatパッケージとspパッケージとtidyverseパッケージをインストール
install.packages(c("gstat", "sp", "tidyverse"))

# gstatパッケージとspパッケージとtidyverseパッケージを読み込む
library(gstat)
library(sp)
library(tidyverse)

# GISデータとcovid-19死亡者数と人口密度と都道府県庁所在地の緯度と経度のデータフレームを結合する
pref_covid <- pref %>%
  left_join(covid, by = c("N03_001" = "pref"))

# GISデータをspオブジェクトに変換する
coordinates(pref_covid) <- ~lon + lat

# 死亡者数に対して重回帰分析を行う
lm1 <- lm(death ~ density + N03_001, data = pref_covid)

# 重回帰分析の結果を表示する
summary(lm1)

# 死亡者数に対してkriging法を行う
kr1 <- krige(death ~ density + N03_001, pref_covid, pref_covid)

# kriging法の結果を表示する
summary(kr1)

rasterパッケージ

# rasterパッケージとrgdalパッケージをインストール
install.packages(c("raster", "rgdal"))

# rasterパッケージとrgdalパッケージを読み込む
library(raster)
library(rgdal)

# 解凍したファイルからラスターデータを読み込む
dem <- raster("FG-GML-6441-36-DEM5A.tif")

# ラスターデータをプロットする
plot(dem)

tmapパッケージ

# tmapパッケージとsfパッケージとtidyverseパッケージをインストール
install.packages(c("tmap", "sf", "tidyverse"))

# tmapパッケージとsfパッケージとtidyverseパッケージを読み込む
library(tmap)
library(sf)
library(tidyverse)

# 解凍したファイルからGISデータを読み込む
pref <- st_read("N03-20200101_21_GML/N03-21_200101.shp")

# GISデータとcovid-19死亡者数と人口密度のデータフレームを結合する
pref_covid <- pref %>%
  left_join(covid, by = c("N03_001" = "pref"))

# GISデータをtmapでプロットする
tm_shape(pref_covid) +
  tm_fill(col = "death") +
  tm_borders() +
  tm_layout(title = "日本の都道府県別のcovid-19死亡者数")