2017-08-31 94 views
2

非常简单的情况:多边形定义了一个地理区域,我想知道它由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) 

示例所示为该函数给出的作品和我在一起,但这个简单的情况下,没有......这是为什么?

回答

3

我没用过,你所使用的方法,但我有一个在sp之内,在你的观点和多边形上完美无缺。

我樱桃挑选您的代码,并将latlon作为向量,并将点坐标作为值以适应功能要求。

但是,您可以轻松制作数据框,并明确将列用作纬度/经度值。

这里是它的要点:

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分严格LY外部多边形
  • 1点是严格内部多边形
  • 2点位于多边形的边的相对内部
  • 3点是多边形

的顶点作为你的点是1基于此,它应该完全位于地图显示的多边形内!使用这些类型的数据获得良好输出的关键是以正确的格式提供变量。

,你可以很容易有一个数据帧dfdf$latdf$lon作为两个多边形变量以及测试帧testtest$lattest$lon为一系列的点。你会刚刚替补每个那些等式中的这样:

point.in.polygon(df$lat, df$lon, test$lat, test$lon, mode.checked=FALSE) 

而且它会返回0的向量,1的2的和3的

只要确保你在正确的格式得到它第一次! Here is a link to the function page:

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 

在空间goemetry,lng通常被认为是为x-axislaty-axis,你会看到相反的plot()

相关问题