找到一个多边形到层中其他多边形的最小距离?

时间:2011-07-28 18:25:06

标签: python iteration distance arcgis polygons

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

谢谢, Rajib

2 个答案:

答案 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_ptvec[i]的顶点时才会{{1}}

希望这有用。

答案 1 :(得分:0)