SF是R-Spatial包,设计用于处理dyplr和pipes等简洁的语法。
我想在一个简单的特征集合对象上做一个简单的空间过滤。给定一个简单的特征集合,我想返回集合中满足某些几何条件的所有特征。特别是,我想找到与另一个对象相交的特征。
SF提供了函数st_intersects(x,y,...)
来完成这一任务,但我无法让它与dplyr一起工作。
我使用的是R3.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(版本0.3.0.9000)于2019年7月12日创建
st_intersects()单独返回正确的逻辑矩阵,但是当在过滤器中使用时,将返回所有结果,即使是逻辑矩阵为“FALSE”的特征。
4条答案
按热度按时间w46czmvw1#
注意,
st_intersection(, sparse = TRUE)
返回一个逻辑值matrix
,filter
需要一个向量,我们可以通过对矩阵进行子集化得到选择向量:.
需要使nc
也成为st_intersects
的参数,而不仅仅是filter
的参数。如果
filter.sf
方法直接对st_intersects
的输出敏感,而不需要sparse=FALSE
和[1,]
,那就太好了。eaf3rand2#
显然,要使dplyr动词与sf函数一起工作,需要指定列名“geometry”。
更正版本:
cx6n0qe33#
只是提醒一下:在这个用例中,我并没有成功地使用所建议的方法,但是,直接操作st_intersects的输出来创建一个指示符变量对我很有效:r - Convert output from sf::st_within to vector
goucqfw64#
另一种方法是使用
st_filter()
函数和.predicates = st_intersects
参数。在这种情况下,这将是
nc %>% st_filter(ash_point, .predicates = st_intersects)
您还可以将
.predicates
参数替换为任何其他类似的st_方法(如.predicates = st_within
),以仅获取完全在