Для однієї функції за один раз ви можете це зробити досить легко інтерактивно, використовуючи звичайне діалогове вікно Select By Location , використовуючи наступну клавішу в якості керівництва до типів просторових відносин для рядків на накладках рядка (з пункту Select by Location: графічні приклади ):
(джерело: arcgis.com )
Виберіть рядок за допомогою лінії
ПЕРЕКЛЮЧАТИ A, C, D, E, F, G, H, I, J
ВМІСТЬ Г, Н
COMPLETELY_CONTAINS G
CONTAINS_CLEMENTINI G, H
В F, H
COMPLETELY_WITHIN F
WITHIN_CLEMENTINI F, H
ARE_IDENTICAL_TO H
BOUNDARY_TOUCHES C, E
Відповідними типами відносин у цьому випадку є INTERSECT
і BOUNDARY_TOUCHES
. Як видно з діаграми, поданої вище, ви можете використовувати BOUNDARY_TOUCHES
для вибору функцій, які стосуються кінцевої точки лінії. Якщо вибрано саме дві функції, то у вас є Case 1. Якщо функцію не торкаються жодні інші функції, а лише перетинаються ними, тоді BOUNDARY_TOUCHES
нічого не вибере. INTERSECT
вибере всі функції, що перетинаються незалежно від того, торкаються вони в кінцевій точці чи ні. Отже, якщо ви знаєте, що немає жодних функцій, що стосуються кінцевих точок, але ви виявите, що є функції, що перетинаються, тоді у вас є Case 2.
Для автоматизації процесу можна використовувати наступний скрипт Python (реалізувати як засіб сценарію, якщо потрібно) для обчислення кількості дотиків та перетинів для кожної функції в класі чи шарі функцій:
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)
Після запуску ви можете легко запитувати функції, які торкаються рівно двічі та перетинаються рівно двічі (Випадок 1), і ті, які торкаються 0 разів та перетинаються рівно двічі (Випадок 2).
Приклад визначення запитів:
- Випадок 1 (торкається двічі, перетинається двічі):
"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
- Випадок 2 (Торкається жодного, перетинається двічі):
"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2
Дивіться скріншот нижче для ілюстрації випадків знайдених двох випадків:
Зауважте, що за даними реального світу зазвичай ділянки вулиць розбиваються на перехрестях, і звисання виникають лише тоді, коли дороги проходять одна над одною, як на перехресті чи мосту. Тому зазвичай у вас однакова кількість функцій, що перетинаються, як дотики.
Для більш загального випадку, можливо, ви захочете шукати якісь балакани, перевіряючи, чи немає "NUM_INTERSECTIONS" > "NUM_TOUCHES"
.