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

标签 python iteration distance arcgis polygons

我试图弄清楚如何找到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

然后你可以创建一个函数来查找点向量(列表或其他)中最近的点。我只需将 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 中的多边形相对应的 bool 值列表,这样每个 polys[i] == True 当且仅如果 close_ptvec[i] 的顶点。

希望这对您有所帮助。

关于python - 找到图层中一个多边形到其他多边形的最小距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6863800/

相关文章:

python - colocate_with 在 tensorflow 中有什么用?

javascript - 在 Google Maps Javascript API 中将距离转换为英里

c - 数组的迭代/递归搜索

r - 具有缺失值的向量之间的距离

algorithm - 运动物体的近似增量最近邻算法

python - 如何从 pandas 数据框中按降序条形图对值进行排序

python - 如果 setUpClass 抛出异常,如何使 python 单元测试失败

Python:即时重命名方法名称

c# - 您如何将其转换为迭代函数而不是使用嵌套循环递归?

java - 重复一个整数n次