我试图弄清楚如何找到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_pt
是 vec[i]
的顶点。
希望这对您有所帮助。
关于python - 找到图层中一个多边形到其他多边形的最小距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6863800/