非常简单的情况:一个多边形定义了一个地理区域,我想知道一个由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 回答
我没有使用你正在使用的方法,但我在
sp
中有一个在你的点和多边形上完美运行 .我挑选了你的代码并将
lat
和lon
作为向量,将点坐标作为值来满足函数要求 .但是你可以很容易地创建一个数据框并明确地将列用作lat / lon值 .
以下是它的要点:
这是输出:
从文档中解释这个:
整数数组值是:
0点严格地在多边形外部
1点严格地是多边形的内部
2点位于多边形边缘的相对内部
3点是多边形的顶点
因为你的点是基于此的1,它应该完全在你的 Map 显示的多边形内!使用这些类型的数据获得良好输出的关键是以正确的格式提供变量 .
您可以轻松地将数据框
df
与df$lat
和df$lon
作为两个多边形变量以及测试框架test
与test$lat
和test$lon
作为一系列点 . 您只需将等式中的每一个替换为等式:并且它将返回0,1的2和3的向量
请确保先以正确的格式获得它! Here is a link to the function page:
我无法在
?pnt.in.poly
的文档中明确说明它,但看起来lng
和lat
列的排序很重要 . 您需要在pol
中交换列顺序并且它有效 .在空间goemetry中,
lng
通常被认为是x-axis
,lat
是y-axis
,你会看到它在你的plot()
中被颠倒了