Проверка «связности» шейп-файла линии в ArcMap?

9

Я унаследовал шейп-файл линии в ArcMap, который используется для представления дорожной сети. Проблема в том, что дорожная сеть довольно большая, и я не могу:

  1. Сообщите, связан ли конец каждой линии (сегменты дороги) с ребром, вершиной или концом другой линии (сегмент дороги); а также
  2. Скажите, подключена ли вся дорожная сеть, т. Е. Могу ли я проследить маршрут от любой точки дорожной сети до любой другой точки дорожной сети?

Есть ли способ сделать это в ArcMap? То есть есть ли функция, которая позволит мне выделять отрезки, которые не связаны с другими отрезками, или что-то подобное, что позволило бы мне ответить на два вопроса выше?

derNincompoop
источник

Ответы:

14

Да, но вроде. ArcGis больше не имеет топологии линейных узлов, которая позволяет пользователю определить, сколько дуг (линий) соединено на своих концах (узлах).

Проверить это одно, а как исправить вместо этого? Если вы откроете класс пространственных объектов в ArcMap, а затем используете плоские линии (дайте допуск), и линии будут пересечены и разделены на пересечении - это сэкономит много работы. Если вы не хотите разбивать линии, тогда рассмотрите инструмент Интегрировать, но будьте осторожны, используя очень маленький допуск, он соединит концы вместе, но может также сделать линии соединенными. Перед использованием Integrate сохраните резервную копию, так как она может уничтожить ваши данные!

Теперь, чтобы найти отключенные концы, используйте вершины объектов в точки, чтобы получить конечные точки, а затем собирать события, которые дадут вам класс пространственных объектов с количеством присутствующих конечных точек, на этом этапе любое событие 1 является подозрительным, поэтому вам необходимо отделить это из

Чтобы определить, должно ли оно быть подключено, это следующая задача, используйте Generate Near Table (снова с подходящим допуском) и опцию closest = ALL, используя события со счетом 1 против исходных линий, затем, используя итоговую статистику, вы можете найти для каждой точки - количество записей, использующих IN_FID в качестве поля регистра и NEAR_FID в качестве поля статистики с типом статистики «COUNT».

Чтобы упростить процесс извлечения из ближайшей таблицы записей на расстоянии больше 0 с помощью Table Select . Каждое событие найдет линию, которая его сгенерировала, но расстояние будет равно 0, если оно будет правильно прикреплено к другой линии (в вершине), расстояние также будет равно 0, поэтому теперь любое событие, запись которого остается в ближайшей таблице, возможно, непересекающиеся, но их нужно будет просматривать вручную.

Майкл Стимсон
источник
Спасибо. Я проверю эти функции, когда завтра приеду на работу и доложу.
derNincompoop
3
«Элемент вертикали в точку» имеет возможность выводить точки поворота. Я думаю, что это упростит ваш рабочий процесс.
Klewis
Вау @klewis, когда это появилось? Этого точно не было в 9.3. Хорошо подмечено!
Майкл Стимсон
4

Другой подход заключается в использовании топологии MAP. Я выбил этот бит кода VBA, который бы идентифицировал свисающие края. Если вы видите свисающие границы внутри сети, а не ожидаемые концы сети, то должно быть отключение.

Пример подбора висячих ребер

Код полагается на то, что вы установили VBA, находитесь в режиме редактирования и добавили слой полилинии к топологии карты.

Public Sub SelectDanglingPolylines()
 ' Description: Takes a polyline dataset and select all dangling polylines.
 '
 ' Requirements: You need to be in edit mode and have added the layer to a MAP TOPOLOGY,
 ' also polyline layer must be first in TOC.
 '
 ' Limitations: Large datasets take a long time to build the cache and may even fail.
 '
 ' Author: Duncan Hornby
 ' Created: 11/12/2011
 '

 ' Get map and then first layer, must be of polyline type
 Dim pMXDocument As IMxDocument
 Set pMXDocument = ThisDocument
 Dim pMap As IMap
 Set pMap = pMXDocument.FocusMap
 Dim pLayer As ILayer
 Set pLayer = pMap.Layer(0)
 Dim pFeatureLayer As IFeatureLayer
 Set pFeatureLayer = pLayer
 Dim pFeatureClass As IFeatureClass
 Set pFeatureClass = pFeatureLayer.FeatureClass
 If pFeatureClass.ShapeType <> esriGeometryPolyline Then
     MsgBox "This code works only with polylines!", vbExclamation, "Wrong data type at layer 0"
     Exit Sub
 End If

 ' Get editor and topology extension
 Dim pEditor As IEditor
 Dim pID As New UID
 Dim pTopologyExtension As ITopologyExtension
 Dim pTEID As New UID
 pID = "esriEditor.editor"
 Set pEditor = Application.FindExtensionByCLSID(pID)
 pTEID = "esriEditorExt.TopologyExtension"
 Set pTopologyExtension = Application.FindExtensionByCLSID(pTEID)
 If pTopologyExtension.CurrentTopology Is Nothing Then Exit Sub

 ' Get a MAP topology not a geodatabase topology
 Dim pMapTopology As IMapTopology
 If TypeOf pTopologyExtension.CurrentTopology Is IMapTopology Then
     Set pMapTopology = pTopologyExtension.MapTopology
 Else
     ' Not a Map Topology
     Exit Sub
 End If

 ' This is the colection that FID are added to
 Dim aColl As New Collection

 ' Build cache
 Application.StatusBar.Message(0) = "Building MAP TOPOLOGY cache, this can take a long time on large datasets..."
 DoEvents
 Dim pGeoDataset As IGeoDataset
 Set pGeoDataset = pFeatureClass
 Dim pEnvelope As IEnvelope
 Set pEnvelope = pGeoDataset.Extent
 pMapTopology.Cache.Build pEnvelope, False

 ' Identify dangling nodes and add polyline FID to collection
 Application.StatusBar.Message(0) = "Identifying dangling nodes..."
 DoEvents
 Dim pEnumTopologyParent As IEnumTopologyParent
 Dim pTopologyNode As ITopologyNode
 Dim pEnumTopologyNode As IEnumTopologyNode
 Set pEnumTopologyNode = pMapTopology.Cache.Nodes
 pEnumTopologyNode.Reset
 Set pTopologyNode = pEnumTopologyNode.Next
 While Not pTopologyNode Is Nothing
 If pTopologyNode.Degree = 1 Then
     ' As this has 1 degree it has only 1 parent polyline
     Set pEnumTopologyParent = pTopologyNode.Parents
     pEnumTopologyParent.Reset
     aColl.Add (pEnumTopologyParent.Next.m_FID) 'Adds polyline FID to collection
 End If
 Set pTopologyNode = pEnumTopologyNode.Next
 Wend

 ' Use collection to select polylines
 Application.StatusBar.Message(0) = "Selecting polylines..."
 DoEvents
 Dim pFeatureSelection As IFeatureSelection
 Set pFeatureSelection = pFeatureLayer
 Dim X As Variant
 For Each X In aColl
     pFeatureSelection.SelectionSet.Add CLng(X)
 Next
 pMXDocument.ActiveView.PartialRefresh esriViewGeoSelection, Nothing, pEnvelope
 Application.StatusBar.Message(0) = ""
 DoEvents
