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

1 投票
2 回答
2882 浏览
提问于 2025-04-16 22:27

我在尝试找出在ArcGIS中,如何计算一个多边形到同一层中其他多边形的最小距离。更具体来说,我想知道是否可以用Python写一个循环,来找出每个多边形到其他多边形的最小距离?

谢谢,
Rajib

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

接着,你可以写一个函数来找出一组点中离你最近的那个点。可以直接用 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_ptvec[i] 的一个顶点时,polys[i] 才会是 True

希望这些对你有帮助。

撰写回答