Sprawdzanie „połączenia” pliku kształtu linii w ArcMap?

9

Odziedziczyłem plik kształtu linii w ArcMap, który służy do reprezentowania sieci drogowej. Problem polega na tym, że sieć dróg jest dość duża i nie mogę:

  1. Powiedz, czy koniec każdej linii (odcinków drogi) jest „połączony” z krawędzią, wierzchołkiem lub końcem innej linii (odcinka drogi); i
  2. Powiedz, czy cała sieć drogowa jest „połączona” - tzn. Czy mogę prześledzić trasę z dowolnego punktu w sieci drogowej do dowolnego innego punktu w sieci drogowej?

Czy istnieje sposób na osiągnięcie tego w ArcMap? Czy istnieje funkcja, która pozwoli mi wyróżnić segmenty linii, które nie łączą się z innymi segmentami linii, czy coś podobnego, co pozwoliłoby mi odpowiedzieć na dwa powyższe pytania?

derNincompoop
źródło

Odpowiedzi:

14

Tak, ale w pewnym sensie. ArcGis nie ma już topologii węzła-linii, która pozwala użytkownikowi stwierdzić, ile łuków (linii) jest połączonych na ich końcach (węzłach).

Sprawdzanie to jedna rzecz, ale może zamiast tego naprawić? Jeśli otworzysz klasę obiektów w ArcMap, a następnie użyjesz linii płaskich (podaj tolerancję), a linie zostaną przyciągnięte i podzielone na przecięciu - oszczędza to dużo pracy. Jeśli nie chcesz dzielić linii, rozważ narzędzie Zintegruj, ale uważaj, aby zastosować bardzo małą tolerancję, spowoduje to przyciągnięcie końców do siebie, ale może sprawić, że linie również będą przyciągać. Przed użyciem zintegruj zachowaj kopię zapasową, ponieważ może zniszczyć twoje dane!

Teraz, aby znaleźć rozłączone końce, użyj Punktów Wierzchołków do Punktów, aby zdobyć punkty końcowe, a następnie Zbieraj Wydarzenia, które dadzą ci klasę obiektów z liczbą obecnych punktów końcowych, na tym etapie podejrzane jest każde zdarzenie 1, więc będziesz musiał rozdzielić te out.

Aby dowiedzieć się, czy należy go połączyć, jest kolejnym zadaniem, użyj opcji Generuj w pobliżu tabeli (ponownie z odpowiednią tolerancją) i opcji closest = ALL, używając zdarzeń o liczbie 1 w stosunku do pierwotnych wierszy, a następnie za pomocą statystyk podsumowujących możesz znaleźć dla każdego punktu liczba rekordów wykorzystująca IN_FID jako pole obserwacji i NEAR_FID jako pole statystyki z typem statystyki „COUNT”.

Aby łatwiej wyodrębnić z bliskiej tabeli rekordy o odległości większej niż 0 za pomocą Select Table . Każde zdarzenie znajdzie linię, która go wygenerowała, ale odległość będzie wynosić 0, jeśli zostanie prawidłowo dołączona do innej linii (w wierzchołku), odległość będzie również wynosić 0, więc teraz każde zdarzenie, które ma rekord pozostały w bliskiej tabeli, ma wartość być może rozłączne, ale będą musiały być przeglądane ręcznie.

Michael Stimson
źródło
Dzięki. Sprawdzę te funkcje, kiedy jutro przyjdę do pracy i złożę raport.
derNincompoop
3
„Cecha od wierzchołka do punktu” ma opcję wyświetlania Zwisających punktów. Myślę, że to uprości Twój przepływ pracy.
klewis
Wow @klewis, kiedy to się pojawiło? Z pewnością nie było go w 9.3. Dobrze zauważony!
Michael Stimson,
4

Innym podejściem jest użycie topologii MAP. Poderwałem ten fragment kodu VBA, który identyfikowałby wiszące krawędzie. Jeśli widzisz wiszące krawędzie w sieci, a nie oczekiwane końce sieci, oznacza to, że musi nastąpić rozłączenie.

Przykład wybierania zwisających krawędzi

