Genere una tabla cercana para x número de vecinos usando arcpy

9

Hay 3 escenarios probables para los que estoy tratando de capturar distancias cercanas:

  1. Una estación de metro de intercambio, que tiene 2 o más estaciones vecinas. Es decir, la estación en cuestión conecta 2 o más rutas principales y tiene 2 o más estaciones vecinas.
  2. Una estación de metro terminal, que tiene solo 1 estación vecina. Esta es la estación al final de la línea.
  3. Una estación de metro en línea, que tiene exactamente 2 estaciones vecinas, una de cada aproximación.

Estoy tratando de calcular un valor que se podría llamar "distancia promedio entre estaciones vecinas"

El arcpy.GenerateNearTable_analysis()puede manejar dos opciones: Distancia a la entidad más cercana, y la distancia entre todas las funciones.

¿Alguien tiene un método inteligente para resolver estos escenarios? Tenga en cuenta que cada estación se designa como "Intercambio", "Terminal" o "En línea" en la tabla de atributos bajo el campo "Tipo de estación".

Adicional:

Aquí hay un código psuedo basado en la sugerencia de @ whuber en los comentarios. Todavía no tengo tiempo para resolver esto, así que si alguien quiere apuñalarlo, ¡se lo recompensará con una marca de verificación! ;)

He echado un vistazo a la biblioteca NetworkX y parece funcionar como quiero.

Dado el gráfico:

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

así como los nodos y enlaces:

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
fuente
Supongo que también puedo mencionar que estoy usando ArcGIS 10.1 y me encanta el módulo arcpy.da (por su velocidad). Espero que podamos usar esto.
Michael Markieta
3
FWIW esto es puramente un problema de teoría de gráficos con una solución estándar: busca el gráfico de vecindad de cada vértice. Está disponible casi de inmediato tan pronto como represente la red en un formato estándar, como un DCEL (o una generalización si la red no es plana). Esto sugiere que algunas soluciones Python listas para usar podrían estar disponibles.
whuber

Respuestas:

5

Creo que su problema, como @whuber, sugirió que se representaría mejor en una Matriz de adyacencia . Es decir, si tiene el tiempo y la inclinación para comprender la teoría detrás de esto, en lugar de confiar en un paquete para hacer el trabajo por usted.

Para un gráfico dado G, con vértices de {v 1 , v 2 , ..., v n } donde n es el número de vértices, debe crear una matriz de tamaño M i, j donde i = ny j = norte. Cada vértice se representa en la i- ésima fila por el número de caminos encontrados a las vértices adyacentes en la j- ésima columna.

Ejemplo a continuación:

ingrese la descripción de la imagen aquí

Dada esta forma ligeramente compleja de representar sus datos relativamente simples, necesitará numerar sus vértices de manera arbitraria, no representativa de ningún orden lógico.

NOTA: Suponiendo que no haya bucles de estación sobre sí misma, una fila k nunca tendrá un valor distinto de 0 en la columna k th Todas las definiciones a continuación suponen que esto es cierto

NOTA: Suponiendo que no hay líneas concurrentes entre la misma estación, todos los ejemplos a continuación suponen que el valor de una celda solo será 1 o 0. El ejemplo anterior también supone que se permite el desplazamiento bidireccional.

Reglas para identificar categorías de estaciones:

1. Terminal

Un terminal se identificaría por una fila k que tiene una sola columna que no tiene un valor de 0, y cuyo valor es 1. Ver vértices 1, 2 y 3 en el ejemplo 1 anterior.

2. Unión

Una unión se identificaría mediante una fila k que tiene más de dos columnas que contienen un valor de 1. Vea el vértice 4 en el ejemplo 1 anterior, alternativamente todos los vértices en el ejemplo 3 anterior.

3. en línea

Una estación en línea se significa teniendo exactamente 2 columnas en una fila número k donde el valor es 1. Vea todas las vértices en el ejemplo 2 anterior. (Ignore el hecho de que {v 1 , v 3 } se cruza {v 2 , v 4 }).

nagytech
fuente
¿Quién eres y de dónde vienes? Esa fue una de las mejores respuestas que he recibido en mucho tiempo. Gracias @Geoist.
Michael Markieta
@MichaelMarkieta Divertida historia, acabo de enterarme de esto no 2 horas antes de ver tu publicación.
nagytech
1

Puedes intentar usar Shapely . Si convierte sus puntos de arco en puntos bien formados, puede calcular la distancia entre puntos individuales.

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
Ciro
fuente
Debo mencionar que Shapely solo se puede usar para entidades en un plano cartesiano, por lo que este método no funcionará si sus datos están en coordenadas geográficas.
Cyrus
Esta respuesta sugiere una ambigüedad en cómo se podría entender la pregunta. He leído la pregunta que indica que se conocen las distancias ; su cálculo no parece ser el problema. Lo que busca el OP, creo, es un algoritmo para identificar un número variable de vecinos inmediatos de vértices a lo largo de una red, para luego recuperar sus distancias y calcular un resumen estadístico de ellas (como un promedio).
whuber
@whuber ¡Uy! De acuerdo, respondí la pregunta con demasiada rapidez.
Cyrus
@whuber está en la marca.
hhart
Esto no funcionará para mí, pero gracias!
Michael Markieta