17

我正在使用R中的 shapefile ,一个是 point.shp,另一个是 polygon.shp。现在,我想将点与多边形相交,这意味着多边形中的所有值都应该附加到 point.shp 的表中。

我在 sp 包中尝试了 overlay() 和 spRbind,但没有做我期望他们做的事情。

谁能给我一个提示?

4

3 回答 3

23

使用新的sf包,这现在变得快速而简单:

library(sf)
out <- st_intersection(points, poly)

其他选项

如果您不希望将多边形中的所有字段添加到点要素中,只需dplyr::select()在之前调用多边形要素:

library(magrittr)
library(dplyr)
library(sf)

poly %>% 
  select(column-name1, column-name2, etc.) -> poly

out <- st_intersection(points, poly)

如果遇到问题,请确保您的多边形有效:

st_is_valid(poly)

如果您FALSE在此处看到一些输出,请尝试使其有效:

poly <- st_make_valid(poly) 

请注意,这些“有效”功能取决于sf使用liblwgeom.

于 2017-05-18T08:41:13.037 回答
15

如果你overlay(pts, polys)在 pts 是一个 SpatialPointsDataFrame 对象和 polys 是一个 SpatialPolygonsDataFrame 对象的地方这样做,那么你会得到一个与给定多边形数据框行的点长度相同的向量。因此,将多边形数据组合到点数据框中所需要做的就是:

 o = overlay(pts, polys)
 pts@data = cbind(pts@data, polys[o,])

然而!如果您的任何点落在所有多边形之外,则覆盖返回一个 NA,这将导致 polys[o,] 失败,因此请确保您的所有点都在多边形内,否则您将不得不考虑另一种分配方式多边形外点的值...

于 2010-09-06T08:02:59.277 回答
4

point.in.poly您可以使用fomspatialEco包在一行中执行此操作。

library(spatialEco)

new_shape <- point.in.poly(pts, polys)

来自文档:point.in.poly“与点和多边形要素类相交并将多边形属性添加到点”。

于 2015-10-26T10:13:17.850 回答