我试图弄清楚如何找到ArcGIS中图层(一个图层由多个多边形组成)中的一个多边形到其他多边形的最小距离。更具体一点,我想知道是否可以运行python循环,它将找到从每个多边形到其他多边形的最小距离?
谢谢, Rajib
答案 0 :(得分:2)
如果你有多边形的中心坐标,你可以很容易地自己做这个。首先,您需要一个函数来查找相同尺寸的两个点之间的距离:
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]
的顶点时才会{{1}}
希望这有用。
答案 1 :(得分:0)