Generieren Sie mit arcpy eine Near-Tabelle für x Anzahl der Nachbarn


9

Es gibt 3 wahrscheinliche Szenarien, für die ich nahe Entfernungen erfassen möchte:

  1. Eine U-Bahnstation mit zwei oder mehr benachbarten Stationen. Das heißt, die betreffende Station verbindet zwei oder mehr Hauptstrecken und hat zwei oder mehr benachbarte Stationen.
  2. Eine U-Bahnstation, die nur eine benachbarte Station hat. Dies ist die Station am Ende der Linie.
  3. Eine Inline-U-Bahnstation mit genau 2 benachbarten Stationen, eine von beiden.

Ich versuche, einen Wert zu berechnen, den man als "durchschnittliche Entfernung zwischen benachbarten Stationen" bezeichnen könnte.

Der arcpy.GenerateNearTable_analysis()kann zwei Optionen verarbeiten: Abstand zum nächsten Merkmal und Abstand zwischen allen Merkmalen.

Hat jemand eine clevere Methode zur Lösung dieser Szenarien? Beachten Sie, dass jede Station in der Attributtabelle unter dem Feld "StationType" als "Interchange", "Terminal" oder "Inline" bezeichnet ist.

Hinzugefügt:

Hier ist ein Pseudo-Code, der auf dem Vorschlag von @ whuber in den Kommentaren basiert. Ich habe noch keine Zeit, dies herauszufinden. Wenn also jemand einen Stich machen möchte, werden Sie mit einem Häkchen belohnt! ;)

Ich habe mir die NetworkX- Bibliothek angesehen und sie scheint so zu funktionieren, wie ich es möchte.

Angesichts der Grafik:

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

sowie die Knoten und Links:

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

Ich denke, ich kann auch erwähnen, dass ich ArcGIS 10.1 verwende und das arcpy.da-Modul (wegen seiner Geschwindigkeit) liebe. Ich hoffe, dass wir das nutzen können.
Michael Markieta

3
FWIW dies ist ein rein graphentheoretisches Problem mit einer Standardlösung: Sie suchen den Nachbarschaftsgraphen jedes Scheitelpunkts. Es ist fast sofort verfügbar, sobald Sie das Netzwerk in einem Standardformat wie DCEL (oder einer Verallgemeinerung, wenn das Netzwerk nicht planar ist) darstellen. Dies deutet darauf hin, dass möglicherweise einige sofort einsatzbereite Python-Lösungen verfügbar sind.
whuber

Antworten:


5

Ich glaube, Ihr Problem, wie @whuber vorgeschlagen hat, sollte am besten in einer Adjacency Matrix dargestellt werden . Das heißt, wenn Sie die Zeit und die Neigung haben, die Theorie dahinter zu verstehen, anstatt sich auf ein Paket zu verlassen, um die Arbeit für Sie zu erledigen.

Für einen gegebenen Graphen G mit Eckpunkten von {v 1 , v 2 , ..., v n }, wobei n die Anzahl der Eckpunkte ist, müssen Sie eine Matrix der Größe M i, j mit i = n und j = erstellen n. Jeder Scheitelpunkt wird dann in der i- ten Zeile durch die Anzahl der Pfade dargestellt, die zu benachbarten Scheitelpunkten in der j- ten Spalte gefunden wurden.

Beispiel unten:

Geben Sie hier die Bildbeschreibung ein

Angesichts dieser leicht komplexen Form der Darstellung Ihrer relativ einfachen Daten müssen Sie Ihre Scheitelpunkte willkürlich nummerieren und nicht für eine logische Reihenfolge repräsentativ sein.

HINWEIS: Angenommen, es gibt keine Stationsschleifen für sich selbst, hat eine k- te Zeile niemals einen anderen Wert als 0 in der k- ten Spalte. Alle folgenden Definitionen setzen dies als wahr voraus

HINWEIS: Angenommen, es gibt keine gleichzeitigen Leitungen zwischen derselben Station, gehen alle folgenden Beispiele davon aus, dass ein Zellenwert immer nur 1 oder 0 ist. Im obigen Beispiel wird auch davon ausgegangen, dass eine bidirektionale Fahrt zulässig ist.

Regeln zur Identifizierung von Stationskategorien:

1. Terminal

Ein Terminal würde durch eine k- te Zeile mit einer einzelnen Spalte identifiziert, die keinen Wert von 0 hat und deren Wert 1 ist. Siehe Eckpunkte 1, 2 und 3 in Beispiel 1 oben.

2. Kreuzung

Ein Übergang würde durch eine k- te Zeile mit mehr als zwei Spalten identifiziert, die einen Wert von 1 enthalten. Siehe Scheitelpunkt 4 in Beispiel 1 oben, alternativ alle Scheitelpunkte in Beispiel 3 oben.

3. Inline

Eine Inline-Station wird durch genau 2 Spalten in einer k- ten Zeile mit dem Wert 1 angezeigt. Siehe alle Verticies in Beispiel 2 oben. (Ignorieren Sie die Tatsache, dass {v 1 , v 3 } {v 2 , v 4 } schneidet .)


Wer bist du und woher kommst du? Das war eine der besten Antworten, die ich seit langem erhalten habe. Vielen Dank, dass Sie @Geoist.
Michael Markieta

@MichaelMarkieta Lustige Geschichte, ich habe gerade erst 2 Stunden bevor ich deinen Beitrag gesehen habe davon erfahren.
Nagytech

1

Sie könnten versuchen, Shapely zu verwenden . Wenn Sie Ihre Bogenpunkte in formschöne Punkte umwandeln, können Sie den Abstand zwischen einzelnen Punkten berechnen.

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

Ich sollte erwähnen, dass Shapely nur für Features auf einer kartesischen Ebene verwendet werden kann, sodass diese Methode nicht funktioniert, wenn Ihre Daten in geografischen Koordinaten vorliegen.
Cyrus

Diese Antwort deutet auf eine Unklarheit im Verständnis der Frage hin. Ich habe die Frage so gelesen, dass die Entfernungen bekannt sind. Ihre Berechnung scheint nicht das Problem zu sein. Ich glaube, das OP sucht nach einem Algorithmus, mit dem eine variable Anzahl von unmittelbaren Nachbarn von Scheitelpunkten entlang eines Netzwerks identifiziert werden kann, um dann ihre Entfernungen abzurufen und eine statistische Zusammenfassung (z. B. einen Durchschnitt) zu berechnen.
whuber

@whuber Ups! Einverstanden beantwortete ich die Frage etwas zu hastig.
Cyrus

@whuber ist auf dem richtigen Weg.
Hhart

Das wird bei mir nicht funktionieren, aber danke!
Michael Markieta
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.