Para um único recurso de cada vez, é possível fazer isso de maneira bastante interativa, usando a caixa de diálogo Selecionar por local normal , usando a seguinte chave como um guia para os tipos de relacionamento espacial para sobreposições de linha em linha (em Selecionar por local: exemplos gráficos ):
(fonte: arcgis.com )
Selecionar linha usando a linha
INTERSECÇÃO A, C, D, E, F, G, H, I, J
CONTÉM G, H
COMPLETELY_CONTAINS G
CONTAINS_CLEMENTINI G, H
DENTRO DE F, H
COMPLETELY_WITHIN F
DENTRO_CLEMENTINI F, H
ARE_IDENTICAL_TO H
BOUNDARY_TOUCHES C, E
Os tipos de relacionamento relevantes nesse caso são INTERSECT
e BOUNDARY_TOUCHES
. Como você pode ver a partir do diagrama acima, você pode usar BOUNDARY_TOUCHES
para selecionar as características que tocam um ponto final da linha. Se exatamente dois recursos forem selecionados, você terá o seu Caso 1. Se um recurso não for tocado por nenhum outro recurso, mas apenas cruzado por eles, ele BOUNDARY_TOUCHES
não selecionará nada. INTERSECT
selecionará todos os recursos que se cruzam, independentemente de tocarem em um endpoint ou não. Portanto, se você sabe que não há recursos tocando nos pontos de extremidade, mas descobre que há recursos se cruzando, então você tem o seu Caso 2.
Para automatizar o processo, você pode usar o seguinte script Python (implementado como uma ferramenta de script, se desejar) para calcular o número de toques e interseções para cada recurso em uma classe ou camada de recurso:
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)
Após a execução, é possível consultar facilmente os recursos que tocam exatamente duas vezes e se cruzam exatamente duas vezes (Caso 1) e aqueles que tocam em 0 vezes e se cruzam exatamente duas vezes (Caso 2).
Consultas de definição de exemplo:
- Caso 1 (toca duas vezes, cruza duas vezes):
"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
- Caso 2 (não toca, cruza duas vezes):
"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2
Veja a captura de tela abaixo para obter uma ilustração das instâncias dos dois casos encontrados:
Observe que, com dados do mundo real, normalmente os segmentos das ruas são divididos nos cruzamentos, e as oscilações ocorrem apenas quando as estradas passam umas sobre as outras como em uma passagem ou ponte. Portanto, normalmente você tem o mesmo número de recursos que se cruzam com o toque.
Para o caso mais geral, convém procurar quaisquer alterações, verificando se "NUM_INTERSECTIONS" > "NUM_TOUCHES"
.