在R语言中,交点和多边形

18

我正在使用R处理shapefiles文件,其中之一是point.shp,另一个是polygon.shp。现在,我想要将点与多边形相交,也就是说,多边形的所有值都应该附加到point.shp表格中。

我尝试了sp包中的overlay()和spRbind函数,但它们都没有像我期望的那样工作。

有人能给我提示吗?

3个回答

25

使用新的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) 

请注意,这些“valid”函数取决于使用liblwgeom编译的sf安装程序。

很遗憾,这对我的类型为SpatialPolygonsDataFrame和SpatialPointsDataFrame的多边形没有起作用。我收到了错误消息:“no applicable method for 'st_intersection' applied to an object of class "c('SpatialPointsDataFrame', 'SpatialPoints', 'Spatial', 'SpatialVector')”。 - yPennylane
2
@yPennylane,你需要使用 sf 对象来完成这个任务。你提到的类是从 sp 包中来的。请使用 sf 包中的 st_read() 函数读取你的数据。 - pat-s
@Jens也许该考虑更换被采纳的答案了?旧答案似乎已经过时。 - pat-s

15
如果你使用 overlay(pts, polys),其中pts是一个SpatialPointsDataFrame对象,polys是一个SpatialPolygonsDataFrame对象,则会返回一个与点相同长度的向量,该向量给出多边形数据帧的行。因此,你只需要将多边形数据合并到点数据框上,就可以完成操作:
 o = overlay(pts, polys)
 pts@data = cbind(pts@data, polys[o,])

然而!如果你的任何一个点都在所有多边形之外,那么叠加操作会返回NA,这将导致polys[o,]失败,因此要么确保所有点都在多边形内,要么您必须考虑另一种方法来为多边形外的点分配值...


谢谢!不知怎么漏掉了第二行!现在完美运作。但是,我接下来会发另一个问题:如果想要将一个简单的数据框(data.frame)附加到空间多边形数据框(SpatialPolygonsDataFrame),该怎么做? - Jens
8
@spacedman这个答案已经过时了!overlay函数现在是over函数。你第二行中提到的polys对象所指的内容不太清楚。 - colin

4
你可以使用spatialEco包中的point.in.poly函数在一行代码中完成此操作,该操作涉及到IT技术。请注意,不要删除任何HTML标签。
library(spatialEco)

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

从文档中得知:point.in.poly "相交点和多边形要素类,并将多边形属性添加到点"。


2
请注意,spatialEco::point.in.poly 只是 sp::over 的一个包装器。 - Valentin_Ștefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接