sp::over()用于点在多边形分析中

37

我有一个名为"ind_adm"的shapefile和一个名为"pnts"的SpatialPointsDataFrame,其中"pnts"包含随机生成的点,一些点与多边形重叠。如下图所示。 enter image description here

现在,我想进行点在多边形分析,即我想找出哪些点位于代表印度边界的灰色多边形内部。为此,我使用sp库中的over()函数。

pt.in.poly <- sp::over(ind_adm, pnts, fn = mean) #do the join

然而,我得到的输出是

    >pt.in.poly
    values
    0 6.019467

实际上我需要获取在多边形内的点的索引。

我做错了什么?

4个回答

30

发现了一种简洁而直观的over语法:

   pnts[ind_adm,] 

来自入门文档。


2
这个答案对我来说最有效。在我的情况下,pnts是一个SpatialPointsDataFrame,ind_adm是一个SpatialPolygonsDataFrame。 - jjunju
2
非常感谢!这值得1000个赞,非常直观,可以完美地通过shapefile对位置数据进行子集化,特别是在处理人口普查数据和收入等方面。 - Martin Boros
2
伟大的解决方案。提示:确保“pnts”和“ind_adm”使用相同的CRS。 - Huanfa Chen

30

你不应该提供一个函数。你正在聚合多边形几何上的点的属性值,即返回的数字是mean 在多边形内部的点的属性平均值。此外,你关于 xy 的用法是错误的。正确的做法是...

over( pnts , ind_adm , fn = NULL) 

2
谢谢Simon。问题出在x和y的顺序上。函数指定了对象如何聚合,因此“mean”很好地工作。我想记住x和y的顺序的好方法是通过记住分析称为“点在多边形内”,因此点首先出现,然后是多边形。 - DotPi

10
您可以使用 spatialEco 包中的 point.in.poly 函数。它可以"与点和多边形要素类相交,并将多边形属性添加到点上"。
library(spatialEco)

new_shape <- point.in.poly(pnts, ind_adm)

你必须确保你的空间多边形(在这种情况下为ind_adm)在某些列中没有缺失值,否则当你使用point.in.poly时会出现错误。 - asado23

4

你可以使用 sf 包中的 st_intersection 函数:

加载库

library(sf)

从多边形创建简单要素几何体(polygon)

ind_adm <- st_as_sf(ind_adm)

从感兴趣点创建简单要素几何体(point)

(24047 是印度的 EPSG 代码)

pnts <- st_as_sf(pnts) %>% st_set_crs(., 24047)

仅保留多边形内的点

kept_points <- st_intersection(ind_adm, pnts)


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