Отличительные линии, которые пересекаются с линиями, которые касаются?


9

Как я могу различить эти случаи в ArcGIS 10?

  • Случай 1 : обе конечные точки линии касаются другой линии
  • Случай 2 : обе конечные точки свисают с линий, которые они пересекают

Я смотрю на функцию Trim Line, но это не то, что я хочу (разрушительно).

Реальный пример использования - это различие между дорогами, соединяющими обе дороги автострады, и другими случаями дорог, пересекающихся с автострадами.

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

Ответы:


13

Для одного объекта за раз вы можете сделать это довольно легко в интерактивном режиме с помощью обычного диалогового окна « Выбор по местоположению », используя следующую клавишу в качестве руководства по типам пространственных отношений для наложений «линия по линии» (из « Выбор по расположению: графические примеры» ):

изображение
(источник: arcgis.com )

Выберите строку, используя линию

ИНТЕРСЕКТ A, C, D, E, F, G, H, I, J

СОДЕРЖИТ G, H

COMPLETELY_CONTAINS G

CONTAINS_CLEMENTINI G, H

В Ф, Н

COMPLETELY_WITHIN F

WITHIN_CLEMENTINI F, H

ARE_IDENTICAL_TO H

BOUNDARY_TOUCHES C, E

Соответствующими типами отношений в этом случае являются INTERSECTи BOUNDARY_TOUCHES. Как видно из диаграммы выше, вы можете использовать BOUNDARY_TOUCHESдля выбора функции, которые касаются конечной точки линии. Если выбрано ровно две функции, то у вас есть ваш Случай 1. Если функция не затрагивается какими-либо другими функциями, а только пересекается с ними, то BOUNDARY_TOUCHESничего не выберет. INTERSECTвыберет все объекты, которые пересекаются, независимо от того, касаются они конечной точки или нет. Поэтому, если вы знаете, что нет никаких объектов, которые касаются конечных точек, но вы обнаружите, что они пересекаются, то у вас есть Случай 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 для добавления уникальных идентификаторов к полилинии, которые являются узлами from и to. Я знаю, что это делает archydro, но я уверен, что на сайте arcscripts есть сценарии, которые это делают. Затем непрограммирующим способом вы можете запустить инструмент частоты в поле from, а затем в поле to to и суммировать их, это дает вам валентность узлов, которую вы можете присоединить к точечному слою, представляющему узлы.
Хорнбидд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.