W przypadku pojedynczej funkcji na raz możesz to zrobić dość interaktywnie, korzystając z normalnego okna dialogowego Wybierz według lokalizacji , używając następującego klucza jako przewodnika po typach relacji przestrzennych dla nakładek liniowych (z Wybierz według lokalizacji: przykłady graficzne ):
(źródło: arcgis.com )
Wybierz linię za pomocą linii
INTERSECT A, C, D, E, F, G, H, I, J
ZAWIERA G, H
COMPLETELY_CONTAINS G
CONTAINS_CLEMENTINI G, H
W CIĄGU F, H
COMPLETELY_WITHIN F.
WITHIN_CLEMENTINI F, H
ARE_IDENTICAL_TO H
BOUNDARY_TOUCHES C, E
Odpowiednimi typami relacji w tym przypadku są INTERSECT
i BOUNDARY_TOUCHES
. Jak widać na powyższym schemacie, możesz użyć BOUNDARY_TOUCHES
funkcji, które dotykają punktu końcowego linii. Jeśli wybrano dokładnie dwie funkcje, masz Przypadek 1. Jeśli żadna inna cecha nie zostanie dotknięta, ale tylko przez nią przecięta, BOUNDARY_TOUCHES
nic nie wybierze. INTERSECT
wybierze wszystkie przecinające się obiekty niezależnie od tego, czy dotykają punktu końcowego, czy nie. Jeśli więc wiesz, że nie ma żadnych elementów dotykających punktów końcowych, ale zauważysz, że istnieją przecinające się elementy, to masz przypadek 2.
Aby zautomatyzować ten proces, możesz użyć następującego skryptu Python (w razie potrzeby zaimplementuj go jako narzędzie skryptowe ), aby obliczyć liczbę dotknięć i przecięć dla każdej operacji w klasie lub warstwie operacji:
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)
Po uruchomieniu można łatwo wyszukać funkcje dotykające dokładnie dwa razy i przecinające się dokładnie dwa razy (Przypadek 1) oraz te, które dotykają 0 razy i przecinają się dokładnie dwa razy (Przypadek 2).
Przykładowe zapytania dotyczące definicji:
- Przypadek 1 (Dotyka dwa razy, przecina się dwa razy):
"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
- Przypadek 2 (nie dotyka żadnego, przecina się dwa razy):
"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2
Poniższy zrzut ekranu ilustruje przypadki znalezienia dwóch przypadków:
Należy pamiętać, że w przypadku danych ze świata rzeczywistego odcinki ulic są zwykle rozbijane na skrzyżowaniach, a zawieszki występują tylko wtedy, gdy drogi mijają się jak na skrzyżowaniu lub moście. Zwykle masz taką samą liczbę funkcji przecinających się jak dotykanie.
W bardziej ogólnym przypadku możesz poszukać zwisów, sprawdzając, czy "NUM_INTERSECTIONS" > "NUM_TOUCHES"
.