首页 文章

这一点是否在多边形内?

提问于
浏览
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)

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

2 回答

  • 2

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

    您可以轻松地将数据框 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:

  • 3

    我无法在 ?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() 中被颠倒了

相关问题