Розрізняють лінії, що перетинаються з лініями, які торкаються?


9

Як я можу розрізняти ці випадки в ArcGIS 10?

  • Випадок 1 : Обидві кінцеві точки лінії торкаються іншої лінії
  • Випадок 2 : Обидві кінцеві точки звисають над лініями, які він перетинає

Я дивлюся на функцію Trim Line, але це не те, що я хочу (руйнівний).

Реальний випадок використання реального світу полягає в тому, щоб розрізняти службові дороги, що з'єднують обидві проїзні частини автостради, та інші випадки доріг, що перетинаються з автострадами.

введіть тут опис зображення введіть тут опис зображення

Відповіді:


13

Для однієї функції за один раз ви можете це зробити досить легко інтерактивно, використовуючи звичайне діалогове вікно 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

Дивіться скріншот нижче для ілюстрації випадків знайдених двох випадків: Скріншот ArcMap, що показує різні взаємозв'язки перетину та перетину ліній

Зауважте, що за даними реального світу зазвичай ділянки вулиць розбиваються на перехрестях, і звисання виникають лише тоді, коли дороги проходять одна над одною, як на перехресті чи мосту. Тому зазвичай у вас однакова кількість функцій, що перетинаються, як дотики.

Для більш загального випадку, можливо, ви захочете шукати якісь балакани, перевіряючи, чи немає "NUM_INTERSECTIONS" > "NUM_TOUCHES".


Дякую за детальну відповідь. У мене є невеликі проблеми, перетворюючи його на інструмент скрипту (він зависає, коли я намагаюся вибрати шар), але я впевнений, що підхід дійсний.
mvexel

Ще один коментар: мені довелося зменшити довжину імені поля до менш ніж 10 символів (можливо, тому, що джерело шару - це файл форми).
mvexel

Здається, є URL-адреса до зображення документації ArcGIS, яке збилося з глузду на початку цієї відповіді.
PolyGeo

@PolyGeo який? Мені це здається прекрасним.
blah238

Це дивно, перший малюнок (про те, що було б про четвертий рядок) вчора демонстрував як маленький хрест. Сьогодні це виглядає чудово. Я думаю, що я бачив це в браузері (яким я зараз користуюся), а не клієнтом iOS, яким я часто користуюся.
PolyGeo

2

Роздільна лінія у вершинах (управління даними)

"Створює клас функцій, що містить лінії, які генеруються шляхом розбиття вхідних ліній або меж багатокутника у їх вершинах"

Зберігайте атрибуцію.

введіть тут опис зображення

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000003z000000


Я не впевнений, як це мені допоможе, але я усвідомлюю, що міг би уточнити, що потрібно для досягнення трохи кращого. Редагував питання.
mvexel

-1

Як щодо копіювання шару елементів, обрізання ліній, а потім порівняння обрізаного набору функцій з оригіналом, щоб знайти змінити функції? Не дуже, майже напевно вимагає використання Python, але, схоже, це має працювати.


-1

Ви також можете витягнути вузли мережі. У випадку 1 ви отримаєте 2 вузли з валентністю 4. У випадку 2 немає вузлів.


Ви можете запропонувати, як це зробити в ArcGIS?
blah238

Ви можете використовувати сценарій чи інструмент someones, щоб додати унікальні ідентифікатори до полілінії, що є від і до вузлів. Я знаю, що Archydro це робить, але впевнений, що на веб-сайті arcscripts є сценарії, які це роблять. Тоді непрограмованим способом ви можете запустити інструмент частоти в полі з поля, а потім на полі вузла і підсумувати їх, це дає валентність вузла, яку ви можете приєднати до точкового шару, що представляє вузли.
Hornbydd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.