这个点是否位于多边形内?

Does this point stand within a polygon?

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

为这个函数给出的例子对我有用,但这个简单的例子不...这是为什么?

我在 ?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-axislat 被认为是 y-axis,您会在 plot()

我没有使用过您正在使用的方法,但我有一个来自 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,它应该完全在你的地图显示的多边形内!使用这些类型的数据获得良好输出的关键是以正确的格式提供变量。

你可以很容易地得到一个数据框 dfdf$latdf$lon 作为两个多边形变量以及一个测试框架 testtest$lattest$lon 作为一系列点。您只需将等式中的每一个替换为:

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

它会 return 一个由 0、1、2 和 3 组成的向量

请确保您首先以正确的格式获取它! Here is a link to the function page: