¿Distinguir líneas que se cruzan de líneas que se tocan?

9

¿Cómo distingo entre estos casos en ArcGIS 10?

  • Caso 1 : Ambos puntos finales de una línea tocan otra línea
  • Caso 2 : Ambos puntos finales cuelgan sobre las líneas que cruza

Estoy mirando la función Trim Line pero eso no es lo que quiero (destructivo).

El caso de uso del mundo real es distinguir entre carreteras de servicio que conectan ambas carreteras de una autopista y otros casos de carreteras que se cruzan con autopistas.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

mvexel
fuente

Respuestas:

13

Para una sola característica a la vez, puede hacer esto de manera bastante interactiva usando el cuadro de diálogo normal Seleccionar por ubicación , usando la siguiente tecla como guía para los tipos de relación espacial para las superposiciones de línea en línea (desde Seleccionar por ubicación: ejemplos gráficos ):

imagen
(fuente: arcgis.com )

Seleccionar línea usando línea

INTERSECTA A, C, D, E, F, G, H, I, J

CONTIENE G, H

COMPLETAMENTE_CONTAINS G

CONTIENE_CLEMENTINI G, H

DENTRO DE F, H

COMPLETAMENTE_ DENTRO DE F

DENTRO DE CLEMENTINI F, H

ARE_IDENTICAL_TO H

BOUNDARY_TOUCHES C, E

Los tipos de relación relevantes en este caso son INTERSECTy BOUNDARY_TOUCHES. Como puede ver en el diagrama anterior, puede usar BOUNDARY_TOUCHESpara seleccionar las características que tocan un punto final de la línea. Si se seleccionan exactamente dos características, entonces tiene su Caso 1. Si una característica no es tocada por ninguna otra característica, sino que solo se cruza con ellas, entonces BOUNDARY_TOUCHESno seleccionará nada. INTERSECTseleccionará todas las entidades que se cruzan independientemente de si se tocan en un punto final o no. Entonces, si sabe que no hay características que toquen los puntos finales, pero encuentra que hay características que se cruzan, entonces tiene su Caso 2.

Para automatizar el proceso, puede usar el siguiente script de Python (implementar como una herramienta de script si lo desea) para calcular el número de toques e intersecciones para cada entidad en una clase de entidad o capa:

import arcpy

################################ Configuration #################################
numTouchesField = "NUM_TOUCHES"
numIntersectionsField = "NUM_INTERSECTIONS"
################################################################################

def countTouches(layer, feature):
    """Returns the number of times the boundary of a feature touches other
    features in the same feature layer."""
    return countSpatialRelation(layer, feature, "BOUNDARY_TOUCHES")

def countIntersections(layer, feature):
    """Returns the number of times a feature intersects other features in the
    same feature layer."""
    return countSpatialRelation(layer, feature, "INTERSECT") - 1 # Subtract 1 because the feature will always intersect its clone in the feature layer

def countSpatialRelation(layer, feature, relation):
    """Returns the number of times a feature meets the specified spatial
    relationship with other features in the same feature layer."""
    arcpy.SelectLayerByLocation_management(layer, relation, feature)
    count = int(arcpy.GetCount_management(layer).getOutput(0))
    return count

def addField(table, fieldName, fieldType):
    """Adds a fields of the given name and type to a table, unless a field with
    the same name already exists."""
    desc = arcpy.Describe(table)
    fieldInfo = desc.fieldInfo
    fieldIndex = fieldInfo.findFieldByName(fieldName)
    if fieldIndex == -1:
        # Field does not exist, add it
        arcpy.AddField_management(table, fieldName, fieldType)

