我試圖找出如何找到從一個多邊形到ArcGIS中一個圖層(一個圖層由多個多邊形組成)中的其他多邊形的最小距離。更具體一點,我想知道是否有可能用python運行一個循環,它會找到從每個多邊形到其他多邊形的最小距離?查找圖層中一個多邊形與其他多邊形的最小距離?
感謝, Rajib
我試圖找出如何找到從一個多邊形到ArcGIS中一個圖層(一個圖層由多個多邊形組成)中的其他多邊形的最小距離。更具體一點,我想知道是否有可能用python運行一個循環,它會找到從每個多邊形到其他多邊形的最小距離?查找圖層中一個多邊形與其他多邊形的最小距離?
感謝, Rajib
如果你已經得到了中心座標的多邊形,它的illustratably容易做到這一點你自己。首先,你需要一個函數來找到相同尺寸的兩個點之間的距離:
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
中的多邊形相對應的布爾值的列表,使得當且僅當close_pt
是vec[i]
的頂點時,每個polys[i] == True
。
希望這是有幫助的。