gpt4 book ai didi

python - 检查地理点是在多边形内部还是外部

转载 作者:行者123 更新时间:2023-12-03 02:28:22 26 4
gpt4 key购买 nike

我正在使用 python,并且已经定义了 map 上多边形的纬度和经度(以度为单位)。我的目标是检查坐标 x,y 的通用点 P 是否落在该多边形内。因此,我希望有一个函数,允许我检查这种条件,并在该点位于多边形内部或外部时返回 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()

注意:

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

最佳答案

这是我的问题的可能解决方案。

  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

注意:多边形不考虑大圆,因此需要将边分割成许多段,从而增加顶点数量。

<小时/> 特殊情况:如果点位于多边形的边界上

例如print(Polygon([(0, 0), (1, 0), (1, 1)]).contains(Point(0, 0)))将会失败

所以可以使用

print(polygon.touches(point)) # check if point lies on border of polygon 

关于python - 检查地理点是在多边形内部还是外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43892459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com