SF是R-Spatial软件包,旨在与诸如dyplr和管道之类的整洁语法一起使用。
我想对一个简单的要素集合对象做一个简单的空间过滤。给定一个简单的要素集合,我想从集合中返回满足某些几何条件的所有要素。特别是,我想找到与另一个对象相交的特征。
SF提供了功能st_intersects(x,y,...)
,但我无法使其与dplyr一起使用。
我正在使用R 3.5.2和从github安装的最新sf。
library(tidyverse)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
# many multipolygons:
nc <- st_read(system.file("shape/nc.shp", package="sf"))
#> Simple feature collection with 100 features and 14 fields
#> geometry type: MULTIPOLYGON
#> dimension: XY
#> bbox: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> epsg (SRID): 4267
#> proj4string: +proj=longlat +datum=NAD27 +no_defs
# A point in Ashe County:
ash_point <- nc %>%
filter(NAME == "Ashe") %>%
st_point_on_surface()
# how many counties intersect ash_point?
nc %>%
st_intersects(ash_point, sparse = FALSE) %>%
sum()
#> [1] 1
# return the features which intersect ash_point:
nc %>%
filter(st_intersects(ash_point, sparse = FALSE))
#> although coordinates are longitude/latitude, st_intersects assumes that they are planar
#> Simple feature collection with 100 features and 14 fields
#> geometry type: MULTIPOLYGON
#> dimension: XY
#> bbox: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> epsg (SRID): 4267
#> proj4string: +proj=longlat +datum=NAD27 +no_defs
#> First 10 features:
#> AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74
#> 1 0.114 1.442 1825 1825 Ashe 37009 37009 5 1091
#> 2 0.061 1.231 1827 1827 Alleghany 37005 37005 3 487
#> 3 0.143 1.630 1828 1828 Surry 37171 37171 86 3188
#> 4 0.070 2.968 1831 1831 Currituck 37053 37053 27 508
#> 5 0.153 2.206 1832 1832 Northampton 37131 37131 66 1421
#> 6 0.097 1.670 1833 1833 Hertford 37091 37091 46 1452
#> 7 0.062 1.547 1834 1834 Camden 37029 37029 15 286
#> 8 0.091 1.284 1835 1835 Gates 37073 37073 37 420
#> 9 0.118 1.421 1836 1836 Warren 37185 37185 93 968
#> 10 0.124 1.428 1837 1837 Stokes 37169 37169 85 1612
#> SID74 NWBIR74 BIR79 SID79 NWBIR79 geometry
#> 1 1 10 1364 0 19 MULTIPOLYGON (((-81.47276 3...
#> 2 0 10 542 3 12 MULTIPOLYGON (((-81.23989 3...
#> 3 5 208 3616 6 260 MULTIPOLYGON (((-80.45634 3...
#> 4 1 123 830 2 145 MULTIPOLYGON (((-76.00897 3...
#> 5 9 1066 1606 3 1197 MULTIPOLYGON (((-77.21767 3...
#> 6 7 954 1838 5 1237 MULTIPOLYGON (((-76.74506 3...
#> 7 0 115 350 2 139 MULTIPOLYGON (((-76.00897 3...
#> 8 0 254 594 2 371 MULTIPOLYGON (((-76.56251 3...
#> 9 4 748 1190 2 844 MULTIPOLYGON (((-78.30876 3...
#> 10 1 160 2038 5 176 MULTIPOLYGON (((-80.02567 3...
由reprex package(v0.3.0.9000)于2019-07-12创建
st_intersects()单独返回正确的逻辑矩阵,但是在过滤器中使用时,即使逻辑矩阵具有“ FALSE”的要素也将返回所有结果。
答案 0 :(得分:2)
请注意,st_intersection(, sparse = TRUE)
返回逻辑matrix
,而filter
需要一个向量。我们可以通过对矩阵进行子集化来获得选择向量:
nc %>%
filter(st_intersects(., ash_point, sparse = FALSE)[1,])
.
必须具有nc
的参数,而不仅仅是st_intersects
的参数。
如果filter
方法将直接对filter.sf
的输出敏感,而不需要st_intersects
和sparse=FALSE
,那就太好了。我把它放在一些待办事项清单上。
答案 1 :(得分:0)
显然,要使dplyr动词与sf函数一起使用,您需要指定列名称“ geometry”。
更正的版本:
nc %>%
filter(st_intersects(geometry, ash_point, sparse = FALSE))
答案 2 :(得分:0)
请注意:对于这种用例,我对所提出的方法并不成功。但是,直接操纵st_intersects的输出以创建指标变量对我来说是有效的:r - Convert output from sf::st_within to vector