这个点是否位于多边形内?
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
的文档中看不到它的明确说明,但 lng
和 lat
列的顺序似乎很重要。您需要交换 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-axis
,lat
被认为是 y-axis
,您会在 plot()
我没有使用过您正在使用的方法,但我有一个来自 sp
的方法,它可以完美地处理您的点和多边形。
我挑选了您的代码,并将 lat
和 lon
作为向量,将点坐标作为值,以满足功能要求。
但是您可以轻松地制作一个数据框并将列明确用作 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)
它会 return 一个由 0、1、2 和 3 组成的向量
请确保您首先以正确的格式获取它!
Here is a link to the function page:
非常简单的情况:一个多边形定义了一个地理区域,我想知道它的 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
的文档中看不到它的明确说明,但 lng
和 lat
列的顺序似乎很重要。您需要交换 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-axis
,lat
被认为是 y-axis
,您会在 plot()
我没有使用过您正在使用的方法,但我有一个来自 sp
的方法,它可以完美地处理您的点和多边形。
我挑选了您的代码,并将 lat
和 lon
作为向量,将点坐标作为值,以满足功能要求。
但是您可以轻松地制作一个数据框并将列明确用作 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)
它会 return 一个由 0、1、2 和 3 组成的向量
请确保您首先以正确的格式获取它! Here is a link to the function page: