我试图弄清楚如何在 ArcGIS 的一个图层(一个图层由许多多边形组成)中找到一个多边形到其他多边形的最小距离。更具体地说,我想知道是否可以用 python 运行一个循环,它会找到每个多边形到其他多边形的最小距离?
谢谢,拉吉布
如果您有多边形的中心坐标,那么您自己就可以很容易地做到这一点。首先,您需要一个函数来查找相同尺寸的两点之间的距离:
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
然后你可以创建一个函数来找到一个向量(list
或其他)点之间的最近点。我只需使用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
,这样每个polys[i] == True
当且仅当close_pt
是 的顶点vec[i]
。
希望这会有所帮助。
arcgis 工具箱中有一个名为: http ://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00080000001q000000.htm 的工具