For a better version of the sf vignettes see https://r-spatial.github.io/sf/articles/
この vignette では、シンプルフィーチャ(ジオメトリに付随するレコード)を操作する方法について、ジオメトリを含む場合を例に説明します。操作の内容は以下の通りです。
フィーチャは sf
オブジェクトのレコードとして表現され、フィーチャ属性(ジオメトリ以外のすべてのフィールド)とフィーチャジオメトリを持つ。sfオブジェクトは
data.frameや
tbl_dfのサブクラスなので、フィーチャ属性の操作は
data.frame` に対して行うのと同じように行うことができる(例.
library(sf)
## Linking to GEOS 3.10.3, GDAL 3.5.1, PROJ 7.2.1; sf_use_s2() is TRUE
<- st_read(system.file("shape/nc.shp", package="sf"))
nc ## Reading layer `nc' from data source
## `/Users/baba/Library/R/x86_64/4.2/library/sf/shape/nc.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 100 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
## Geodetic CRS: NAD27
<- st_transform(nc, 2264)
nc 1,]
nc[## Simple feature collection with 1 feature and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 1193283 ymin: 913326.4 xmax: 1340553 ymax: 1044143
## Projected CRS: NAD83 / North Carolina (ftUS)
## AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74 NWBIR74
## 1 0.114 1.442 1825 1825 Ashe 37009 37009 5 1091 1 10
## BIR79 SID79 NWBIR79 geometry
## 1 1364 0 19 MULTIPOLYGON (((1270813 913...
は最初のレコードを表示します。
tidyverse/dplyr の動詞の多くは、sf
オブジェクトのためのメソッドを持っています。これは、 sf
と dplyr
の両方がロードされている場合、1つの属性を選択するような操作は sf
オブジェクトを返すことを意味します。
library(dplyr)
##
## 次のパッケージを付け加えます: 'dplyr'
## 以下のオブジェクトは 'package:stats' からマスクされています:
##
## filter, lag
## 以下のオブジェクトは 'package:base' からマスクされています:
##
## intersect, setdiff, setequal, union
%>% select(NWBIR74) %>% head(2)
nc ## Simple feature collection with 2 features and 1 field
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 1193283 ymin: 913326.4 xmax: 1441000 ymax: 1044143
## Projected CRS: NAD83 / North Carolina (ftUS)
## NWBIR74 geometry
## 1 10 MULTIPOLYGON (((1270813 913...
## 2 10 MULTIPOLYGON (((1340553 959...
これは、ジオメトリがスティッキーであり、自動的に追加されることを意味します。ジオメトリを削除しているい場合は、まず data.frame
を作成し、ジオメトリのリストカラムを削除します。
%>% as.data.frame %>% select(NWBIR74) %>% head(2)
nc ## NWBIR74
## 1 10
## 2 10
角括弧の表記でフィーチャセットをサブセットすることができる
1, "NWBIR74"]
nc[## Simple feature collection with 1 feature and 1 field
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 1193283 ymin: 913326.4 xmax: 1340553 ymax: 1044143
## Projected CRS: NAD83 / North Carolina (ftUS)
## NWBIR74 geometry
## 1 10 MULTIPOLYGON (((1270813 913...
で、ジオメトリをドロップするには drop
引数を使用します。
1, "NWBIR74", drop = TRUE]
nc[## [1] 10
## attr(,"class")
## [1] "numeric"
しかし、空間オブジェクトを行セレクタとして使用し、別の空間フィーチャと交差するフィーチャを選択することも可能です。
= nc[nc$NAME == "Ashe",]
Ashe class(Ashe)
## [1] "sf" "data.frame"
nc[Ashe,]## Simple feature collection with 4 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 1142157 ymin: 823077.4 xmax: 1448917 ymax: 1044143
## Projected CRS: NAD83 / North Carolina (ftUS)
## AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74
## 1 0.114 1.442 1825 1825 Ashe 37009 37009 5 1091 1
## 2 0.061 1.231 1827 1827 Alleghany 37005 37005 3 487 0
## 18 0.199 1.984 1874 1874 Wilkes 37193 37193 97 3146 4
## 19 0.081 1.288 1880 1880 Watauga 37189 37189 95 1323 1
## NWBIR74 BIR79 SID79 NWBIR79 geometry
## 1 10 1364 0 19 MULTIPOLYGON (((1270813 913...
## 2 10 542 3 12 MULTIPOLYGON (((1340553 959...
## 18 200 3725 7 222 MULTIPOLYGON (((1402673 837...
## 19 17 1775 1 33 MULTIPOLYGON (((1171157 868...
結果セットには Ashe
が含まれています。[.sf
の引数 op
のデフォルト値は st_intersects
で、Ashe
は自分自身と交差していることがわかります。述語 st_touches
を用いることで、自己交差を除外することができます(重なり合うフィーチャは触れません)。
= nc[nc$NAME == "Ashe",]
Ashe = st_touches]
nc[Ashe, op ## Simple feature collection with 3 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 1142157 ymin: 823077.4 xmax: 1448917 ymax: 1035625
## Projected CRS: NAD83 / North Carolina (ftUS)
## AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74
## 2 0.061 1.231 1827 1827 Alleghany 37005 37005 3 487 0
## 18 0.199 1.984 1874 1874 Wilkes 37193 37193 97 3146 4
## 19 0.081 1.288 1880 1880 Watauga 37189 37189 95 1323 1
## NWBIR74 BIR79 SID79 NWBIR79 geometry
## 2 10 542 3 12 MULTIPOLYGON (((1340553 959...
## 18 200 3725 7 222 MULTIPOLYGON (((1402673 837...
## 19 17 1775 1 33 MULTIPOLYGON (((1171157 868...
dplyr
を使えば、述語を直接呼び出すことで同じことができます。
%>% filter(lengths(st_touches(., Ashe)) > 0)
nc ## Simple feature collection with 3 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 1142157 ymin: 823077.4 xmax: 1448917 ymax: 1035625
## Projected CRS: NAD83 / North Carolina (ftUS)
## AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74
## 1 0.061 1.231 1827 1827 Alleghany 37005 37005 3 487 0
## 2 0.199 1.984 1874 1874 Wilkes 37193 37193 97 3146 4
## 3 0.081 1.288 1880 1880 Watauga 37189 37189 95 1323 1
## NWBIR74 BIR79 SID79 NWBIR79 geometry
## 1 10 542 3 12 MULTIPOLYGON (((1340553 959...
## 2 200 3725 7 222 MULTIPOLYGON (((1402673 837...
## 3 17 1775 1 33 MULTIPOLYGON (((1171157 868...
例えば、Ashe
と交差する郡の SID (sudden infant death) の1974年の割合を、残りの郡と比較しているいとします。これは次のようにして行うことができます。
<- aggregate(nc[, c("SID74", "BIR74")], list(Ashe_nb = lengths(st_intersects(nc, Ashe)) > 0), sum)
a <- a %>% mutate(frac74 = SID74 / BIR74) %>% select(frac74))
(a ## Simple feature collection with 2 features and 1 field
## Geometry type: GEOMETRY
## Dimension: XY
## Bounding box: xmin: 406265 ymin: 48359.7 xmax: 3052877 ymax: 1044143
## Projected CRS: NAD83 / North Carolina (ftUS)
## frac74 geometry
## 1 0.0020406588 MULTIPOLYGON (((454155.5 58...
## 2 0.0009922276 POLYGON ((1372051 837036.9,...
plot(a[2], col = c(grey(.8), grey(.5)))
plot(st_geometry(Ashe), border = '#ff8888', add = TRUE, lwd = 2)
ベース R (merge
) や dplyr (left_join
など) の通常の結合動詞は、 sf
オブジェクトに対しても同様に動作します。ジオメトリがマッチしない場合は、空のジオメトリが代用されます。2 番目の引数は sf
オブジェクトではなく、 data.frame
(または類似のもの) であるべきです。
= st_sf(a = 1:2, geom = st_sfc(st_point(c(0,0)), st_point(c(1,1))))
x = data.frame(a = 2:3)
y merge(x, y)
## Simple feature collection with 1 feature and 1 field
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 1 ymin: 1 xmax: 1 ymax: 1
## CRS: NA
## a geometry
## 1 2 POINT (1 1)
merge(x, y, all = TRUE)
## Simple feature collection with 3 features and 1 field (with 1 geometry empty)
## Geometry type: GEOMETRY
## Dimension: XY
## Bounding box: xmin: 0 ymin: 0 xmax: 1 ymax: 1
## CRS: NA
## a geometry
## 1 1 POINT (0 0)
## 2 2 POINT (1 1)
## 3 3 GEOMETRYCOLLECTION EMPTY
right_join(x, y)
## Joining, by = "a"
## Simple feature collection with 2 features and 1 field (with 1 geometry empty)
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 1 ymin: 1 xmax: 1 ymax: 1
## CRS: NA
## a geom
## 1 2 POINT (1 1)
## 2 3 POINT EMPTY
空間的な交点に基づく結合には、(あらゆる種類の) st_join
が使用されます。
= st_sf(a = 1:3, geom = st_sfc(st_point(c(1,1)), st_point(c(2,2)), st_point(c(3,3))))
x = st_buffer(x, 0.1)
y = x[1:2,]
x = y[2:3,]
y plot(st_geometry(x), xlim = c(.5, 3.5))
plot(st_geometry(y), add = TRUE)
結合方法は左結合で、最初の属性のすべてのレコードを保持します。
st_join(x, y)
## Simple feature collection with 2 features and 2 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 1 ymin: 1 xmax: 2 ymax: 2
## CRS: NA
## a.x a.y geom
## 1 1 NA POINT (1 1)
## 2 2 2 POINT (2 2)
st_join(y, x)
## Simple feature collection with 2 features and 2 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 1.9 ymin: 1.9 xmax: 3.1 ymax: 3.1
## CRS: NA
## a.x a.y geom
## 2 2 2 POLYGON ((2.1 2, 2.099863 1...
## 3 3 NA POLYGON ((3.1 3, 3.099863 2...
であり、保持されるジオメトリは第1引数のものです。
空間結合述語は st_intersects
(デフォルト)と互換性のある任意の関数で制御することができます。
st_join(x, y, join = st_covers) # 一致するYレコードがない: 点が円をカバーしない
## Simple feature collection with 2 features and 2 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 1 ymin: 1 xmax: 2 ymax: 2
## CRS: NA
## a.x a.y geom
## 1 1 NA POINT (1 1)
## 2 2 NA POINT (2 2)
st_join(y, x, join = st_covers) # 点を含む円にマッチ
## Simple feature collection with 2 features and 2 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 1.9 ymin: 1.9 xmax: 3.1 ymax: 3.1
## CRS: NA
## a.x a.y geom
## 2 2 2 POLYGON ((2.1 2, 2.099863 1...
## 3 3 NA POLYGON ((3.1 3, 3.099863 2...