获取重叠纬度经度域

时间:2017-05-23 08:59:16

标签: python gis shapely

我有许多重叠的经度,纬度网格域。现在,我需要在这些域周围绘制“外线”,但我找不到合适的解决方案。所有这些都需要在python中完成,我正在进行数据处理和字段绘制(来自不同网格域的值的组合)。 我知道这可以通过postgresql + postgis以某种方式与域边界相交来实现,但我不想仅仅针对这个问题涉及数据库。

凸壳不是我想要的,因为这不会涵盖“问题的凹陷部分”。 在我看来,Alpha形状也不是正确的方式,因为它们不能提供定义明确的解决方案。显然这一切都取决于所选的alpha值。发现的例子,在这里:http://blog.thehumangeo.com/2014/05/12/drawing-boundaries-in-python/

我认为问题必须有一个明确定义的单一解决方案,因为我只是寻找通过lon / lat点定义的某些行的交集。

现在,为了更清楚,这里是一个人为的例子,我只创建两个域,连接它们以获得所有(两个)域的lon / lat点数组并尝试一些形状上的东西(因为这个似乎最有希望的):

import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import MultiPoint, Polygon

#two sample domains of longitudes and latitudes
dom1 = np.array([np.linspace(12.0,19.0,20), np.linspace(41.0,42.0,20)])
dom1 = np.append(dom1, [np.linspace(19.0,19.5,20), np.linspace(42.0,32.0,20)],axis=1)
dom1 = np.append(dom1, [np.linspace(19.5,11.5,20), np.linspace(32.0,31.0,20)],axis=1)
dom1 = np.append(dom1, [np.linspace(11.5,12.0,20), np.linspace(31.0,41.0,20)],axis=1)

dom2 = np.array([np.linspace(14.0,21.0,20), np.linspace(44.0,44.5,20)])
dom2 = np.append(dom2, [np.linspace(21.0,19.5,20), np.linspace(44.5,35.0,20)],axis=1)
dom2 = np.append(dom2, [np.linspace(19.5,14.,20), np.linspace(35.0,35.2,20)],axis=1)
dom2 = np.append(dom2, [np.linspace(14.,14.,20), np.linspace(35.2,44.0,20)],axis=1)

plt.plot(dom1[0,:],dom1[1,:],'k')
plt.plot(dom2[0,:],dom2[1,:],'r')         
plt.show()

下图显示了两个重叠的样本域。我现在对构建两个域的“外边界”的点集感兴趣(即,如果一个点沿着域边界行走(顺时针方向)并且总是在交叉点处左转)。 Plot of the two domains

#join the domains in one array
doms = np.hstack([dom1,dom2])

#convex hull
points = MultiPoint(zip(doms[0,:],doms[1,:]))
x,y = points.convex_hull.exterior.xy

plt.plot(doms[0,:],doms[1,:],'k.')
plt.plot(x,y,'ro-')
plt.show()

凸面船体缺少“内部”部件,并不是理想的解决方案: Convex hull is missing the inner part

#polygon boundary
poly = Polygon(zip(doms[0,:],doms[1,:]))
x1,y1 = poly.boundary.xy
plt.plot(doms[0,:],doms[1,:],'k.')
plt.plot(x1,y1,'go-')
plt.show()

尝试使用多边形边界也不会产生任何有用的东西: enter image description here

可以用来解决这个问题吗? 或者还有其他与gis相关的软件包可以提供帮助吗?

1 个答案:

答案 0 :(得分:1)

在我看来,你所追求的是两个多边形结合的外部边界:

import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import MultiPoint, Polygon

#two sample domains of longitudes and latitudes
dom1 = np.array([np.linspace(12.0,19.0,20), np.linspace(41.0,42.0,20)])
dom1 = np.append(dom1, [np.linspace(19.0,19.5,20), np.linspace(42.0,32.0,20)],axis=1)
dom1 = np.append(dom1, [np.linspace(19.5,11.5,20), np.linspace(32.0,31.0,20)],axis=1)
dom1 = np.append(dom1, [np.linspace(11.5,12.0,20), np.linspace(31.0,41.0,20)],axis=1)

dom2 = np.array([np.linspace(14.0,21.0,20), np.linspace(44.0,44.5,20)])
dom2 = np.append(dom2, [np.linspace(21.0,19.5,20), np.linspace(44.5,35.0,20)],axis=1)
dom2 = np.append(dom2, [np.linspace(19.5,14.,20), np.linspace(35.0,35.2,20)],axis=1)
dom2 = np.append(dom2, [np.linspace(14.,14.,20), np.linspace(35.2,44.0,20)],axis=1)

P = Polygon(dom1.T)
Q = Polygon(dom2.T)
P = P.union(Q)

dom3 = np.asarray(P.exterior.coords).T

plt.plot(dom1[0,:],dom1[1,:],'k')
plt.plot(dom2[0,:],dom2[1,:],'r')         
plt.plot(dom3[0,:],dom3[1,:],'go-')         
plt.show()

enter image description here