PostGIS-Abfrage zur Auswahl von Funktionen, die nicht mit dem restlichen Straßennetz verbunden sind?

8

Ich habe einen Datensatz von Straßen in einer Stadt in einer PostGIS-fähigen Datenbank gespeichert. Ich möchte alle Funktionen identifizieren und entfernen, die nicht mit dem Rest des Straßennetzes verbunden sind. Dieses Verhalten tritt häufig an den Rändern von Netzwerken auf, an denen die Daten abgeschnitten wurden.

Geben Sie hier die Bildbeschreibung ein

Ich habe in der GIS SE andere Antworten gefunden, die dies tun, aber alle scheinen ArcGIS zu verwenden, und ich möchte das Problem mithilfe von PostGIS, QGIS oder einem Python-Skript lösen.

Meine Datensätze können über eine Million Funktionen enthalten, daher ist die Leistung ein Problem.

wmebane
quelle

Antworten:

3

Ich hatte ein ähnliches Problem, deshalb habe ich ein QGIS-Plugin entwickelt, das jetzt im offiziellen QGIS-Plugins-Repository verfügbar ist und im QGIS-Menü zu finden ist: Plugins / Plugins verwalten und installieren ... und nach getrennten Inseln suchen.

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

Dieses Plugin wird auf einer Polylinienebene ausgeführt und erstellt ein Straßendiagramm (oder eine Schiene usw.) mit verbundenen Verbindungen. Anschließend werden verbundene Untergraphen analysiert, die miteinander verbunden, aber nicht mit isolierten oder schwebenden Verbindungen verbunden sind. Es wird ein zusätzliches Attribut erstellt, das die Gruppen-ID des Untergraphen enthält. Dies kann dann verwendet werden, um die Ebene mit kategorisierten Stilen zu formatieren oder auf Auswahl zu zoomen. Die getrennten Verbindungen können dann repariert oder entfernt werden.

Der Quellcode kann gegabelt werden unter: https://github.com/AfriGIS-South-Africa/disconnected-islands

Mein Datensatz hat ungefähr 2 Millionen Links und wurde in weniger als 15 Minuten mit 55 GB RAM analysiert.

Peter
quelle
Das klingt perfekt, aber nur damit Sie wissen, wenn ich es dl, bekomme ich einen defekten Plugin-Fehler :(
wmebane
Danke für das Feedback @wmebane. Ich würde gerne das kaputte Plugin-Problem für Sie beheben. Bitte melden Sie die Fehlermeldung unter hub.qgis.org/projects/disconnected-islands/issues/new oder per E-Mail (klicken Sie im Plugin-Manager auf Autor).
Peter
8

Mit PostGIS können Sie ganz einfach Straßen auswählen, die keine andere Straße kreuzen:

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
quelle
4

Mit diesem QGIS Python-Skript können Sie Zeilen erkennen, die mit nichts verbunden sind:

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

Beachten Sie, dass dies bei mehrteiligen Leitungen nicht funktioniert. Ich glaube nicht, dass es viel schneller gehen könnte ...

ArMoraer
quelle
Ich habe das gleiche Problem wie die Frage in diesem Thema. Vielen Dank für Ihre Lösung, ich habe es genossen. Ich habe den Fehler "'weiter' nicht richtig in der Schleife" erhalten. Ich benutze qgis3.4 und python3.7, da ich ein Anfänger mit Python bin, hoffe ich, dass Sie mir helfen können. Vielen Dank ..
User0AB
3

Sie können die einfachen Straßen zuerst mit der Methode von @ dbaston entfernen und dann mit pgRouting die komplizierteren Fälle ermitteln, z. B. wenn Sie ein Straßennetz haben, das nicht mit einem anderen Netzwerk verbunden ist.

Wählen Sie ein Straßensegment, das sich definitiv innerhalb des Hauptnetzes befindet, und versuchen Sie dann, eine Route von jedem anderen Segment zu diesem zu finden. Wenn keine Route vorhanden ist, löschen Sie das Segment.

Rob Skelly
quelle