5 votos

Arcpy: Nombres y distancias de las carreteras que se cruzan más cercanas en la capa 1 a los puntos finales de un segmento de carretera desde la capa 2

Como se muestra en la imagen de abajo, me gustaría volver de un nuevo campo en la capa 2, que para cada segmento de tiendas de una cadena:"Road C, 1 km from Road A to 0.5km From Road B".

Cálculo de las distancias, podría ser considerado opcional; sin embargo, debe ser capaz de regresar a la carretera más cercana nombre a cada uno de los segmentos de los vértices. Los nombres son sólo un atributo de la Carretera C.

Si no hay ningún camino más cercano en el lateral del extremo (callejón sin salida), a continuación, la secuencia de comandos debe regresar None.

image showing location of segment from layer 2 with respect to layer 1.

Lo que he podido hacer hasta ahora es generar un más cercano de la tabla que me da más cercano, FeatureID. Me uno a la Capa 1 y devolver un nombre; sin embargo, esa no me la distancia o la carretera más cercana en el otro extremo.

Tenga en cuenta que todos estos caminos son parte del sistema de referencia lineal

EDIT 1:

la solución no puede captar la intersección de la carretera que está dentro de la "verde" de la carretera de los límites.

4voto

pd. Puntos 755

Podrías probar algo como esto:

enter image description here

para el escenario mostrado arriba, el siguiente guion

 import arcpy

roads1 = #path to roads layer 1
roads2 = #path to roads layer 2

r1 = [row for row in arcpy.da.SearchCursor(roads1,["SHAPE@","NAME"])]

#add field to hold required string
arcpy.AddField_management(roads2,"COMMENTS","TEXT")

with arcpy.da.UpdateCursor(roads2,["SHAPE@","NAME","COMMENTS"]) as cursor:
    for r in r1:
        for row in cursor:
            if r[0].contains(row[0]):
                print "{0} contains {1}".format(r[1],row[1])

            #start = arcpy.PointGeometry(row[0].firstPoint)
            #end = arcpy.PointGeometry(row[0].lastPoint)

            #road segments connected to the road segment from layer 1 that "contains"
            # a segment from layer 2
            connected_segments = [x for x in r1 if x[0].touches(r[0])]

            #find closest road segments
            #closest_seg_to_start = [[y[1],y[0].queryPointAndDistance(start)[2]] for y in connected_segments if len(connected_segments)]
            #closest_seg_to_end = [[y[1],y[0].queryPointAndDistance(end)[2]] for y in connected_segments if len(connected_segments)]

            closest_seg_to_start = [[y[1],y[0].distanceTo(row[0].firstPoint)] for y in connected_segments if len(connected_segments)]
            closest_seg_to_end = [[y[1],y[0].distanceTo(row[0].lastPoint)] for y in connected_segments if len(connected_segments)]

            if len(closest_seg_to_start):
                start_min_dist = min([x[1] for x in closest_seg_to_start])
                start_seg_name = [x[0] for x in closest_seg_to_start if x[1]== start_min_dist][0]
                print "{0} is {1}km from start point of {2}".format(start_seg_name,round(start_min_dist/1000.0,2),row[1])

            if len(closest_seg_to_end):
                end_min_dist = min([x[1] for x in closest_seg_to_end])
                end_seg_name = [x[0] for x in closest_seg_to_end if x[1]== end_min_dist][0]
                print "{0} is {1}km from end point of {2}".format(end_seg_name,round(end_min_dist/1000.0,2),row[1])

                comment = "{0},{1}km from {2} to {3}km from {4}".format(r[1],round(start_min_dist/1000.0,2),start_seg_name,round(end_min_dist/1000.0,2),end_seg_name)
                print comment
                row[2] = comment #add string to field

        cursor.updateRow(row)
 

produce estos resultados:

enter image description here

enter image description here

1voto

Ricardo Reyes Puntos 3428

No tengo acceso a ArcPy en el momento, pero si usted es feliz trabajando en ese medio, entonces creo que usted será capaz de código es bastante fácil.

Ahora, mi suposición es que se puede utilizar la carretera de la línea de los extremos, y usted no necesita hacer cualquier red transversal con el fin de construir una razonable modelo. Haciendo una red de recorrido sería un poco más difícil. He aquí algunos pseudo código, aunque, para una versión básica que debería funcionar:

  1. Identificar todo el camino de la línea de los extremos en el conjunto de datos, o en la vecindad de su sección si eso es demasiado intensiva de recursos
  2. Excluir de la carretera de la línea que se cruza con su segmento de interés
  3. Buscar en todos los puntos extremos de las líneas de la carretera (de 1) para encontrar el más cercano a uno a cada extremo del segmento de interés
  4. la tienda de la carretera de IDENTIFICACIÓN y nombre de la carretera y la distancia en su segmento.

Usted necesitará algunas calificación de 3 en orden de trabajo si usted está en el final de un camino. Tal vez usted compruebe el tramo de carretera de la sección completa para identificar otros caminos que la toque, que podría ser su filtro en 3 lugar de buscar en todos por la distancia?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X