Wygeneruj tabelę zbliżoną dla x liczby sąsiadów za pomocą arcpy

9

Istnieją 3 prawdopodobne scenariusze, które próbuję uchwycić w bliskiej odległości dla:

  1. Stacja metra wymiany, która ma 2 lub więcej stacji sąsiednich. Oznacza to, że dana stacja łączy 2 lub więcej głównych tras i ma 2 lub więcej stacji sąsiednich.
  2. Terminalowa stacja metra, która ma tylko 1 stację sąsiednią. To jest stacja na końcu linii.
  3. Inline stacja metra, która ma dokładnie 2 sąsiednie stacje, jedno z obu podejść.

Próbuję obliczyć wartość, którą można nazwać „średnią odległością między sąsiednimi stacjami”

arcpy.GenerateNearTable_analysis()Może obsługiwać dwie opcje: odległość do najbliższego obiektu i odległość między wszystkimi funkcjami.

Czy ktoś ma sprytną metodę rozwiązania tych scenariuszy? Zauważ, że każda stacja jest oznaczona jako „Interchange”, „Terminal” lub „Inline” w tabeli atrybutów pod polem „StationType”.

Dodany:

Oto kod psuedo oparty na sugestii @ whuber w komentarzach. Nie mam jeszcze czasu, aby to rozgryźć, więc jeśli ktoś zechce go dźgnąć, zostaniesz nagrodzony znacznikiem wyboru! ;)

Brałem spojrzeć na NetworkX biblioteki i wydaje się działać tak jak chcemy.

Biorąc pod uwagę wykres:

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

a także węzły i linki:

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
Michał Markieta
źródło
Chyba mogę również wspomnieć, że korzystam z ArcGIS 10.1 i uwielbiam moduł arcpy.da (ze względu na jego szybkość). Mam nadzieję, że możemy to wykorzystać.
Michael Markieta
3
FWIW jest to czysto teoretyczny problem ze standardowym rozwiązaniem: szukasz wykresu sąsiedztwa każdego wierzchołka. Jest on dostępny niemal natychmiast, gdy tylko reprezentujesz sieć w standardowym formacie, takim jak DCEL (lub uogólnienie, jeśli sieć nie jest planarna). Sugeruje to, że niektóre gotowe rozwiązania Pythona mogą być dostępne.
whuber

Odpowiedzi:

5

Wierzę, że twój problem, jak sugerował @whuber, najlepiej byłby reprezentowany w Matrycy Adiakencji . To znaczy, jeśli masz czas i ochotę zrozumieć teorię, zamiast polegać na pakiecie, który wykona pracę za Ciebie.

Dla danego wykresu G z wierzchołkami {v 1 , v 2 , ..., v n }, gdzie n jest liczbą wierzchołków, musisz utworzyć macierz o rozmiarze Mi , j, gdzie i = n i j = n. Każdy wierzchołek jest następnie reprezentowany w i- tym rzędzie przez liczbę ścieżek znalezionych do sąsiednich wierzchołków w j- tej kolumnie.

Przykład poniżej:

wprowadź opis zdjęcia tutaj

Biorąc pod uwagę tę dość złożoną formę reprezentowania twoich stosunkowo prostych danych, będziesz musiał numerować swoje wierzchołki w dowolny sposób, nie reprezentujący żadnego logicznego porządku.

UWAGA: Zakładając, że nie zapętla się stacja, k- ty rząd nigdy nie będzie miał wartości innej niż 0 w k- tej kolumnie. Wszystkie poniższe definicje zakładają, że to prawda

UWAGA: Zakładając, że nie ma równoczesnych linii między tą samą stacją, we wszystkich poniższych przykładach założono, że wartość komórki zawsze będzie wynosić 1 lub 0. W powyższym przykładzie założono również, że dwukierunkowy przesuw jest dozwolony.

Zasady identyfikowania kategorii stacji:

1. Terminal

Terminal byłby identyfikowany przez k- ty rząd mający pojedynczą kolumnę, która nie ma wartości 0, a która to wartość wynosi 1. Patrz wierzchołki 1, 2 i 3 w przykładzie 1 powyżej.

2. Połączenie

Połączenie byłoby identyfikowane przez k- ty rząd mający więcej niż dwie kolumny zawierające wartość 1. Patrz wierzchołek 4 w przykładzie 1 powyżej, lub wszystkie wierzchołki w przykładzie 3 powyżej.

3. Inline

Stacja inline jest oznaczona przez posiadanie dokładnie 2 kolumn w k- tym rzędzie, gdzie wartość wynosi 1. Zobacz wszystkie wierzchołki w przykładzie 2 powyżej. (Zignoruj ​​fakt, że {v 1 , v 3 } przecina {v 2 , v 4 }).

nagytech
źródło
Kim jesteś i skąd pochodzisz! To była jedna z najlepszych odpowiedzi, jakie otrzymałem od dłuższego czasu. Dziękuję @Geoist.
Michael Markieta
@MichaelMarkieta zabawna historia, ja tylko dowiedziałem się o tym nie 2 godziny przed Widziałem swój post.
nagytech
1

Możesz spróbować użyć Shapely . Po przekonwertowaniu punktów arkowatych na punkty kształtne można obliczyć odległość między poszczególnymi punktami.

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
źródło
Powinienem wspomnieć, że Shapely może być używany tylko dla obiektów na płaszczyźnie kartezjańskiej, więc ta metoda nie zadziała, jeśli dane są we współrzędnych geograficznych.
Cyrus,
Ta odpowiedź sugeruje dwuznaczność sposobu rozumienia pytania. Przeczytałem pytanie, ponieważ wskazuje, że odległości są znane; ich obliczenia nie wydają się być problemem. Uważam, że OP poszukuje algorytmu do identyfikacji zmiennej liczby bezpośrednich sąsiadów wierzchołków wzdłuż sieci, do końca, a następnie pobrania ich odległości i obliczenia ich statystycznego podsumowania (takiego jak średnia).
whuber
@whuber Ups! Zgadzając się, odpowiedziałem na to pytanie zbyt pochopnie.
Cyrus
@ whuber jest na znaku.
hhart,
To mi nie zadziała, ale dzięki!
Michael Markieta