我正在使用R中的 shapefile ,一个是 point.shp,另一个是 polygon.shp。现在,我想将点与多边形相交,这意味着多边形中的所有值都应该附加到 point.shp 的表中。
我在 sp 包中尝试了 overlay() 和 spRbind,但没有做我期望他们做的事情。
谁能给我一个提示?
使用新的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
.
如果你overlay(pts, polys)
在 pts 是一个 SpatialPointsDataFrame 对象和 polys 是一个 SpatialPolygonsDataFrame 对象的地方这样做,那么你会得到一个与给定多边形数据框行的点长度相同的向量。因此,将多边形数据组合到点数据框中所需要做的就是:
o = overlay(pts, polys)
pts@data = cbind(pts@data, polys[o,])
然而!如果您的任何点落在所有多边形之外,则覆盖返回一个 NA,这将导致 polys[o,] 失败,因此请确保您的所有点都在多边形内,否则您将不得不考虑另一种分配方式多边形外点的值...
point.in.poly
您可以使用fomspatialEco
包在一行中执行此操作。
library(spatialEco)
new_shape <- point.in.poly(pts, polys)
来自文档:point.in.poly
“与点和多边形要素类相交并将多边形属性添加到点”。