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 ):
(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 INTERSECT
y BOUNDARY_TOUCHES
. Como puede ver en el diagrama anterior, puede usar BOUNDARY_TOUCHES
para 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_TOUCHES
no seleccionará nada. INTERSECT
seleccionará 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:
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"
.
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.
http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000003z000000
fuente
¿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.
fuente
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.
fuente