重新排列数组包含端点以在Python中创建闭合多边形

时间:2016-07-02 05:09:12

标签: python matplotlib gis polygon matplotlib-basemap

出于某种目的,我想将基于多个纬度和经度的多边形绘制为组合在一起的端点。

示例数据显示如下:

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_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,        ]  

图中显示如下:

enter image description here

所以,这是我的问题。有时,原始端点不是可以输出闭合多边形的顺序。预先组织阵列是可行的方法。

我认为调整数组的顺序如 bo_x bo_y 必须遵循两个原则:

  • 这两个数组中的元素应该同步调整,以便不破坏端点对(X~Y)

  • 新阵列应在二维空间上以顺时针或逆时针顺序排列。

任何建议或指导都将不胜感激。

2 个答案:

答案 0 :(得分:1)

尚未回答,但我需要能够附加图片。

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

polygon 1 polygon2

你想要一个吗?

答案 1 :(得分:1)

这是一种通过线性代数解决所需问题的方法。对不起,我只写了一般指导原则。尽管如此,它应该有效。

  1. 编写一个接受两个边数j和k的函数,并检查是否存在交点。请注意,您需要正确处理最后到第一个顶点边缘。您还需要确保在调用相邻边时给出“False”,因为它们总是按定义相交。
  2. 现在知道两条边是否相交的方法是遵循一个小代数。从每个边缘提取其直线参数a和b y = a * x + b。然后通过等于a1 * x + b1 == a2 * x + b2求解两个边来找到交点x。如果两条边的交点x都在边的顶点的x之间,则两条边确实相交。

    1. 编写一个遍历所有边对的函数并测试交集。只有当没有交叉点时,多边形才是合法的。
    2. 接下来,您可以采用两种方法:

      1. 综合方法 - 遍历所有可能的顶点排列。测试交叉点的每个排列多边形。请注意,在排列时,您需要将x和y排列在一起。请注意,存在大量排列,因此这可能非常耗时。

      2. 贪婪逼近 - 只要还有交叉点,就越过边对组合,只要有交叉点,只需切换最后两个边坐标(展开交点)。然后重新开始重新遍历所有边对。重复此操作,直到没有其他交叉点。这应该非常快,但不会给出最好的多边形(例如,不会优化最大的多边形区域)

      3. 希望这会有所帮助......