1

我试图弄清楚如何在 ArcGIS 的一个图层(一个图层由许多多边形组成)中找到一个多边形到其他多边形的最小距离。更具体地说,我想知道是否可以用 python 运行一个循环,它会找到每个多边形到其他多边形的最小距离?

谢谢,拉吉布

4

2 回答 2

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

然后你可以创建一个函数来找到一个向量(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]

希望这会有所帮助。

于 2011-07-28T19:11:24.793 回答
0

arcgis 工具箱中有一个名为: http ://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00080000001q000000.htm 的工具

于 2012-01-06T16:29:01.940 回答