2011-07-28 2 views
1

J'ai essayé de comprendre comment trouver les distances min d'un polygone à d'autres polygones d'un calque (un calque est constitué de plusieurs polygones) d'ArcGIS. Plus précisément, je me demandais s'il était possible d'exécuter une boucle avec python, qui va trouver les distances min de chaque polygone à d'autres?trouver les distances min d'un polygone à d'autres polygones dans une couche?

Merci, Rajib

Répondre

2

Si vous avez les coordonnées du centre de vos polygones, il est illustratably facile de le faire sur votre propre. D'abord, vous avez besoin d'une fonction pour trouver la distance entre deux points de mêmes dimensions:

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 

Ensuite, vous pouvez faire une fonction pour trouver le point le plus proche parmi un vecteur (list ou autre) de points. Je voudrais simplement appliquer la fonction min() avec une commande rapide fonction clé:

# 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)) 

Si vous avez les sommets du polygone c'est deux étapes plus complexe, mais facile à comprendre si vous prenez étape par -étape. Votre boucle la plus extérieure devrait parcourir les points de votre polygone de base (celui auquel vous essayez de trouver la distance minimale). La boucle imbriquée dans celle-ci devrait vous conduire à chacun des autres polygones de votre vecteur de comparaison. De là, vous pouvez simplement appeler la fonction closest_pt() pour comparer votre point de base à tous les points dans cet autre polygone, trouvant le plus proche:

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]) 

Il peut être structurellement peu redondant, mais je pense que cela va fonctionner et fournit une logique assez transparente. La fonction renvoie une paire de (vertex, close_pt, polys), où: vertex est l'index du sommet de votre base qui s'est avéré le plus proche d'un autre polygone; close_pt est le point dans l'autre polygone qui a été trouvé pour contenir le point le plus proche; et polys est une liste de valeurs booléennes correspondant aux polygones de votre vec, telle que chaque polys[i] == True si et seulement si close_pt est un sommet de vec[i].

J'espère que cela vous sera utile.

Questions connexes