¿Consulta PostGIS para seleccionar características no conectadas al resto de la red de carreteras?


8

Tengo un conjunto de datos de carreteras en una ciudad almacenado en una base de datos habilitada para PostGIS. Me gustaría identificar y eliminar cualquier característica que no esté conectada al resto de la red de carreteras. Este comportamiento es común en los bordes de las redes, donde se recortaron los datos.

ingrese la descripción de la imagen aquí

He encontrado otras respuestas en el SIG GIS que hacen esto, pero todas parecen usar ArcGIS, y me gustaría resolver el problema usando PostGIS, QGIS o un script de Python.

Mis conjuntos de datos pueden incluir más de un millón de funciones, por lo que el rendimiento es una preocupación.

Respuestas:


3

Tuve un problema similar, así que desarrollé un complemento QGIS que ahora está disponible en el repositorio oficial de complementos QGIS y se puede encontrar en el menú QGIS: Complementos / Administrar e instalar complementos ... y buscar Islas desconectadas.

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

Este complemento se ejecuta en una capa de polilínea, construyendo un gráfico de red de carretera (o ferrocarril, etc.) de enlaces conectados. Luego analiza subgrafías conectadas, unas que están conectadas entre sí, pero que no están conectadas a enlaces aislados o flotantes. Crea un atributo adicional que contiene el ID de grupo del subgrafo. Esto se puede usar para dar estilo a la capa con estilos categorizados, o Zoom a selección. Los enlaces desconectados pueden repararse o eliminarse.

El código fuente se puede bifurcar desde: https://github.com/AfriGIS-South-Africa/disconnected-islands

Mi conjunto de datos tiene alrededor de 2 millones de enlaces y se analizó en menos de 15 minutos, usando 55 GB de RAM.


Esto suena perfecto, pero para que lo sepas, cuando lo hago
aparece

Gracias por los comentarios @wmebane. Me encantaría solucionar el problema del complemento roto. Informe el mensaje de error en hub.qgis.org/projects/disconnected-islands/issues/new o por correo electrónico (haga clic en Autor dentro del administrador de complementos).
Peter

8

Puede usar fácilmente PostGIS para seleccionar carreteras que no se crucen con ninguna otra carretera:

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))

4

Puede usar este script QGIS Python para detectar líneas que no están 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

Tenga en cuenta que esto no funcionará en líneas de varias partes. No creo que se pueda hacer mucho más rápido ...


Tengo el mismo problema que la pregunta de este tema. Gracias por su solución, lo disfruté. Recibí el error "'continuar' no correctamente en el bucle". Yo uso qgis3.4 y python3.7, porque soy un principiante con python, espero que me puedan ayudar. Muchas gracias ..
User0AB

3

Puede eliminar las carreteras fáciles con el método de @ dbaston primero, luego use pgRouting para encontrar los casos más complicados, como cuando tiene una red de carreteras que no está conectada a otra red.

Elija un segmento de carretera que esté definitivamente dentro de la red principal, luego intente encontrar una ruta entre cada segmento a ese. Si no existe una ruta, elimine el segmento.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.