ArcGIS 10: cree una capa lineal de eventos a partir de una capa de puntos basada en la direccionalidad

8

Tengo una capa de puntos que refleja los límites de velocidad y una capa de línea de las carreteras. La ubicación de la señal de velocidad indica en qué dirección se aplica el límite de velocidad.

¿Cómo puedo hacer una tabla de eventos lineales en la parte superior de la capa de carretera que refleje las velocidades? Entonces, para cada segmento, devuelve dos atributos de velocidad, uno para cada dirección.

Velocidad / capa de carretera

dassouki
fuente
¿Puede aclarar "La ubicación de la señal de velocidad indica en qué dirección se aplica el límite de velocidad"? ¿Significa esto que si el punto está en el lado derecho de la carretera (según la direccionalidad de la carretera), la velocidad se aplica al carril derecho? ¿Qué tan cerca de la carretera se encuentra el punto?
Stephen Lead
@StephenLead Sí, el punto de señalización se encuentra a 1 a 5 m de la capa de línea para indicar en qué dirección se aplica la velocidad
dassouki
¿Hay otros atributos almacenados con las señales de tráfico? Parece que tendrá que ajustarlos a las carreteras primero y luego transferir de alguna manera la direccionalidad de la carretera a las señales de tráfico, luego cortar las líneas por los vértices y transferir los valores de los atributos de las señales a cada segmento. Solo una idea. Podría ayudar si publicaste los datos.
Jakub Sisak GeoGraphics
@Jakub, el único atributo que quiero de la señal de tráfico es "post_speed". La capa de señal no tiene información sobre direccionalidad
dassouki
¿Los suspiros tienen otros atributos además de la velocidad? Lo pregunto porque podría haber algo que pueda vincular las señales con las carreteras. De lo contrario, lo que desea hacer no es posible sin ajustar manualmente las señales en los segmentos de la carretera, transferir atributos y dividir los segmentos de la carretera. (puede hacer esto programáticamente, pero las distancias son variables, por lo que es posible que no sea posible la automatización completa) El resultado no será una tabla independiente sino una tabla de atributos a la que se transferirá toda esta información.
Jakub Sisak GeoGraphics

Respuestas:

3

Para las capas de eventos de ruta lineal, debe crear una tabla que contenga la ID de la ruta y los valores m iniciales y finales.

Si sus carreteras no tienen valores m, puede crear rutas con la herramienta Crear rutas .

El segundo paso es extraer los valores m de sus carreteras para cada punto, lo que se puede hacer con la función de localización a lo largo de la carretera . Si veo bien en su figura, los puntos están ubicados en el mismo lado de la carretera si están en la misma dirección. Esto es genial porque luego tienes una distancia positiva o negativa que te dice de qué lado estás.

La forma más fácil del último paso es en Microsoft Excel:

  • Ordena tus puntos por roadIDy por signo de la distancia a la ruta
  • Agregue una nueva columna con el m-valuedel siguiente punto (o el punto anterior, dependiendo de la dirección).
  • Habrá un valor faltante al final que debe rellenarse con 0 o el máximo m-valuedel segmento.

EDITAR: después de ordenar, su tabla se verá así

 pointID RoadID mvalue dist speed
 15      2      25     1    80
 25      2      30     1    50
 87      2      45     12   70
 etc

Verá que los puntos están ordenados por valores m. La tercera columna en mi caso sería el comienzo del evento. la nueva capa de eventos debe tener un fromy un tocampo. Entonces, en mi ejemplo, se vería así:

pointID RoadID from to speed
15      2      25   30   80    
25      2      30   45   50    
87      2      45   max  70

en la otra dirección, sería

pointID RoadID from to speed    
15      2      0    25   80    
25      2      25   30   50    
87      2      30   45   70

A continuación, puede crear su capa de eventos utilizando la señal como campo de desplazamiento para ubicar la limitación de velocidad en el lado correcto de las rutas.

radouxju
fuente
Hasta ahora, esto funciona mejor que la otra solución. ¿Puede explicar la parte de Excel sobre agregar puntos anteriores y siguientes más por favor?
dassouki
3

No tengo suficiente representante para comentar, pero mi pregunta es si las carreteras ya están en segmentos que corresponden a las zonas de velocidad, es decir, cada segmento generalmente tendría 1 velocidad asociada por lado, o más de uno.

