Para un solo elemento a la vez, usted puede hacer esto con facilidad de forma interactiva con el modo normal de Seleccionar Por Ubicación de diálogo, utilizando la siguiente clave como guía a la relación espacial de los tipos de línea en línea de superposiciones (de Seleccionar por Ubicación: ejemplos gráficos):
![image]()
Seleccione la línea de la línea de
SE CRUZAN A, C, D, E, F, G, H, I, J
CONTIENE G, H
COMPLETELY_CONTAINS G
CONTAINS_CLEMENTINI G, H
DENTRO DE F, H
COMPLETELY_WITHIN F
WITHIN_CLEMENTINI F, H
ARE_IDENTICAL_TO H
BOUNDARY_TOUCHES C, E
La relación correspondiente tipos, en este caso son INTERSECT
y BOUNDARY_TOUCHES
. Como se puede ver en el diagrama de arriba, usted puede usar BOUNDARY_TOUCHES
a seleccionar las características que toque un extremo de la línea. Si exactamente dos características son seleccionados luego de tener a su Caso 1. Si una función no está tocado por cualquier otras características, pero sólo atravesada por ellos, a continuación, BOUNDARY_TOUCHES
seleccionar nada. INTERSECT
seleccionar todas las características que se cruzan, independientemente de que se toque en un extremo o no. Así que si usted sabe que no hay características de tocar los extremos, pero usted encontrará que hay características de la intersección, entonces usted tiene su Caso 2.
Para automatizar el proceso, puede usar la siguiente secuencia de comandos de Python (implementar como una herramienta de secuencia de comandos si se desea) para calcular el número de toques y de las intersecciones para cada característica en una capa o clase de entidad:
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 haya terminado, usted puede fácilmente consulta para las características que tocar exactamente dos veces y se cruzan exactamente dos veces (Caso 1), y los que tocan 0 veces y se cruzan exactamente dos veces (Caso 2).
Ejemplo de definición de las consultas:
-
Caso 1 (Toca dos veces, se cruza dos veces):
"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
-
Caso 2 (Toca ninguno, se cruza dos veces):
"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2
Ver la siguiente captura de pantalla para ver una ilustración de las instancias de los dos casos que se encuentran:
![ArcMap screenshot showing various line intersection/touch relationships]()
Tenga en cuenta que con los datos del mundo real, normalmente segmentos de calle se dividen en las intersecciones, y cuelga sólo se producen cuando las carreteras pasar una sobre la otra, como en un intercambio o un puente. Así que normalmente tiene el mismo número de características de la intersección de como tocar.
Para el caso más general, es posible que desee buscar para cualquier cuelga mediante la comprobación de si "NUM_INTERSECTIONS" > "NUM_TOUCHES"
.