def countTouchesAndIntersections(layer):
    """Adds and populates fields describing the number of times each feature
    touches and intersects other features in the feature layer."""
    addField(layer, numTouchesField, "LONG")
    addField(layer, numIntersectionsField, "LONG")
    desc = arcpy.Describe(layer)
    shapeField = desc.shapeFieldName
    rows = arcpy.UpdateCursor(layer)
    for row in rows:
        feature = row.getValue(shapeField)
        row.setValue(numTouchesField, countTouches(layer, feature))
        row.setValue(numIntersectionsField, countIntersections(layer, feature))
        rows.updateRow(row)
    del row, rows

if __name__ == "__main__":
    layer = arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(0))
    countTouchesAndIntersections(layer)

Una vez que se haya ejecutado, puede consultar fácilmente las funciones que se tocan exactamente dos veces y se cruzan exactamente dos veces (Caso 1), y las que tocan 0 veces y se cruzan exactamente dos veces (Caso 2).

Ejemplos de consultas de definición:

  • Caso 1 (toca dos veces, se cruza dos veces):"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
  • Caso 2 (no toca ninguno, se cruza dos veces):"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2

Consulte la siguiente captura de pantalla para ver una ilustración de las instancias de los dos casos encontrados: Captura de pantalla de ArcMap que muestra varias intersecciones de líneas / relaciones táctiles

Tenga en cuenta que con los datos del mundo real, normalmente los segmentos de la calle se dividen en las intersecciones, y los colgantes solo ocurren cuando las carreteras se cruzan como en un intercambio o puente. Por lo tanto, normalmente tiene la misma cantidad de características que se cruzan como tocar.

Para el caso más general, es posible que desee buscar cualquier cuelgue comprobando si "NUM_INTERSECTIONS" > "NUM_TOUCHES".

blah238
fuente
Gracias por la elaborada respuesta. Tengo algunos problemas para convertirlo en una herramienta de secuencia de comandos (se bloquea cuando intento seleccionar una capa) pero estoy seguro de que el enfoque es válido.
mvexel
Un comentario más: tuve que reducir la longitud del nombre del campo a menos de 10 caracteres (probablemente porque la fuente de la capa es un archivo de forma).
mvexel
Parece que hay una URL a una imagen de documentación de ArcGIS que se ha extraviado al comienzo de esta respuesta.
PolyGeo
@PolyGeo, ¿cuál? Me parece bien
blah238
Eso es extraño, la primera imagen (sobre lo que sería sobre la cuarta línea) se mostraba como una pequeña cruz ayer. Hoy se ve bien. Creo que lo vi en el navegador (que estoy usando ahora) en lugar del cliente iOS que uso a menudo.
PolyGeo
2

División de línea en vértices (gestión de datos)

"Crea una clase de entidad que contiene líneas que se generan dividiendo líneas de entrada o límites de polígonos en sus vértices"

Mantener atribución.

ingrese la descripción de la imagen aquí

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000003z000000

Mapperz
fuente
No estoy seguro de cómo eso me va a ayudar, pero me doy cuenta de que podría haber aclarado lo que necesito para lograr un poco mejor. Editado la pregunta.
mvexel
-1

¿Qué le parece copiar la capa de entidades, recortar las líneas y luego comparar el conjunto de entidades recortado con el original para encontrar las entidades que han cambiado? No es bonito, casi seguramente requiere el uso de Python, pero parece que debería funcionar.

Llaves
fuente
-1

También puede extraer los nodos de la red. En el caso 1 obtendría 2 nodos cada uno con una valencia de 4. En el caso 2 no hay nodos.

Hornbydd
fuente
¿Puedes sugerir cómo hacer esto en ArcGIS?
blah238
Puede usar la secuencia de comandos o la herramienta de someones para agregar identificadores únicos a la polilínea que son los nodos desde y hacia. Sé que archydro lo hace, pero estoy seguro de que hay scripts en el sitio web de arcscripts que lo hacen. Luego, de manera no programable, podría ejecutar la herramienta de frecuencia en el campo de origen y luego en el campo de nodo y sumarlos, esto le proporciona valencia de nodo que puede volver a unir a una capa de puntos que representa los nodos.
Hornbydd