Générer une table proche pour x nombre de voisins en utilisant arcpy

9

Il y a 3 scénarios probables que j'essaie de capturer à proximité des distances:

  1. Une station de métro d'échange, qui a 2 stations voisines ou plus. C'est-à-dire que la station en question relie 2 routes principales ou plus et a 2 stations voisines ou plus.
  2. Une station de métro terminale, qui n'a qu'une seule station voisine. Voici la gare au bout de la ligne.
  3. Une station de métro en ligne, qui a exactement 2 stations voisines, l'une des deux approches.

J'essaie de calculer une valeur que l'on pourrait appeler "distance moyenne entre les stations voisines"

Le arcpy.GenerateNearTable_analysis()peut gérer deux options: Distance à l'entité la plus proche et Distance entre toutes les entités.

Quelqu'un a-t-il une méthode intelligente pour résoudre ces scénarios? Notez que chaque station est désignée comme "Interchange", "Terminal" ou "Inline" dans la table attributaire sous le champ "StationType".

Ajoutée:

Voici du code pseudo basé sur la suggestion de @ whuber dans les commentaires. Je n'ai pas encore le temps de comprendre cela, donc si quelqu'un veut essayer, vous serez récompensé par une coche! ;)

J'ai jeté un coup d'œil à la bibliothèque NetworkX et elle semble fonctionner comme je le souhaite.

Étant donné le graphique:

A —― B ―― C ―― D
     |
     E

ainsi que les nœuds et liens:

Nodes = ["A", "B", "C", "D", "E"]
Links = [("A", "B"), ("B", "C"), ("C", "D"), ("B", "E")]

def myFunction(node):
    identify the links that node belongs to
    count the number of links
    calculate the total link lengths
    divide the total link lengths by the number of links
    return someValue
Michael Markieta
la source
Je suppose que je peux également mentionner que j'utilise ArcGIS 10.1 et j'aime le module arcpy.da (pour sa vitesse). J'espère que nous pourrons l'utiliser.
Michael Markieta
3
FWIW il s'agit purement d'un problème de théorie des graphes avec une solution standard: vous recherchez le graphe de voisinage de chaque sommet. Il est disponible presque immédiatement dès que vous représentez le réseau dans un format standard, tel qu'un DCEL (ou une généralisation si le réseau n'est pas planaire). Cela suggère que certaines solutions Python prêtes à l'emploi peuvent être disponibles.
whuber

Réponses:

5

Je crois que votre problème, comme @whuber, a suggéré qu'il serait mieux représenté dans une matrice d'adjacence . Autrement dit, si vous avez le temps et l'envie de comprendre la théorie derrière elle, plutôt que de compter sur un package pour faire le travail pour vous.

Pour un graphe G donné, avec des sommets de {v 1 , v 2 , ..., v n } où n est le nombre de sommets, vous devez créer une matrice de taille M i, j où i = n et j = n. Chaque sommet est alors représenté dans la i ème ligne par le nombre de chemins trouvés vers les sommets adjacents dans la j ème colonne.

Exemple ci-dessous:

entrez la description de l'image ici

Étant donné cette forme légèrement complexe de représentation de vos données relativement simples, vous devrez numéroter vos sommets de manière arbitraire, non représentative d'un ordre logique.

REMARQUE: En supposant qu'aucune station ne boucle sur elle-même, une k ème ligne n'aura jamais une valeur autre que 0 dans la k ème colonne. Toutes les définitions ci-dessous supposent que cela est vrai

REMARQUE: en supposant qu'il n'y a pas de lignes simultanées entre la même station, tous les exemples ci-dessous supposent qu'une valeur de cellule ne sera jamais que 1 ou 0. L'exemple ci-dessus suppose également que le déplacement bidirectionnel est autorisé.

Règles d'identification des catégories de stations:

1. Terminal

Un terminal serait identifié par une k ème ligne ayant une seule colonne qui n'a pas de valeur 0 et dont la valeur est 1. Voir les sommets 1, 2 et 3 dans l'exemple 1 ci-dessus.

2. Jonction

Une jonction serait identifiée par une k ème ligne ayant plus de deux colonnes contenant une valeur de 1. Voir le sommet 4 dans l'exemple 1 ci-dessus, ou tous les sommets dans l'exemple 3 ci-dessus.

3. Inline

Une station en ligne est signifiée en ayant exactement 2 colonnes dans une k ème ligne où la valeur est 1. Voir tous les sommets dans l'exemple 2 ci-dessus. (Ignorez le fait que {v 1 , v 3 } recoupe {v 2 , v 4 }.)

nagytech
la source
Qui êtes-vous et d'où venez-vous! C'était l'une des meilleures réponses que j'ai reçues depuis longtemps. Merci @Geoist.
Michael Markieta
@MichaelMarkieta Drôle d'histoire, je viens de l' apprendre pas 2 heures avant de voir votre message.
nagytech
1

Vous pourriez essayer d'utiliser Shapely . Si vous convertissez vos points arcpy en points galbés, vous pouvez calculer la distance entre les points individuels.

import arcpy
import shapely

arc_point1 = arcpy.Point(1,1)
arc_point2 = arcpy.Point(5,5)

shp_point1 = shapely.geometry.Point(arc_point1.X, arc_point1.Y)
shp_point2 = shapely.geometry.Point(arc_point2.X, arc_point2.Y)

distance = shp_point1.distance(shp_point2)
print "distance:", distance
Cyrus
la source
Je dois mentionner que Shapely ne peut être utilisé que pour les entités sur un plan cartésien, donc cette méthode ne fonctionnera pas si vos données sont en coordonnées géographiques.
Cyrus
Cette réponse suggère une ambiguïté dans la façon dont la question pourrait être comprise. J'ai lu la question comme indiquant que les distances sont connues; leur calcul ne semble pas être le problème. Ce que le PO cherche, je crois, c'est un algorithme pour identifier un nombre variable de voisins immédiats de sommets le long d'un réseau, pour ensuite récupérer leurs distances et en calculer un résumé statistique (comme une moyenne).
whuber
@whuber Oups! D'accord, j'ai répondu à la question un peu trop rapidement.
Cyrus
@whuber est sur la bonne voie.
hhart
Cela ne fonctionnera pas pour moi, mais merci!
Michael Markieta