我正在使用python,并且已经在地图上定义了多边形的纬度和经度(以度为单位)。我的目标是检查通用P坐标点是否x,y落在此类多边形内。因此,我希望有一个函数可以检查这种情况并返回,True或者False该点在多边形内部还是外部。
P
x,y
True
False
在这个例子中,点在外面,所以结果是 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
这是我的问题的可能解决方案。
np.array([[Lon_A, Lat_A], [Lon_B, Lat_B], [Lon_C, Lat_C]])
polygon.contains(point)
这是代码的缺失部分:
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([(0, 0), (1, 0), (1, 1)]).contains(Point(0, 0)))
所以可以使用
print(polygon.touches(point)) # check if point lies on border of polygon