Genera vicino alla tabella per x numero di vicini usando arcpy


9

Ci sono 3 probabili scenari che sto cercando di catturare a distanza per:

  1. Una stazione della metropolitana di interscambio, che ha 2 o più stazioni vicine. Cioè, la stazione in questione collega 2 o più rotte principali e ha 2 o più stazioni vicine.
  2. Una stazione della metropolitana terminale, che ha solo 1 stazione vicina. Questa è la stazione alla fine della linea.
  3. Una stazione della metropolitana in linea, che ha esattamente 2 stazioni vicine, una di entrambi gli approcci.

Sto tentando di calcolare un valore che si potrebbe chiamare "distanza media tra stazioni vicine"

È arcpy.GenerateNearTable_analysis()possibile gestire due opzioni: Distanza dalla funzione più vicina e Distanza tra tutte le funzioni.

Qualcuno ha un metodo intelligente per risolvere questi scenari? Si noti che ogni stazione è designata come "Interscambio", "Terminale" o "In linea" nella tabella degli attributi sotto il campo "TipoTipo".

Inserito il:

Ecco qualche codice psuedo basato sul suggerimento di @ whuber nei commenti. Non ho ancora tempo per capirlo, quindi se qualcuno vuole accoltellarlo, verrai ricompensato con un segno di spunta! ;)

Ho dato un'occhiata alla libreria NetworkX e sembra funzionare come voglio.

Dato il grafico:

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

così come i nodi e i collegamenti:

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

Immagino di poter anche menzionare che sto usando ArcGIS 10.1 e adoro il modulo arcpy.da (per la sua velocità). Spero che possiamo usarlo.
Michael Markieta,

3
FWIW questo è puramente un problema teorico-grafico con una soluzione standard: cerchi il grafico di quartiere di ciascun vertice. È disponibile quasi immediatamente non appena si rappresenta la rete in un formato standard, come un DCEL (o una generalizzazione se la rete non è planare). Ciò suggerisce che potrebbero essere disponibili alcune soluzioni Python pronte all'uso.
whuber

Risposte:


5

Credo che il tuo problema, come suggerito da @whuber, sia meglio rappresentato in una matrice di adiacenza . Cioè, se hai il tempo e la propensione a capire la teoria che sta dietro, piuttosto che fare affidamento su un pacchetto per fare il lavoro per te.

Per un dato grafico G, con vertici di {v 1 , v 2 , ..., v n } dove n è il numero di vertici, devi creare una matrice di dimensione M i, j dove i = n e j = n. Ogni vertice viene quindi rappresentato nella i esima riga per il numero di percorsi risultata verticies adiacenti nella j esima colonna.

Esempio sotto:

inserisci qui la descrizione dell'immagine

Data questa forma lievemente complessa di rappresentare i tuoi dati relativamente semplici, dovrai numerare i tuoi vertici in modo arbitrario, non rappresentativo di alcun ordine logico.

NOTA: Assumendo nessun cicli stazione su se stesso, un k esima riga avrà mai un valore diverso da 0 nella k esima colonna. Tutte le definizioni seguenti presuppongono che ciò sia vero

NOTA: Supponendo che non vi siano linee simultanee tra la stessa stazione, tutti gli esempi seguenti presuppongono che un valore di cella sia sempre solo 1 o 0. L'esempio sopra presuppone anche che sia consentita la corsa bidirezionale.

Regole per identificare le categorie di stazioni:

1. Terminale

Un terminale verrebbe identificato da una ka riga avente una singola colonna che non ha un valore di 0 e il cui valore è 1. Vedi vertici 1, 2 e 3 nell'esempio 1 sopra.

2. Giunzione

Una giunzione verrebbe identificata da una ka riga con più di due colonne contenenti un valore di 1. Vedi vertice 4 nell'esempio 1 sopra, in alternativa tutti i vertici nell'esempio 3 sopra.

3. In linea

Una stazione in linea è indicata con esattamente 2 colonne in una ka fila dove il valore è 1. Vedi tutti i vertici nell'esempio 2 sopra. (Ignora il fatto che {v 1 , v 3 } interseca {v 2 , v 4 }.)


Chi sei e da dove vieni! Questa è stata una delle migliori risposte che ho ricevuto da molto tempo. Grazie @Geoist.
Michael Markieta,

@MichaelMarkieta Storia divertente, ne ho appena saputo non 2 ore prima di vedere il tuo post.
nagytech,

1

Potresti provare a usare Shapely . Se converti i tuoi punti arcpy in punti ben definiti, puoi calcolare la distanza tra i singoli punti.

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

Vorrei ricordare che Shapely può essere utilizzato solo per le funzioni su un piano cartesiano, quindi questo metodo non funzionerà se i tuoi dati sono in coordinate geografiche.
Ciro,

Questa risposta suggerisce un'ambiguità nel modo in cui la domanda potrebbe essere compresa. Ho letto la domanda perché indica che le distanze sono note; il loro calcolo non sembra essere il problema. Ciò che l'OP cerca, credo, è un algoritmo per identificare un numero variabile di vicini immediati di vertici lungo una rete, fino alla fine per poi recuperare le loro distanze e calcolare un loro sommario statistico (come una media).
whuber

@whuber Oops! D'accordo, ho risposto alla domanda un po 'troppo in fretta.
Ciro,

@whuber è nel segno.
Hhart,

Questo non funzionerà per me, ma grazie!
Michael Markieta,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.