De todos modos, esta es mi sugerencia, aunque depende de que tengas un nivel de licencia que permita un búfer unilateral (avanzado / ArcInfo, creo). Un principio similar podría aplicarse con herramientas básicas, pero sería más complejo. Además, espero que esto tarde un tiempo en ejecutarse ...

import arcpy
def TakeOutTrash(dataset):
    if arcpy.Exists(dataset):
        arcpy.management.Delete(dataset)
roads = "path/to/roads" #make sure it's in a projected crs with meter units
buff_right = "path/to/new/buffer/feature/class1" #new gdb feature class
buff_left = "path/to/new/buffer/feature/class2" #new gdb feature class
arcpy.analysis.Buffer(roads,buff_right,6,"RIGHT","FLAT")
arcpy.analysis.Buffer(roads,buff_left,6,"LEFT","FLAT")

Ahora tiene amortiguadores para cada lado de cada carretera, que están a 6 metros de la línea central, que deben cubrir todas las señales. Puede hacer una selección fácil por ubicación para asegurarse de que este sea el caso, y si no, vuelva a ejecutar las operaciones de búfer con 1 o 2 metros adicionales.

Próximo:

final_dict = {}
buffers = [buff_right, buff_left]
for i, buffer in enumerate(buffers):
    rows1 = arcpy.SearchCursor(buffer)
    for row1 in rows1:
        final_dict[seg] = [[],[]]
        seg = str(row1.getValue("seg_num"))
        TakeOutTrash("fl")
        fl = arcpy.management.MakeFeatureLayer(buffer,"fl",'"seg_num" = ' + seg)
        arpcpy.management.SelectLayerByLocation(signs,"INTERSECT",fl)
        rows2 = arcpy.SearchCursor(signs)
        for row2 in rows2:
            final_dict[seg][i].append(row2.getValue("posted_speed"))

Entonces ahora tienes un diccionario en este formato:

"seg_num":[[list of speeds on the right],[list of speeds on the left]]

desde el cual puedes hacer lo que quieras, por ejemplo:

for k,v in final_dict.iteritems():
    print "road segment {0}:".format(str(k))
    print "   speeds on right: {0}".format(", ".join(v[0]))
    print "   speeds on left: {0}".format(", ".join(v[1]))

O simplemente pruebe cuántas velocidades hay a cada lado del segmento, o escríbalas en los campos de la clase de entidad de carreteras original, etc. Una vez más, no estoy seguro si esta podría ser una solución final con los datos que tiene, pero podría Ciertamente funciona como parte de ello. Pude ver que se usa junto con el proceso de ajuste / división descrito anteriormente.

Para escribir en la capa de carreteras, puede crear dos campos nuevos, SPD_RIGHT y SPD_LEFT, y por ahora (a menos que sepa con certeza que solo hay una velocidad por segmento), haga que sean campos de texto. Entonces:

urows = arcpy.UpdateCursor(roads)
for row in urows:
    seg = row.getValue("seg_num")
    right_speeds = ", ".join(final_dict[seg][0])
    left_speeds = ", ".join(final_dict[seg][1])
    row.setValue("SPD_RIGHT",right_speeds)
    row.setValue("SPD_LEFT",left_speeds)
    urows.updateRows(row)

Por supuesto, es ideal tener solo una velocidad por segmento, pero eso se remonta a la pregunta original de cómo se dividen los segmentos actualmente.

Sr. Adam
fuente
Ahora que tiene algún punto para comentar; ¿Dónde se coloca la capa de velocidad? ¿Entendí mal su comando de búfer?
dassouki
ok agregué un poco más a la respuesta. Espero entender lo que estás buscando.
Sr.
los segmentos y las velocidades podrían no dividirse de la misma manera ya que los datos son recopilados por dos entidades diferentes; Además, un segmento puede tener diferentes velocidades en cualquier dirección.
dassouki
Ok, ahora estoy pensando que la mejor manera de hacerlo es hacer primero un búfer del lado derecho, 6m o algo así, y luego seleccionar los signos que se encuentran dentro de eso y extraerlos a una nueva clase de entidad de puntos. De esa manera, podría tener una clase de entidad para las señales del lado derecho y una para las señales del lado izquierdo.
Sr.adam
La respuesta de Jakub en los comentarios es un buen lugar para comenzar en términos de definir buenos segmentos, y podría complementarse con la mía para vincular las velocidades con la dirección de la carretera.
Sr.