Für jeweils ein Feature können Sie dies ganz einfach interaktiv über das normale Dialogfeld " Nach Standort auswählen" ausführen. Verwenden Sie dazu die folgende Taste als Leitfaden für die räumlichen Beziehungstypen für Zeilen-für-Zeilen-Überlagerungen (unter " Nach Standort auswählen : Grafikbeispiele ):
(Quelle: arcgis.com )
Linie mit Linie auswählen
Schnittpunkt A, C, D, E, F, G, H, I, J.
ENTHÄLT G, H.
COMPLETELY_CONTAINS G.
CONTAINS_CLEMENTINI G, H.
INNERHALB VON F, H.
COMPLETELY_WITHIN F.
WITHIN_CLEMENTINI F, H.
ARE_IDENTICAL_TO H.
BOUNDARY_TOUCHES C, E.
Die relevanten Beziehungstypen in diesem Fall sind INTERSECT
und BOUNDARY_TOUCHES
. Wie Sie dem obigen Diagramm entnehmen können, können BOUNDARY_TOUCHES
Sie die Features auswählen, die einen Endpunkt der Linie berühren. Wenn genau zwei Features ausgewählt sind, haben Sie Ihren Fall 1. Wenn ein Feature nicht von anderen Features berührt wird, sondern nur von diesen geschnitten wird, BOUNDARY_TOUCHES
wird nichts ausgewählt. INTERSECT
wählt alle Features aus, die sich überschneiden, unabhängig davon, ob sie einen Endpunkt berühren oder nicht. Wenn Sie also wissen, dass keine Features Endpunkte berühren, Sie jedoch feststellen, dass sich Features überschneiden, haben Sie Ihren Fall 2.
Um den Prozess zu automatisieren, können Sie das folgende Python-Skript verwenden (auf Wunsch als Skript-Tool implementieren ), um die Anzahl der Berührungen und Schnittpunkte für jedes Feature in einer Feature-Class oder Layer zu berechnen:
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)
Sobald dies ausgeführt wurde, können Sie leicht nach Funktionen abfragen, die sich genau zweimal berühren und genau zweimal schneiden (Fall 1), und nach Funktionen, die sich 0 Mal berühren und genau zweimal schneiden (Fall 2).
Beispieldefinitionsabfragen:
- Fall 1 (Berührt zweimal, schneidet sich zweimal):
"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
- Fall 2 (Berührt keine, schneidet sich zweimal):
"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2
Im folgenden Screenshot sehen Sie eine Illustration der Instanzen der beiden gefundenen Fälle:
Beachten Sie, dass bei Daten aus der realen Welt Straßensegmente normalerweise an Kreuzungen aufgeteilt werden und Baumelungen nur auftreten, wenn Straßen wie an einer Kreuzung oder Brücke übereinander verlaufen. Normalerweise haben Sie also die gleiche Anzahl von Features, die sich überschneiden wie das Berühren.
Für den allgemeineren Fall möchten Sie möglicherweise nach Baumeln suchen, indem Sie prüfen, ob "NUM_INTERSECTIONS" > "NUM_TOUCHES"
.