Verificando a "conexão" do arquivo shapefile de linha no ArcMap?

9

Eu herdei um arquivo shapefile de linha no ArcMap que é usado para representar uma rede de estradas. O problema é que a rede rodoviária é bastante grande e é impossível para mim:

  1. Diga se o final de cada linha (segmentos da estrada) está "conectado" a uma aresta, vértice ou ao final de outra linha (segmento da estrada); e
  2. Diga se toda a rede rodoviária está "conectada" - ou seja, posso rastrear uma rota de qualquer ponto da rede rodoviária para qualquer outro ponto da rede rodoviária?

Existe uma maneira de fazer isso no ArcMap? Ou seja, existe uma função que me permita destacar segmentos de linha que não se conectam a outros segmentos de linha ou algo semelhante que me permita responder às duas perguntas acima?

derNincompoop
fonte

Respostas:

14

Sim, mas mais ou menos. O ArcGis não possui mais a topologia de nó de linha que permite ao usuário informar quantos arcos (linhas) estão conectados em suas extremidades (nós).

Verificar é uma coisa, mas que tal corrigir? Se você abrir a classe de recurso no ArcMap e, em seguida, usar linhas planarizadas (dê uma tolerância), as linhas serão quebradas e divididas na interseção - economizando muito trabalho. Se você não deseja dividir as linhas, considere a ferramenta Integrar, mas tenha cuidado ao usar uma tolerância muito pequena, ela encaixará as extremidades, mas poderá fazer com que as linhas também se encaixem. Antes de usar o Integrate, faça um backup, pois isso pode destruir seus dados!

Agora, para encontrar pontos desconectados, use os Vértices de Recurso para Pontos para obter os pontos finais e, em seguida, Coletar Eventos, que fornecerão uma classe de recurso com o número de pontos finais presentes; nesse estágio, qualquer evento 1 é suspeito, portanto você precisará separar estes fora.

Para descobrir se ele deve ser conectado é a próxima tarefa, use Generate Near Table (novamente com uma tolerância adequada) e a opção of closest = ALL usando os eventos com uma contagem de 1 em relação às linhas originais e, em seguida, usando Estatísticas de resumo que você pode encontrar para cada ponto, a contagem de registros usando o IN_FID como um campo de caso e NEAR_FID como um campo de estatística com um tipo de estatística "COUNT".

Para facilitar a extração da tabela local, os registros com uma distância maior que 0 usando a Seleção de tabela . Cada evento encontrará a linha que a gerou, mas a distância será 0; se estiver anexada corretamente a outra linha (em um vértice), a distância também será 0; portanto, agora qualquer evento que tenha um registro restante na tabela ao lado é possivelmente separado, mas estes precisarão ser visualizados manualmente.

Michael Stimson
fonte
Obrigado. Vou verificar essas funções quando chegar ao trabalho amanhã e relatar de volta.
DerNincompoop
3
"Feature Vertice to Point" tem uma opção para gerar Dangle Points. Eu acho que isso simplificará seu fluxo de trabalho.
precisa saber é
Uau @klewis, quando isso apareceu? Certamente não estava lá no 9.3. Bem manchado!
Michael Stimson
4

Outra abordagem é usar a topologia do MAP. Eu bati esse pedaço de código VBA para identificar bordas pendentes. Se você vir arestas oscilantes dentro da rede, e não nas extremidades esperadas da rede, deverá haver uma desconexão.

Exemplo de seleção de arestas pendentes

O código depende de você ter o VBA instalado, estar no modo de edição e adicionar a camada de polilinha à topologia do mapa.

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
fonte
Eu gosto desse código, se você não se importa, vou copiar alguns pedaços; O benefício de fazê-lo dessa maneira é que ele está ativo e, à medida que os erros são corrigidos, eles desaparecem. A parte ruim é que, se uma linha estiver oscilando, será mostrado - se uma extremidade está conectada ou a linha está completamente desconectada. Posso sugerir que você altere o código para exibir o nó "valence" (quantas linhas conectadas) ou apenas os nós pendurados (essa é minha estação de trabalho saindo novamente!) ... isso seria incrível ... mas apenas se o OP possui capacidade VBA / VB.net.
Michael Stimson
11
Pode-se ajustar o código e obter arestas com valência de 1 nas duas extremidades para encontrar uma linha completamente desconectada, ou variações como 1 na extremidade 1 e 2 na outra, depende da rede, eu acho?
precisa saber é o seguinte
2

Este é um post antigo, mas acho que a solução mais simples é:

  1. Dissolver seu recurso de polilinha
  2. Usar opção Vértices para pontos com a opção Dangle
  3. União por localização espacial o recurso de polilinha original para a camada de pontos resultante. Use a opção "Intersected by it".

O resultado terá um campo "Contagem" para cada linha da sua camada. se o Count for maior que 1, a linha não estará "conectada" ao restante das linhas.

Conceitualmente: o passo 2 aqui cria pontos nos vértices com uma única aresta conectada (uma linha "entrando", zero "saindo"). Como cada linha na rede "conectada" terá no máximo 1 desses vértices, qualquer linha com mais de 1 não faz parte da rede e, portanto, não está "conectada".

NathanW
fonte
Este método produz muitos falsos positivos. Digamos que uma estrada leve a um entroncamento. A parte superior do T terá dois vértices pendentes. Se você pegar os recursos com uma contagem de dois e depois os interceptar novamente com a rede de estradas, os que não estiverem tocando são ilhas.
Wd #
Na verdade, a segunda interseção sobre a qual escrevi acima só encontra estradas isoladas. Não seria descobrir se a rede tem múltiplas partes
woot
1

Aqui está um método que eu criei, com a ajuda de alguns amigos, usando o Model Builder e o Gephi. Etapa 1 ArcModel criando tabela de links / arestas (adicionando nós em todas as linhas sobrepostas, se desejado) Etapa 2 Importação de links / arestas pelo Gephi e adicionando IDs de componente Etapa 3 ArcModel adiciona IDs de componente de volta à linha original

Step1screenshot Etapa 1 Pega todos os recursos de entrada e os divide em cruzamentos para garantir a presença de um nó de rede e cria uma tabela a ser importada para o Gephi. Aqui estão as etapas: Processo: Feature To Line (pode receber várias entradas) Processo: Multipart To Singlepart Process: Repair Geometry Process: Add Start End coords (Add Geometry attribute) Processo: Add Field "Source" Process: Add Field "Target" Processo: Calcular "Origem" (como startX e startY) Processo: Calcular "Destino" (como final X e finalY) Processo: Excluir campos (limpar campos extras para evitar confusão) Processo: Tabela GDB para CSV

Step2Gephi_Screenshot Etapa 2 do processo Gephi (download gratuito) - importar saída CSV com os campos de nó nomeado de origem e destino como Links - Executar componentes calculados como não direcionados (em Ferramentas estatísticas) - Exportar CSV do Data Laboratory for Nodes (incluir ID do nó e ID do componente)

Etapa 3: Obtém a saída do Gephi e adiciona o atributo componente / rede às linhas originais Processo: Tabela a Tabela (ingere a saída do Gephi no Geodatabase para estruturar os IDs de objetos exclusivos) Processo: Join Field (valores do nó de origem unidos à saída do Gephi para preencher o número do componente nas linhas) Simbolize por componente

A limpeza após esse ponto provavelmente será um processo manual de examinar onde as desconexões estão ocorrendo ao longo das linhas e se a desconexão é uma separação válida no mundo real ou apenas uma falha de dados.

Jared Sellers
fonte