Перевірка "зв’язності" файлу формного рядка в ArcMap?


9

Я успадкував файл аркушів форми в ArcMap, який використовується для представлення дорожньої мережі. Проблема в тому, що дорожня мережа досить велика і мені неможливо:

  1. Скажіть, чи кінець кожного рядка (відрізки дороги) "з'єднаний" або з краєм, вершиною, або з кінцем іншого рядка (відрізок дороги); і
  2. Скажіть, чи вся "дорожня мережа" підключена "- тобто чи можу я простежити маршрут від будь-якої точки дорожньої мережі до будь-якої іншої точки дорожньої мережі?

Чи є спосіб досягти цього в ArcMap? Тобто чи існує функція, яка дозволить мені виділити сегменти рядків, які не підключаються до інших сегментних рядків, чи щось подібне, що дозволило б мені відповісти на два вищезазначені питання?

Відповіді:


14

Так, але начебто. У ArcGis більше немає топології лінійних вузлів, яка дозволяє користувачеві сказати, скільки дуг (ліній) з'єднано на їх кінцях (вузлах).

Перевірити - це одне, а як натомість виправити? Якщо ви відкриєте клас об’єктів у ArcMap, а потім використовуєте лінії планування (надайте допуски), і лінії будуть розрізані та розбиті на перетині - це економить багато роботи. Якщо ви не хочете розділяти лінії, то розгляньте інструмент " Інтеграція", але будьте обережні, використовуйте дуже невеликий допуск, він з’єднає кінці разом, але може змусити лінії також з'єднуватися разом. Перед використанням Integrate зберігайте резервну копію, оскільки це може знищити ваші дані!

Тепер, щоб знайти від’єднані кінці, використовуйте Feature Vertices to Points, щоб отримати кінцеві точки, а потім збирайте події, які дадуть вам клас функції з кількістю присутніх кінцевих точок, на цьому етапі будь-яка подія з 1 підозрою, тому вам потрібно буде відокремити ці.

Щоб визначити, чи слід його підключити, це наступне завдання, використовуйте Створити біля таблиці (знову з відповідним допуском) та опцію найближчого = ВСЕ, використовуючи події з кількістю 1 проти вихідних рядків, а потім за допомогою Зведеної статистики ви можете знайти для кожного пункту - кількість записів, що використовують IN_FID як поле справи та NEAR_FID як поле статистики зі статистичним типом "COUNT".

Щоб зробити простішим витяг з ближньої таблиці записи з відстані більше 0 за допомогою Select Select . Кожна подія знайде рядок, який її створив, але відстань буде 0, якщо вона належним чином прикріплена до іншого рядка (у вершині), відстань також буде 0, тож тепер будь-яка подія, яка має запис у найближчій таблиці, є можливо, нерозбірливі, але їх потрібно розглядати вручну.


Дякую. Я перевіряю ці функції, коли завтра приїду на роботу і звітую.
derNincompoop

3
"Feature Vertice to Point" має можливість виводити очки Dangle. Я думаю, що це спростить ваш робочий процес.
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

Мені подобається цей код, якщо ви не заперечуєте, я скопіюю декілька біт цього; Користь зробити це таким чином полягає в тому, що воно живе в прямому ефірі, і коли помилки виправляються, вони зникають, погана частина - якщо лінія звисає, то це показується - чи підключений один кінець чи лінія повністю відключена. Я можу запропонувати вам змінити код, щоб відобразити вузол "валентність" (скільки підключених ліній) або просто вузли звисання (це моя робоча станція знову виходить!) ... це було б дивним ... але тільки в тому випадку, якщо ОП має можливість VBA / VB.net.
Майкл Стімсон

1
Можна було змінити код і отримати ребра, які мають валентність 1 на обох кінцях, щоб знайти повністю відключену лінію, або варіації, як 1 на 1 кінці та 2 на іншому, залежить від мережі, яку я думаю?
Hornbydd

2

Це стара публікація, але, думаю, найпростішим рішенням є:

  1. Розпустіть свою полілінійну функцію
  2. Використовуйте функціональні вершини для точок з опцією "Повісити"
  3. Приєднайте за допомогою просторового розташування оригінальну функцію полілінії до отриманого шару точок. Скористайтеся опцією "Пересікається нею".

В результаті буде поле "Підрахунок" для кожного рядка у вашому шарі. якщо кількість літрів більше 1, рядок не "з'єднаний" з рештою рядків.

Концептуально: Крок 2 тут створює точки у вершинах з одним з'єднаним ребром (один рядок "входить", нуль "виходить"). Оскільки кожен рядок у "підключеній" мережі матиме щонайменше 1 таку вершину, будь-який рядок з більш ніж 1 не є частиною мережі і тому не "з'єднаний".


Цей метод дає багато помилкових позитивних результатів. Скажімо, дорога веде до перехрестя Т. Верхня частина Т матиме дві звисаючі вершини. Якщо взяти функції з кількістю двох, а потім знову перетинати їх із дорожньою мережею, ті, які не торкаються, - це острови.
woot

Власне, друге перехрестя, про яке я писав вище, знаходить лише окремі дороги. Не вдалося б дізнатися, чи є в мережі декілька частин
woot

1

Ось метод, який я придумав за допомогою деяких друзів, використовуючи Model Builder та Gephi. Крок 1 ArcModel створює таблицю посилань / ребер (додавання вузлів у кожному рядку за бажанням). Крок 2 Імпорт посилань / ребер Gephi та додавання ідентифікаторів компонентів Крок 3 ArcModel додає ідентифікатори компонентів назад до початкового рядка

Скріншот Крок 1 Бере всі вхідні функції, розбиває їх на перехрестя, щоб забезпечити наявність мережевого вузла та створити таблицю для імпорту в Gephi. Ось такі кроки: Процес: Особливість до рядка (може приймати декілька входів) Процес: багаточастотний процес для Singlepart Процес: Відновлення процесу геометрії: Додати початкові кінцеві координати (Додати атрибути Геометрії) Процес: Додати поле "Джерело" Процес: Додати поле "Ціль" Процес: обчисліть "Джерело" (як startX та startY) Процес: обчисліть "Цільовий" (як кінець X & endY) Процес: Видаліть поля (очищайте зайві поля, щоб уникнути плутанини) Процес: Таблиця GDB до CSV

Step2Gephi_Screenshot Крок 2 Процес Gephi (завантажити безкоштовно) - імпортувати вихід CSV з полями джерела та цілі з назвами полів вузла як посилання -запустити обчислені компоненти як ненаправлені (в інструментах статистики) - експортувати CSV з лабораторії даних для вузлів (включити ідентифікатор вузла та ідентифікатор компонента)

Крок 3: Бере висновок Gephi і додає атрибут компонента / мережі до вихідних рядків Процес: Таблиця до Таблиці (передайте висновок Gephi в базу даних Geodata для структури унікальних objectID) Процес: Поле приєднання (значення вузла джерела, приєднані до виводу Gephi для заповнення номера компонента до рядків) Символізувати за складовими

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.