检查地理点是否在多边形的内部或外部

2024-05-19 01:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python,我已经在地图上定义了多边形的纬度和经度。 我的目标是检查坐标P的一般点x,y是否落在这样的多边形内。因此,我希望有一个函数,允许我检查这样的条件,并返回TrueFalse,如果点在多边形的内部或外部。

enter image description here

在这个例子中,点在外面,所以结果是False

问题:是否有库/包可以实现我的目标?如果是,你推荐哪一个?你能举个小例子说明如何使用它吗?

这是我到目前为止写的代码:

import numpy as np

# Define vertices of polygon (lat/lon)
v0 = [7.5, -2.5] 
v1 = [2, 3.5]
v2 = [-2, 4]
v3 = [-5.5, -4]
v4 = [0, -10]
lats_vect = np.array([v0[0],v1[0],v2[0],v3[0],v4[0]])
lons_vect = np.array([v0[1],v1[1],v2[1],v3[1],v4[1]])

# Point of interest P
x, y = -6, 5 # x = Lat, y = Lon

## START MODIFYING FROM HERE; DO NOT MODIFY POLYGON VERTICES AND DATA TYPE
# Check if point of interest falls within polygon boundaries
# If yes, return True
# If no, return False

为了绘制多边形和兴趣点,我使用了cartopy,并编写了以下代码行:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img() 

# append first vertex to end of vector to close polygon when plotting
lats_vect = np.append(lats_vect, lats_vect[0])
lons_vect = np.append(lons_vect, lons_vect[0])
plt.plot([lons_vect[0:-1], lons_vect[1:]], [lats_vect[0:-1], lats_vect[1:]],
         color='black', linewidth=1, 
         transform=ccrs.Geodetic(),
         )   

plt.plot(y, x, 
        '*',          # marker shape
        color='blue',  # marker colour
        markersize=8  # marker size
        )  

plt.show()  

注意:

  • 点是通过大圆圈相互连接的!
  • 我在实习中研究过,最后发现了一些类似的问题,但是我没有成功,因为它们都使用了我没有的.shp文件。

Tags: ofimportfalseasnppltv3多边形
2条回答

另一种方法是使用这个链接中解释的奇偶算法https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html在wikipedia中给出了python代码https://en.wikipedia.org/wiki/Even–odd_rule

各位,请记住,使多边形重要的点的顺序!我是说,不同的顺序会产生不同的多边形。

这是解决我问题的可能办法。

  1. 地理坐标必须妥善保存。示例np.array([[Lon_A, Lat_A], [Lon_B, Lat_B], [Lon_C, Lat_C]])
  2. 创建多边形
  3. 创建要测试的点
  4. 使用polygon.contains(point)测试点是在多边形的内部(True)还是外部(False)。

下面是代码中缺少的部分:

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

lons_lats_vect = np.column_stack((lons_vect, lats_vect)) # Reshape coordinates
polygon = Polygon(lons_lats_vect) # create polygon
point = Point(y,x) # create point
print(polygon.contains(point)) # check if polygon contains point
print(point.within(polygon)) # check if a point is in the polygon 

注意:多边形显然没有考虑大循环,因此有必要将边分割成多个分段,从而增加顶点数。

相关问题 更多 >

    热门问题