メモ:sfでMULTIPOINTとかMULTIPOLYGONとかから要素をひとつだけ取り出したいときはとりあえずsfcにしてMULTIじゃないやつにcastする

sfにまだ慣れてないので思いつかないけど、もっといい方法があるのかも。

参考:

Simple Features for Rのvignetteに載ってるMULTIPOINTなsfg(simple feature geometry)の例。ここから1つめの点だけを取り出すことを考える。

library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.0, proj.4 4.9.3

points_df <- rbind(c(3.2,4), c(3,4.6), c(3.8,4.4), c(3.5,3.8), c(3.4,3.6), c(3.9,4.5))

(multipoint_sfg <- st_multipoint(points_df))
#> MULTIPOINT (3.2 4, 3 4.6, 3.8 4.4, 3.5 3.8, 3.4 3.6, 3.9 4.5)

ここで思いつくのは、単一のMULTIPOINTをPOINTのリストに変換することだが、それにはまずst_sfc()sfc(simple feature geometry list-column)にしてからst_cast()でPOINTにする。

(points_sfc <- st_cast(st_sfc(multipoint_sfg), to = "POINT"))
#> Geometry set for 6 features 
#> geometry type:  POINT
#> dimension:      XY
#> bbox:           xmin: 3 ymin: 3.6 xmax: 3.9 ymax: 4.6
#> epsg (SRID):    NA
#> proj4string:    NA
#> First 5 geometries:
#> POINT (3.2 4)
#> POINT (3 4.6)
#> POINT (3.8 4.4)
#> POINT (3.5 3.8)
#> POINT (3.4 3.6)

この状態で、[でサブセットすればsfcになり、[[でサブセットすればsfgになる。

[の場合:

(first_point_sfc <- points_sfc[1])
#> Geometry set for 1 feature 
#> geometry type:  POINT
#> dimension:      XY
#> bbox:           xmin: 3.2 ymin: 4 xmax: 3.2 ymax: 4
#> epsg (SRID):    NA
#> proj4string:    NA
#> POINT (3.2 4)

class(first_point_sfc)
#> [1] "sfc_POINT" "sfc"

[[の場合:

(first_point_sfg <- points_sfc[[1]])
#> POINT (3.2 4)

class(first_point_sfg)
#> [1] "XY"    "POINT" "sfg"