我在 R 中使用shapefile,一个是point.shp,另一个是polygon.shp。 现在,我想将点与多边形相交,这意味着多边形中的所有值都应该附加到point.shp的表中。
我在包sp中尝试了overlay()和spRbind,但没有做我希望他们做的事情。
有人能给我一个提示吗?
答案 0 :(得分:13)
如果执行overlay(pts, polys)
其中pts是SpatialPointsDataFrame对象而多边形是SpatialPolygonsDataFrame对象,则返回的矢量长度与给出多边形数据帧行的点的长度相同。因此,您需要做的就是将多边形数据组合到点数据框上:
o = overlay(pts, polys)
pts@data = cbind(pts@data, polys[o,])
无论其!如果你的任何一个点落在你的所有多边形之外,那么叠加会返回一个NA,这将导致多边形[o,]失败,所以要么确保你的所有点都在多边形内,要么你必须考虑另一种分配方式多边形之外的点的值......
答案 1 :(得分:12)
使用新的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)
请注意,这些&#39;有效&#39;函数依赖于使用sf
编译的liblwgeom
安装。
答案 2 :(得分:4)
您使用point.in.poly
fom spatialEco
包在一行中执行此操作。
library(spatialEco)
new_shape <- point.in.poly(pts, polys)
文档中的:point.in.poly
&#34;与点和面要素类相交,并将多边形属性添加到点&#34;。