8 votos

¿Consulta de PostGIS para selección de características no conectados al resto de la red de carreteras?

Tengo un conjunto de datos de carreteras en una ciudad almacenados en un PostGIS base de datos habilitada. Me gustaría identificar y eliminar cualquier característica que no está conectado con el resto de la red de carreteras. Este comportamiento es común alrededor de los bordes de las redes, donde los datos se recorta.

enter image description here

He encontrado otras respuestas en el GIS SE que hacer esto, pero todos parecen uso de ArcGIS, y me gustaría solucionar el problema con PostGIS, QGIS, o una secuencia de comandos de Python.

Mi conjuntos de datos pueden incluir más de un millón de características, por lo que el rendimiento es una preocupación.

9voto

MBCook Puntos 8316

Fácilmente puede utilizar a PostGIS para seleccionar caminos que no se crucen otro camino:

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

4voto

ArMoraer Puntos 338

Puede usar este script en Python de QGIS para detectar las 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 las líneas de varias partes. No creo que se podría hacer mucho más rápido...

3voto

JShoe Puntos 310

Puede tira hacia fuera los caminos fáciles con método de @dbaston primero, luego use pgRouting para encontrar los casos más complicados, como cuando se tiene una red de caminos que no está conectada a alguna otra red.

Elegir un segmento de carretera que está definitivamente dentro de la red principal, luego tratar de encontrar una ruta de cada otro segmento a aquél. Si no existe ninguna ruta, borrar el segmento.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X