gpt4 book ai didi

r - 如何使用 st_intersects() 等 sf 方法过滤 R 简单特征集合?

转载 作者:行者123 更新时间:2023-12-04 00:25:49 25 4
gpt4 key购买 nike

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”的特征,也会返回所有结果。

最佳答案

请注意 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,] .我会把它放在一些待办事项 list 上。

关于r - 如何使用 st_intersects() 等 sf 方法过滤 R 简单特征集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57014381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com