Consulta PostGIS para selecionar recursos não conectados ao restante da rede rodoviária?

8

Eu tenho um conjunto de dados de estradas em uma cidade armazenada em um banco de dados PostGIS ativado. Gostaria de identificar e remover qualquer recurso que não esteja conectado ao restante da rede rodoviária. Esse comportamento é comum nas bordas das redes, onde os dados foram cortados.

insira a descrição da imagem aqui

Encontrei outras respostas no GIS SE que fazem isso, mas todas parecem usar o ArcGIS, e eu gostaria de resolver o problema usando PostGIS, QGIS ou um script Python.

Meus conjuntos de dados podem incluir mais de um milhão de recursos, portanto, o desempenho é uma preocupação.

wmebane
fonte

Respostas:

3

Como tive um problema semelhante, desenvolvi um plug-in QGIS, que agora está disponível no repositório oficial de plug-ins do QGIS e pode ser encontrado no menu QGIS: Plugins / Gerenciar e instalar plug-ins ... e procure por Disconnected Islands.

http://plugins.qgis.org/plugins/disconnected-islands/

Este plug-in é executado em uma camada de polilinha, criando um gráfico de rede rodoviária (ou ferroviária etc.) de links conectados. Em seguida, analisa subgráficos conectados, aqueles que estão conectados entre si, mas não conectados a links isolados ou flutuantes. Ele cria um atributo adicional que contém o ID do grupo do subgráfico. Isso pode ser usado para estilizar a camada com estilos categorizados ou Zoom para seleção. Os links desconectados podem ser corrigidos ou removidos.

O código-fonte pode ser bifurcado em: https://github.com/AfriGIS-South-Africa/disconnected-islands

Meu conjunto de dados possui cerca de 2 milhões de links e foi analisado em menos de 15 minutos, usando 55 GB de RAM.

Pedro
fonte
Isso parece perfeito, mas só para você saber quando eu dl-lo eu recebo um quebrado plug-in de erro :(
wmebane
Obrigado pelo feedback @wmebane. Gostaria de corrigir o problema de plug-in quebrado para você. Você reportará a mensagem de erro em hub.qgis.org/projects/disconnected-islands/issues/new ou via e-mail (clique em Autor dentro do gerenciador de plugins).
Peter
8

Você pode usar facilmente o PostGIS para selecionar estradas que não cruzam nenhuma outra estrada:

SELECT id, geom FROM roads a
WHERE NOT EXISTS 
     (SELECT 1 FROM roads b 
      WHERE a.id != b.id
      AND   ST_Intersects(a.geom, b.geom))
dbaston
fonte
4

Você pode usar este script QGIS Python para detectar linhas que não estão conectadas a nada:

from qgis.utils import iface

layer = iface.mapCanvas().currentLayer() # Selected layer

featureList = list( layer.getFeatures() ) # Gets all features
allFeatures = { feature.id(): feature for feature in featureList }

# Spatial indexing
spatialIdx = QgsSpatialIndex()
map( spatialIdx.insertFeature, featureList )

resList = [] # ids of features not connected to anything

for f in featureList:

    # List of potentially connected features from spatial indexing
    ids = spatialIdx.intersects( f.geometry().boundingBox() )

    hasNeighbor = False

    for id in ids:
        ifeature = allFeatures[id]

        if ifeature.id() == f.id():
            continue

        # Checks if f is really intersecting with ifeature
        if f.geometry().intersects(ifeature.geometry()):
            hasNeighbor = True
            break # Exit current for loop

    if (not hasNeighbor) and (not f.id() in resList):
        resList.append( f.id() )

print resList

Observe que isso não funcionará em linhas com várias partes. Eu não acho que poderia ser feito muito mais rápido ...

ArMoraer
fonte
Estou tendo o mesmo problema que a pergunta neste tópico. Obrigado pela sua solução, eu gostei. Eu recebi o erro "'continuar' não corretamente no loop". Eu uso qgis3.4 e python3.7, porque sou iniciante em python, espero que você possa me ajudar. Muito obrigado ..
User0AB
3

Você pode remover as estradas fáceis com o método @ dbaston primeiro e depois usar o pgRouting para encontrar os casos mais complicados, como quando você tem uma rede de estradas que não está conectada a outra rede.

Escolha um segmento de estrada que esteja definitivamente dentro da rede principal e tente encontrar uma rota um do outro para aquele. Se não houver uma rota, exclua o segmento.

Rob Skelly
fonte