出于某种目的,我想将基于多个纬度和经度的多边形绘制为组合在一起的端点。
示例数据显示如下:
fig=plt.figure()
ax = plt.gca()
x_map1, x_map2 = 114.166,114.996
y_map1, y_map2 = 37.798,38.378
map = Basemap(llcrnrlon=x_map1,llcrnrlat=y_map1,urcrnrlon=x_map2,urcrnrlat=y_map2)
map.drawparallels(np.arange(y_map1+0.102,y_map2,0.2),labels=[1,0,0,1],size=14,linewidth=0,color= '#FFFFFF')
map.drawmeridians(np.arange(x_map1+0.134,x_map2,0.2),labels=[1,0,0,1],size=14,linewidth=0)
bo_x = [114.4390022, 114.3754847, 114.3054522, 114.3038236, 114.2802081, 114.2867228, 114.3378847, 114.3888619, \
114.6288783, 114.6848733, 114.7206292, 114.7341219]
bo_y = [38.16671389, 38.14472722, 38.14309861, 38.10156778, 38.08853833, 38.06980889, 38.03587472, 37.96409056, \
37.84975278, 37.84840333, 37.9017, 38.16683306]
x, y = map( bo_x, bo_y )
xy = zip(x,y)
poly = Polygon( xy, facecolor='red', alpha=0.4 )
plt.gca().add_patch(poly)
该图显示如下:
但是Lons
数组和Lats
数组不在逆时针顺序中,并且数组包含许多难以手动调整的项目。多边形输出可能显示不一致。
在这里,我将 bo_x 和 bo_y 整理为虚拟情况。
bo_x_adjust = [114.4390022, 114.3754847, 114.3054522, 114.3038236, 114.6288783, 114.6848733, 114.7206292, 114.7341219,
114.2802081, 114.2867228, 114.3378847, 114.3888619, ]
bo_y_adjust = [38.16671389, 38.14472722, 38.14309861, 38.10156778, 37.84975278, 37.84840333, 37.9017, 38.16683306,
38.08853833, 38.06980889, 38.03587472, 37.96409056, ]
图中显示如下:
所以,这是我的问题。有时,原始端点不是可以输出闭合多边形的顺序。预先组织阵列是可行的方法。
我认为调整数组的顺序如 bo_x 和 bo_y 必须遵循两个原则:
这两个数组中的元素应该同步调整,以便不破坏端点对(X~Y)
新阵列应在二维空间上以顺时针或逆时针顺序排列。
任何建议或指导都将不胜感激。
答案 0 :(得分:1)
答案 1 :(得分:1)
这是一种通过线性代数解决所需问题的方法。对不起,我只写了一般指导原则。尽管如此,它应该有效。
现在知道两条边是否相交的方法是遵循一个小代数。从每个边缘提取其直线参数a和b y = a * x + b。然后通过等于a1 * x + b1 == a2 * x + b2求解两个边来找到交点x。如果两条边的交点x都在边的顶点的x之间,则两条边确实相交。
接下来,您可以采用两种方法:
综合方法 - 遍历所有可能的顶点排列。测试交叉点的每个排列多边形。请注意,在排列时,您需要将x和y排列在一起。请注意,存在大量排列,因此这可能非常耗时。
贪婪逼近 - 只要还有交叉点,就越过边对组合,只要有交叉点,只需切换最后两个边坐标(展开交点)。然后重新开始重新遍历所有边对。重复此操作,直到没有其他交叉点。这应该非常快,但不会给出最好的多边形(例如,不会优化最大的多边形区域)
希望这会有所帮助......