Vérification de la «connectivité» du fichier de formes de ligne dans ArcMap?


9

J'ai hérité d'un fichier de formes de ligne dans ArcMap qui est utilisé pour représenter un réseau routier. Le problème est que le réseau routier est assez grand et il m'est impossible de:

  1. Indiquez si la fin de chaque ligne (segments de route) est "connectée" à une arête, un sommet ou à la fin d'une autre ligne (segment de route); et
  2. Dire si l'ensemble du réseau routier est «connecté» - c'est-à-dire, puis-je tracer un itinéraire depuis n'importe quel point du réseau routier vers tout autre point du réseau routier?

Existe-t-il un moyen d'accomplir cela dans ArcMap? Autrement dit, existe-t-il une fonction qui me permettra de mettre en évidence des segments de ligne qui ne se connectent pas à d'autres segments de ligne, ou quelque chose de similaire qui me permettrait de répondre aux deux questions ci-dessus?

Réponses:


14

Oui, mais en quelque sorte. ArcGis n'a plus de topologie de nœud de ligne qui permet à l'utilisateur de savoir combien d'arcs (lignes) sont connectés à leurs extrémités (nœuds).

Vérifier est une chose, mais que diriez-vous de réparer à la place? Si vous ouvrez la classe d'entités dans ArcMap, puis utilisez des lignes planarisées (donnez une tolérance) et les lignes seront capturées et divisées à l'intersection - économise beaucoup de travail. Si vous ne souhaitez pas diviser les lignes, envisagez l'outil Intégrer, mais faites attention à utiliser une très petite tolérance, il alignera les extrémités ensemble mais peut également aligner les lignes. Avant d'utiliser Integrate, gardez une sauvegarde car elle peut détruire vos données!

Maintenant, pour trouver des extrémités déconnectées, utilisez les sommets d'entités vers les points pour obtenir les points d'extrémité, puis collectez les événements qui vous donneront une classe d' entités avec le nombre de points d'extrémité présents, à ce stade, tout événement de 1 est suspect, vous devrez donc séparer ceux-ci.

Pour déterminer s'il doit être connecté est la tâche suivante, utilisez Générer une table proche (à nouveau avec une tolérance appropriée) et l'option la plus proche = TOUT en utilisant les événements avec un compte de 1 par rapport aux lignes d'origine, puis en utilisant Statistiques récapitulatives, vous pouvez trouver pour chaque point, le nombre d'enregistrements utilisant IN_FID comme champ de cas et NEAR_FID comme champ de statistiques avec un type de statistique "COUNT".

Pour faciliter l'extraction de la table proche, les enregistrements avec une distance supérieure à 0 à l'aide de la sélection de table . Chaque événement trouvera la ligne qui l'a généré mais la distance sera 0, s'il est correctement attaché à une autre ligne (au sommet), la distance sera également 0, donc maintenant tout événement qui a un enregistrement restant dans la table proche est éventuellement disjoints mais ceux-ci devront être consultés manuellement.


Merci. Je vérifierai ces fonctions lorsque j'entrerai au travail demain et que je ferai rapport.
derNincompoop

3
"Feature Vertice to Point" a une option pour produire des points de pendaison. Je pense que cela simplifiera votre flux de travail.
klewis

Wow @klewis, quand est-ce apparu? Ce n'était certainement pas là en 9.3. Bien repéré!
Michael Stimson

4

Une autre approche consiste à utiliser la topologie MAP. J'ai fait tomber ce morceau de code VBA qui identifierait les bords pendants. Si vous voyez des bords pendants dans le réseau plutôt que les extrémités attendues du réseau, il doit y avoir une déconnexion.

Exemple de sélection de bords pendants

Le code dépend de l'installation de VBA, du mode édition et de l'ajout de la couche de polyligne à la topologie de la carte.

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

