2 votos

¿Cómo verificar si existe un vértice (en polilínea) basado en la ubicación de una capa de puntos utilizando ArcPy?

Usando ArcGIS for Desktop Advanced 10.1 (con todas las extensiones)

Estoy construyendo una red de líneas centrales que será utilizada por un programa de MapObjects para enrutamiento basado en "giros en cualquier vértice" (en lugar de giros solo en puntos finales...) Lo que estoy tratando de hacer es identificar los pasos superiores/pasos inferiores que tienen un vértice compartido con la carretera que lo cruza (pero no se considera una intersección) Si hay un vértice compartido, entonces el programa de mapeo hará (incorrectamente) un giro donde físicamente no es posible. Hasta el momento he construido una topología utilizando la regla "No debe intersectar (Línea)". Exporto los errores a una clase de entidad, y ahora tengo un montón de puntos en intersecciones que necesito verificar. Lo que me pregunto es si hay una manera de recorrer cada punto y verificar si existe un vértice donde la línea central intersecta el punto. Esto es lo que he desarrollado hasta ahora...

import arcpy

fcPoints = "C:/MiCapaDePuntos..."
fcCenterlines = "C:/MiCapaDeLineasCentrales..."

rows = arcpy.UpdateCursor(fcPoints)
for row in rows:
    # Para cada punto, seleccionar las líneas centrales que tocan (intersecan) ese punto
    arcpy.SelectLayerByAttribute_management(fcPoints, "NEW_SELECTION", "\"OBJECTID\" = " + str(row.getValue("OBJECTID")))
    arcpy.SelectLayerByLocation_management(fcCenterlines, "INTERSECT", fcPoints)
    # Necesito código aquí para recorrer cada línea central seleccionada y determinar si existe un vértice en la ubicación SHAPE@XY del punto?
    #PSEUDO CÓDIGO:
    for each line in selection:
        vertexExists = False
        for each vertex in line:
            if vertex.xy == point.xy:
                vertexExists = True

        # Si hay un vértice coincidente, entonces actualizar un campo en la capa de puntos para "FLAG"earlo...
        if vertexExists == True:
            row.setValue("FLAG", "VERIFICAR ESTA INTERSECCIÓN")
            cursor.updateRow(row)

¿O.... hay una manera más sencilla...? Estaría revisando alrededor de 2000 puntos...

2voto

John Kramlich Puntos 286

Una forma de lograr esto es "dividir" tu polilínea en sus vértices individuales utilizando la herramienta feature to vertices. Luego puedes ejecutar la herramienta Generate near table con esta capa en tu capa de puntos de intersección. Una distancia de cero indicaría que están en el mismo lugar.

Ambas herramientas requieren que tengas una licencia de nivel avanzado.

1voto

Hameno Puntos 129

Hornbydd tiene una respuesta válida por supuesto si tiene la licencia avanzada. Aquí está la solución alternativa si no la tiene:

  • Utilice el método Make Feature Layer en su capa de polilínea antes de sus métodos de selección, para almacenar las entidades seleccionadas.
  • Finalmente, para extraer los vértices de polilínea seleccionados (de la capa de entidades) y obtener sus coordenadas x/y para compararlas con su capa de puntos (valores de campo de coordenadas) puede consultar este fragmento de script en esta publicación en el foro:
updateRows = arcpy.UpdateCursor(lineFC) # para su situación un cursor de búsqueda servirá
for updateRow in updateRows: # recorriendo las líneas
   vertexList = []
   shapeObj = updateRow.getValue(shapeFieldName)
   partObj = shapeObj.getPart(0)
   for pointObj in partObj: 
      vertexList.append((pointObj.X, pointObj.Y))
      # continúe con su cursor de actualización en su capa de puntos

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