2011-07-28 75 views
1

我試圖找出如何找到從一個多邊形到ArcGIS中一個圖層(一個圖層由多個多邊形組成)中的其他多邊形的最小距離。更具體一點,我想知道是否有可能用python運行一個循環,它會找到從每個多邊形到其他多邊形的最小距離?查找圖層中一個多邊形與其他多邊形的最小距離?

感謝, Rajib

回答

2

如果你已經得到了中心座標的多邊形,它的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_ptvec[i]的頂點時,每個polys[i] == True

希望這是有幫助的。

相關問題