这个点是否在多边形内?

3
非常简单的情况:一个多边形定义了一个地理区域,我想知道一个由GPS坐标给出的点是否在该多边形内。
我查看了许多SO问题,并尝试了各种函数和包,如sp,但无法确定它为什么失败。
我尝试了这个非常简单的函数: https://www.rdocumentation.org/packages/SDMTools/versions/1.1-221/topics/pnt.in.poly
install.packages("SDMTools v1.1-221")
library(SDMTools v1.1-221)

## Coordinates of the polygon corners
lat <- c(48.43119, 48.43119, 48.42647, 48.400031, 48.39775, 48.40624, 48.42060, 48.42544, 48.42943 ) 
lon <- c(-71.06970, -71.04180, -71.03889, -71.04944, -71.05991, -71.06764, -71.06223, -71.06987, -71.07004)
pol = cbind(lat=lat,lng=lon)

## Point to be tested
x <- data.frame(lng=-71.05609, lat=48.40909)

## Visualization, this point clearly stands in the middle of the polygon
plot(rbind(pol, x))
polygon(pol,col='#99999990')

## Is that point in the polygon? 
out = pnt.in.poly(x,poly)

## Well, no (pip=0)
print(out)

这个函数的例子可以正常运行,但是对于这个简单的情况却不起作用…为什么呢?
2个回答

5

我没有使用你正在使用的方法,但是我有一种内部的方法sp可以完美地在您的点和多边形上运行。

我从您的代码中挑选了适合函数要求的latlon向量以及点坐标值。

但是您也可以轻松地创建一个数据框,并明确使用列作为lat/lon值。

这是其要点:

require(sp)
## Your polygon
lat <- c(48.43119, 48.43119, 48.42647, 48.400031, 48.39775, 48.40624, 48.42060, 48.42544, 48.42943 ) 
lon <- c(-71.06970, -71.04180, -71.03889, -71.04944, -71.05991, -71.06764, -71.06223, -71.06987, -71.07004)


## Your Point
lng=-71.05609
lt=48.40909

# sp function which tests for points in polygons

point.in.polygon(lt, lng, lat, lon, mode.checked=FALSE)

以下是输出结果:

[1] 1  

从文档中的解释可以得知:
整型数组的值为:
0表示点严格位于多边形外部
1表示点严格位于多边形内部
2表示点位于多边形边缘的相对内部
3表示点是多边形的顶点
据此,如果您的点是基于1计数的,则根据地图,它应完全位于多边形内部!要获得这些类型数据的良好输出结果的关键在于以正确的格式提供变量。
您也可以使用一个数据帧df,其中包含df$lat和df$lon作为两个多边形变量,以及一个测试帧test,其中包含test$lat和test$lon作为一系列点。您可以将它们替换为等式中的每个变量,如下所示:
point.in.polygon(df$lat, df$lon, test$lat, test$lon, mode.checked=FALSE)

它将返回一个由0、1、2和3向量组成的结果

但首先确保您以正确的格式获得它!这里是函数页面链接:


2

我在?pnt.in.poly文档中没有明确说明,但是似乎lnglat列的顺序很重要。您需要交换pol中的列顺序,然后它就可以正常工作。

pol = cbind(lat=lat, lng=lon)
pnt.in.poly(x, pol)
#          lng      lat pip
# 1 -71.05609 48.40909   0

pol = cbind(lng=lon, lat=lat)
pnt.in.poly(x, pol)
#          lng      lat pip
# 1 -71.05609 48.40909   1

在空间几何中,lng 通常被视为 x轴,而 lat 则是 y轴,您将会看到这在您的 plot() 中被反转了。


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