如何找到一个多边形到同层其他多边形的最小距离?
我在尝试找出在ArcGIS中,如何计算一个多边形到同一层中其他多边形的最小距离。更具体来说,我想知道是否可以用Python写一个循环,来找出每个多边形到其他多边形的最小距离?
谢谢,
Rajib
2 个回答
0
在ArcGIS工具箱里,有一个叫做的工具:
http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00080000001q000000.htm
3
如果你已经知道多边形的中心坐标,其实自己做这个事情很简单。首先,你需要一个函数来计算两个相同维度点之间的距离:
def euclid(pt1, pt2):
pairs = zip(pt1, pt2) # Form pairs in corresponding dimensions
sum_sq_diffs = sum((a - b)**2 for a, b in pairs) # Find sum of squared diff
return (sum_sq_diffs)**(float(1)/2) # Take sqrt to get euclidean distance
接着,你可以写一个函数来找出一组点中离你最近的那个点。可以直接用 min()
函数,并加一个简单的自定义关键函数:
# Returns the point in vec with minimum euclidean distance to pt
def closest_pt(pt, vec):
return min(vec, key=lambda x: euclid(pt, x))
如果你有多边形的顶点,那就稍微复杂一点,但只要一步一步来就能搞定。你最外层的循环应该遍历你“基础”多边形中的点(也就是你想找最小距离的那个多边形)。在这个循环里面,你再嵌套一个循环,去查看你比较的其他多边形。然后你可以直接调用 closest_pt()
函数,把基础点和这个其他多边形中的所有点进行比较,找出最近的那个点:
def closest_poly(basis, vec):
closest = []
for (i, pt) in basis:
closer = []
for poly in vec:
closer.append(closest_pt(pt, poly))
closest.append(closest_pt(pt, closer))
best = min(enumerate(closest), key=lambda x: euclid(basis[x[0]], x[1]))
return (best[0], best[1], [best[1] in poly for poly in vec])
虽然结构上可能有点重复,但我觉得这样做是可行的,而且逻辑也很清晰。这个函数会返回一对 (vertex, close_pt, polys)
,其中:vertex
是在你的基础多边形中找到的离其他多边形最近的顶点的索引;close_pt
是在其他多边形中找到的最近的点;而 polys
是一个布尔值列表,和你 vec
中的多边形对应,只有当 close_pt
是 vec[i]
的一个顶点时,polys[i]
才会是 True
。
希望这些对你有帮助。