End Sub
Hornbydd
источник
Мне нравится этот код, если вы не возражаете, я скопирую несколько битов этого; Преимущество делать это таким образом, что это живое и , как ошибки исправляются они исчезают, плохая часть , если линия болтается то показывается - подключен ли один конец или линия полностью отключена. Могу ли я предложить, чтобы вы изменили код, отображающий узел "валентность" (сколько соединенных линий) или просто узлы болтающихся (это снова моя рабочая станция!) ... это было бы здорово ... но только если OP имеет возможность VBA / VB.net.
Майкл Стимсон
1
Можно откорректировать код и получить ребра, которые имеют валентность 1 на обоих концах, чтобы найти полностью отключенную линию, или вариации, такие как 1 на 1 конце и 2 на другом, зависят от сети, я полагаю?
Хорнбидд,
2

Это старый пост, но я думаю, что самое простое решение:

  1. Растворите свою полилинию
  2. Использовать опорные точки к точкам с параметром Мотаться
  3. Объединить пространственным расположением исходный объект полилинии с результирующим слоем точек. Используйте опцию «Пересечено им».

Результат будет иметь поле «Количество» для каждой строки в вашем слое. если число больше 1, линия не «связана» с остальными линиями.

Концептуально: шаг 2 здесь создает точки в вершинах с одним соединенным ребром (одна линия «входит», ноль «выходит»). Поскольку каждая линия в «подключенной» сети будет иметь не более 1 такой вершины, любая строка с более чем 1 не является частью сети и, следовательно, не «связана».

NathanW
источник
Этот метод дает много ложных срабатываний. Скажем, дорога ведет к Т-образному перекрестку. Верхняя часть T будет иметь две висячие вершины. Если вы возьмете объекты со счетом два, а затем снова пересечете их с сетью дорог, то не коснитесь островов.
Woot
На самом деле, второе пересечение, о котором я писал выше, находит только изолированные дороги. Не было бы узнать, если сеть имеет несколько частей
Woot
1

Вот метод, который я разработал с помощью некоторых друзей, используя Model Builder и Gephi. Шаг 1 ArcModel создает таблицу ссылок / ребер (при необходимости добавляя узлы на каждой строке, перекрываются) Шаг 2 Gephi импортирует ссылки / ребра, затем добавляет идентификаторы компонентов Шаг 3 ArcModel добавляет идентификаторы компонентов обратно к исходной строке

Step1screenshot Шаг 1 Принимает все входные объекты, разделяет их на пересечениях, чтобы обеспечить присутствие сетевого узла, и создает таблицу для импорта в Gephi. Вот шаги: Процесс: Элемент к линии (может принимать несколько входов) Процесс: Многокомпонентный к Однокомпонентному процессу: Восстановить процесс геометрии: Добавить координаты начала и конца (Добавить атрибуты геометрии) Процесс: Добавить поле "Источник" Процесс: Добавить поле "Цель" Процесс: вычислить «источник» (как startX и startY) Процесс: вычислить «цель» (как конец X и конецY) Процесс: удалить поля (очистить дополнительные поля, чтобы избежать путаницы) Процесс: таблица GDB в CSV

Step2Gephi_Screenshot Шаг 2 Процесс Gephi (бесплатная загрузка) - Импортируйте выходные данные CSV с именованными полями узла «Источник» и «Целевой объект» в виде ссылок. - Выполните расчет вычисленных компонентов как ненаправленных (в разделе «Инструменты статистики»). - Экспортируйте CSV из Лаборатории данных для узлов (включая идентификатор узла и идентификатор компонента).

Шаг 3: принимает выходные данные Gephi и добавляет атрибут компонента / сети к исходным строкам. Процесс: таблица в таблицу (включает вывод Gephi в базу геоданных для структурирования уникальных идентификаторов объектов). Процесс: объединяет поле (значения узла источника объединяются с выходными данными Gephi для заполнения номера компонента в строках). Символизировать компонентом

Очистка после этой точки, скорее всего, будет ручным процессом проверки того, где разъединения происходят вдоль линий и является ли разъединение действительным разделением в реальном мире или просто недостатком данных.

Джаред Селлерс
источник