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

Posted

技术标签:

【中文标题】sp::over() 用于多边形分析中的点【英文标题】:sp::over() for point in polygon analysis 【发布时间】:2013-09-30 22:00:02 【问题描述】:

我有一个名为“ind_adm”的 shapefile 和一个名为“pnts”的 SpatialPointsDataFrame。 “pnts”包含随机生成的点,其中一些点与多边形重叠。见下图。

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

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

但是,我得到的输出是

    >pt.in.poly
    values
    0 6.019467

我实际上应该得到多边形“内”点的索引。

我哪里错了?

【问题讨论】:

【参考方案1】:

找到了这个简洁直观的 over 语法:

   pnts[ind_adm,] 

来自this介绍文档

【讨论】:

这个答案最适合我。在我的例子中 pnts 是一个 SpatialPointsDataFrame 而 ind_adm 是一个 SpatialPolygonsDataFrame。 非常感谢!这值得 1000 次投票,非常直观,非常适合通过 shapefile 子集位置数据,尤其是在处理人口普查数据和收入等时 很好的解决方案。提示:确保 pnts 和 ind_adm 使用相同的 CRS。【参考方案2】:

您不应该提供函数。您正在聚合多边形几何上的点的属性值(即返回的数字是落在多边形内的点的属性的mean)。此外,你有你的xy 错误的方式来完成你想做的事情。应该是……

over( pnts , ind_adm , fn = NULL) 

【讨论】:

谢谢西蒙。问题在于 x 和 y 的顺序。该函数指定对象的聚合方式,因此“平均值”可以正常工作。我想将来记住 x 和 y 顺序的一个好方法是记住分析称为“多边形中的点”,因此点先出现,然后是多边形。【参考方案3】:

您可以使用 point.in.poly 来自 spatialEco 包。它“与点和多边形要素类相交并将多边形属性添加到点”。

library(spatialEco)

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

【讨论】:

您必须确保您的spatialpolygon(在本例中为ind_adm)在某些列中没有缺失值,否则在使用point.in.poly时会显示错误。跨度> 【参考方案4】:

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

加载库

library(sf)

从您的多边形创建一个简单的要素几何体(多边形)

ind_adm &lt;- st_as_sf(ind_adm)

从您的兴趣点创建一个简单的要素几何(点)

(24047 是印度的 EPSG 代码)

pnts &lt;- st_as_sf(pnts) %&gt;% st_set_crs(., 24047)

只保留多边形内的点

kept_points &lt;- st_intersection(ind_adm, pnts)

【讨论】:

以上是关于sp::over() 用于多边形分析中的点的主要内容,如果未能解决你的问题,请参考以下文章

多边形特例中的点

在多边形查询中的点上缓冲多边形

多边形算法中的点有时会给出错误的结果[关闭]

当测试点位于多边形边缘时,多边形算法中的点返回真

斯威夫特:多边形中的点?如何检查用户的位置是不是在 Geo-JSON 多边形内?

SQL Server 的多边形算法中的点