如何使用 st_intersects() 等 sf 方法过滤 R 简单特征集合? [英] How to filter an R simple features collection using sf methods like st_intersects()?

查看:11
本文介绍了如何使用 st_intersects() 等 sf 方法过滤 R 简单特征集合?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

SF 是 R-Spatial 包,旨在处理诸如 dyplr 和管道之类的整洁语法.

SF is the R-Spatial package designed to work with tidy syntax like dyplr and pipes.

我想对一个简单的特征集合对象做一个简单的空间过滤.给定一个简单的特征集合,我想从集合中返回满足某些几何条件的所有特征.特别是,我想找到与另一个对象相交的特征.

I would like to do a simple spatial filter on a simple features collection object. Given a simple features collection, I would like to return all features from the collection which meet some geometric condition. In particular, I would like to find the features that intersect with another object.

SF 提供了函数 st_intersects(x,y,...) 来执行此操作,但我无法让它与 dplyr 一起使用.

SF provides the function st_intersects(x,y,...) to do this, but I cannot get it to work with dplyr.

我正在使用 R 3.5.2 和从 github 安装的最新 sf.

I'm using R 3.5.2 and the latest sf installed from github.

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 包 (v0.3.0.9000) 于 2019 年 7 月 12 日创建

Created on 2019-07-12 by the reprex package (v0.3.0.9000)

st_intersects() 单独返回正确的逻辑矩阵,但在过滤器中使用时,即使逻辑矩阵具有FALSE"的特征也会返回所有结果.

st_intersects() alone returns the correct logical matrix, but when used in a filter, all results are returned even the features for which the logical matrix has a "FALSE".

推荐答案

注意 st_intersection(, sparse = TRUE) 返回一个逻辑 matrixfilter 需要一个向量.我们可以通过对矩阵进行子集来得到选择向量:

Note that st_intersection(, sparse = TRUE) returns a logical matrix, and filter wants a vector. We can get the selection vector by subsetting the matrix:

nc %>%
  filter(st_intersects(., ash_point, sparse = FALSE)[1,])

. 需要 nc 也是 st_intersects 的参数,而不仅仅是 filter.

The . is needed to have nc also be the argument to st_intersects, not only to filter.

如果 filter.sf 方法直接对 st_intersects 的输出敏感,而不需要 sparse=FALSE[1,].我会把它放在一些待办事项清单上.

It would be nice if the filter.sf method would directly be sensitive to the output of st_intersects, without needing sparse=FALSE and [1,]. I'll put it on some TODO list.

这篇关于如何使用 st_intersects() 等 sf 方法过滤 R 简单特征集合?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