【发布时间】:2017-10-09 02:25:49
【问题描述】:
我正在使用 python,并且我已经在地图上定义了多边形的纬度和经度(以度为单位)。
我的目标是检查坐标x,y 的通用点P 是否落在这样的多边形内。因此,我希望有一个函数允许我检查这种情况,如果该点在多边形内部或外部,则返回 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()
注意:
- 点通过大圆圈相互连接!
- 我在互联网上进行了研究,最终发现了一些类似的问题like this one,但我没有成功,因为它们都使用了我没有的
.shp文件。
【问题讨论】:
-
尝试将此算法转换为 Python wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html#The C 代码
-
python 没有可以做任何事情的包。它有少量的预构建模块。软件包通常由社区提供。
-
多边形总是凸的吗?
-
一般不会,也可以是凹的
-
以防万一:您始终可以将光线从您的点投射到多边形任何边的中点。如果您的光线穿过多边形的边偶数次,则该点位于外侧。适用于凸多边形和凹多边形;使用测地线作为射线在球体表面(可能是任何 1 连通表面)上工作。当光线完全通过一个顶点时有边缘情况:您需要检查入射到顶点的边缘是否在光线的同一侧。
标签: python polygon coordinate-systems shapely point-in-polygon