Kod polega na tym, że masz zainstalowany VBA, jesteś w trybie edycji i dodałeś warstwę polilinii do topologii mapy.

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
źródło
Podoba mi się ten kod, jeśli nie masz nic przeciwko, skopiuję kilka jego fragmentów; Zaletą robienia tego w ten sposób jest to, że jest aktywny, a gdy błędy zostaną naprawione, znikną, złą stroną jest to, że jeśli linia zwisa, to jest pokazana - czy jeden koniec jest podłączony, czy linia jest całkowicie odłączona. Czy mogę zasugerować zmianę kodu, aby wyświetlić węzeł „wartościowość” (ile połączonych linii) lub tylko zwisające węzły (to moja stacja robocza wychodzi ponownie!) ... to byłoby niesamowite ... ale tylko jeśli OP ma możliwość VBA / VB.net.
Michael Stimson,
1
Można by poprawić kod i uzyskać krawędzie, które mają wartościowość 1 na obu końcach, aby znaleźć całkowicie odłączoną linię, lub warianty takie jak 1 na 1 końcu i 2 na drugim, zależy od sieci, tak myślę?
Hornbydd,
2

To jest stary post, ale myślę, że najprostszym rozwiązaniem jest:

  1. Rozpuść funkcję polilinii
  2. Użyj opcji wierzchołków do punktów z opcją zwisania
  3. Połącz według położenia przestrzennego oryginalną operację polilinii z wynikową warstwą punktów. Użyj opcji „Przecinane przez to”.

Wynik będzie miał pole „Policz” dla każdej linii w warstwie. jeśli liczba jest większa niż 1, linia nie jest „połączona” z resztą linii.

Koncepcyjnie: krok 2 tworzy tutaj punkty w wierzchołkach z jedną połączoną krawędzią (jedna linia „wchodzi”, zero „wychodzi”). Ponieważ każda linia w sieci „połączonej” będzie miała co najwyżej 1 taki wierzchołek, każda linia z więcej niż 1 nie jest częścią sieci i dlatego nie jest „połączona”.

NathanW
źródło
Ta metoda generuje wiele wyników fałszywie dodatnich. Powiedzmy, że droga prowadzi do skrzyżowania T. Górna część litery T będzie miała dwa wiszące wierzchołki. Jeśli weźmiesz funkcje z liczbą dwóch, a następnie ponownie skrzyżujesz je z siecią dróg, te, które się nie dotykają, to wyspy.
woot
W rzeczywistości drugi punkt przecięcia, o którym pisałem powyżej, zawiera tylko izolowane drogi. Nie dowie się, czy sieć ma wiele części
woot
1

Oto metoda, którą wymyśliłem, z pomocą niektórych przyjaciół, przy użyciu Model Builder i Gephi. Krok 1 ArcModel tworzenie tabeli łączy / krawędzi (dodawanie węzłów w każdym wierszu nakłada się w razie potrzeby) Krok 2 Importowanie Gephi łączy / krawędzi, a następnie dodawanie identyfikatorów komponentów Krok 3 ArcModel dodaje identyfikatory komponentów z powrotem do oryginalnej linii

Zrzut ekranu 1 Krok 1: Wszystkie funkcje wejściowe dzielą je na skrzyżowaniach, aby upewnić się, że węzeł sieci jest obecny i tworzy tabelę do zaimportowania do Gephi. Oto kroki: Proces: Funkcja do linii (może przyjmować wiele danych wejściowych) Proces: Wiele części do pojedynczego elementu Proces: Napraw geometrię Proces: Dodaj początkowe końcowe współrzędne (Dodaj atrybuty geometrii) Proces: Dodaj pole „Źródło” Proces: Dodaj pole „Cel” Proces: Oblicz „Źródło” (jako startX i startY) Proces: Oblicz „Cel” (jako koniec X i koniec Y) Proces: Usuń pola (wyczyść dodatkowe pola, aby uniknąć pomyłek) Proces: Tabela GDB do CSV

Step2Gephi_Screenshot Krok 2 Proces Gephi (bezpłatne pobieranie) -importuj dane wyjściowe CSV z polami nazwanych węzłów Źródło i Cel jako Łącza -Run Oblicz komponenty jako przekierowane (w ramach narzędzi statystycznych) -Eksportuj CSV z Laboratorium danych dla węzłów (podaj identyfikator węzła i identyfikator komponentu)

Krok 3: Pobiera dane wyjściowe Gephi i dodaje atrybut komponentu / sieci do oryginalnych linii. Proces: Tabela do tabeli (pochłanianie danych wyjściowych Gephi do Geobazy w celu utworzenia unikalnych identyfikatorów obiektów). Proces: Połącz pole (wartości węzła źródłowego połączone z danymi wyjściowymi Gephi w celu wypełnienia numeru komponentu do linii) Symbolizuj według składnika

Oczyszczanie po tym punkcie będzie prawdopodobnie ręcznym procesem sprawdzania, gdzie rozłączenia występują wzdłuż linii i czy rozłączenie jest prawidłowym oddzieleniem w świecie rzeczywistym, czy tylko wadą danych.

Jared Sellers
źródło