2016-07-02 9 views
-1

出于某种目的,我想绘制一个基于多个经度和纬度的多边形作为组合在一起的端点。重新排列包含端点的数组以创建Python中的封闭多边形

示例性数据示出了这样的:

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) 

该图示出了这样的:

enter image description here

但当Lons阵列和Lats阵列不在逆时针顺序,并且阵列包含许多难以手动调整的项目。多边形输出可能显示不一致。

在这里,我瓦解bo_xbo_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,  ] 

图显示,如:

enter image description here

所以,这里是我的问题。有时,原始端点不能按顺序输出闭合的多边形。预先组织阵列是最好的选择。

我认为调整阵列的顺序一样bo_xbo_y必须遵循两个原则:在这两个阵列

  • 元素都应该是同步调整为目的,以不破端点对(X〜Y)

  • 新阵列应在2-D空间上以顺时针或逆时针顺序绘制。

任何意见或指导原则将不胜感激。

回答

1

还没有答案,但我需要能够附加图像。

问题可能不明确。例如,这两个合法的多边形具有相同的顶点。

polygon 1 polygon2

你想获得任何一个?

+0

哦,会有很多可能性!我没有想过这个! –

+0

如果输出可以显示任何可能性,那就太好了! –

1

这是一种解决线性代数所需的方法。对不起,但我只写了一般准则。尽管如此,它应该工作。

  1. 写一个函数,接受两个边数字j和k,并检查是否有交集。请注意,您需要正确处理最后到第一个顶点边缘。您还需要确保在调用相邻边时给出'False',因为它们总是按照定义相交。

现在知道两条边相交的方法是遵循一个小代数。通过y = a * x + b从每个边缘提取其直线参数a和b。然后通过等于a1 * x + b1 == a2 * x + b2求解两个边来找到交点x。如果两条边的交点x在边的顶点的x之间,那么两条边确实相交。

  1. 编写遍历所有边对的函数并测试交集。只有当不存在交点时,多边形才是合法的。

接下来,您可以去两种方法:

  1. 综合的方法 - 去了顶点的所有可能的排列。测试每个排列多边形的交点。请注意,排列时,您需要一起置换x和y。请注意,有很多排列组合,所以这可能非常耗时。贪婪的方法 - 只要仍然存在交叉点,则通过边对组合,并且只要存在交叉点,只需切换最后两个边的坐标(展开交点)即可。然后重新开始再次遍历所有边对。重复此操作,直到不再有交点。这应该相当快,但不会给最好的多边形(例如不会优化最大的多边形区域)

希望这有助于...