J'aime ce code, si cela ne vous dérange pas, je vais en copier quelques morceaux; L'avantage de le faire de cette façon est qu'il est en direct et que les erreurs sont corrigées, elles disparaîtront, la mauvaise partie est que si une ligne est suspendue, elle s'affiche - si une extrémité est connectée ou si la ligne est complètement déconnectée. Puis-je vous suggérer de changer le code pour afficher le nœud "valence" (combien de lignes connectées) ou simplement les nœuds suspendus (c'est mon poste de travail qui sort à nouveau!) ... ce serait génial ... mais seulement si l'OP a la capacité VBA / VB.net.
Michael Stimson

1
On pourrait modifier le code et obtenir des bords qui ont une valence de 1 aux deux extrémités pour trouver une ligne complètement déconnectée, ou des variations comme 1 à 1 extrémité et 2 à l'autre, cela dépend du réseau, je suppose?
Hornbydd

2

Il s'agit d'un ancien article, mais je pense que la solution la plus simple consiste à:

  1. Dissolvez votre fonction polyligne
  2. Option Utiliser les sommets d'entités vers les points avec balancement
  3. Joindre par emplacement spatial la fonction polyligne d'origine au calque de points résultant. Utilisez l'option "Intersecté par lui".

Le résultat aura un champ "Count" pour chaque ligne de votre couche. si le nombre est supérieur à 1, la ligne n'est pas "connectée" au reste des lignes.

Conceptuellement: l'étape 2 crée ici des points aux sommets avec une seule arête connectée (une ligne "entrant", zéro "sortant"). Étant donné que chaque ligne du réseau "connecté" aura au plus 1 tel sommet, toute ligne avec plus de 1 ne fait pas partie du réseau et n'est donc pas "connectée".


Cette méthode produit de nombreux faux positifs. Disons qu'une route mène à un croisement en T. La partie supérieure du T aura deux sommets pendants. Si vous prenez les entités avec un nombre de deux, puis les recoupez à nouveau avec le réseau routier, celles qui ne se touchent pas sont des îles.
woot

En fait, la deuxième intersection dont j'ai parlé ci-dessus ne trouve que des routes isolées. Il ne saurait pas si le réseau a plusieurs parties
woot

1

Voici une méthode que j'ai trouvée, avec l'aide de quelques amis, en utilisant Model Builder et Gephi. Étape 1 ArcModel créant une table de liens / bords (en ajoutant des nœuds à chaque chevauchement de ligne si vous le souhaitez) Étape 2 Importation Gephi de liens / bords puis ajoutant des ID de composant Étape 3 ArcModel ajoute des ID de composant à la ligne d'origine

Step1screenshot Étape 1 Prend toutes les entités en entrée les divise aux intersections pour s'assurer qu'un nœud de réseau est présent et crée une table à importer dans Gephi. Voici les étapes: Processus: Entité vers ligne (peut prendre plusieurs entrées) Processus: Multipart vers une seule partie Processus: Réparation de la géométrie Processus: Ajouter des cordons de début et de fin (Ajouter des attributs de géométrie) Processus: Ajouter un champ "Source" Processus: Ajouter un champ "Cible" Processus: Calculer "Source" (en tant que startX & startY) Processus: Calculer "Cible" (en tant que end X & endY) Processus: Supprimer des champs (nettoyer les champs supplémentaires pour éviter toute confusion) Processus: Table GDB en CSV

Step2Gephi_Screenshot Étape 2 Processus Gephi (téléchargement gratuit) -Importer la sortie CSV avec les champs de nœuds nommés source et cible sous forme de liens -Exécuter les composants calculés comme non dirigés (sous Outils statistiques) -Exporter CSV depuis Data Laboratory for Nodes (inclure l'ID de nœud et l'ID de composant)

Étape 3: prend la sortie Gephi et ajoute un attribut de composant / réseau aux lignes d'origine Processus: table à table (ingère la sortie Gephi dans la géodatabase pour structurer des ID d'objet uniques) Processus: Join Field (les valeurs du nœud source jointes à la sortie Gephi pour remplir le numéro de composant sur les lignes) Symboliser par composant

Le nettoyage après ce point sera probablement un processus manuel pour examiner où les déconnexions se produisent le long des lignes et si la déconnexion est une séparation réelle ou juste une faille de données.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.