Permintaan PostGIS untuk memilih fitur yang tidak terhubung ke jaringan jalan?

8

Saya memiliki dataset jalan di kota yang disimpan dalam database yang diaktifkan PostGIS. Saya ingin mengidentifikasi dan menghapus fitur apa pun yang tidak terhubung ke seluruh jaringan jalan. Perilaku ini biasa terjadi di sekitar tepi jaringan, di mana data terpotong.

masukkan deskripsi gambar di sini

Saya telah menemukan jawaban lain pada GIS SE yang melakukan ini, tetapi mereka semua tampaknya menggunakan ArcGIS, dan saya ingin menyelesaikan masalah menggunakan PostGIS, QGIS, atau skrip Python.

Kumpulan data saya dapat menyertakan lebih dari satu juta fitur, sehingga kinerja menjadi perhatian.

wmebane
sumber

Jawaban:

3

Saya memiliki masalah yang serupa, jadi saya mengembangkan sebuah plugin QGIS yang sekarang tersedia di repositori plugin QGIS resmi dan dapat ditemukan di menu QGIS: Plugins / Manage and Install Plugins ... dan cari Disconnected Islands.

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

Plugin ini berjalan pada lapisan polyline, membangun grafik jaringan tautan terhubung (atau rel, dll.). Ini kemudian menganalisis subgraph yang terhubung, yang terhubung satu sama lain, tetapi tidak terhubung ke tautan terisolasi atau mengambang. Itu menciptakan atribut tambahan yang berisi ID grup dari subgraph. Ini kemudian dapat digunakan untuk menata layer dengan gaya Categorized, atau Zoom untuk pemilihan. Tautan yang terputus kemudian dapat diperbaiki atau dihapus.

Kode sumber dapat diambil dari: https://github.com/AfriGIS-South-Africa/disconnected-islands

Dataset saya memiliki sekitar 2 juta tautan dan dianalisis dalam waktu kurang dari 15 menit, menggunakan 55 GB RAM.

Peter
sumber
Ini kedengarannya sempurna tetapi supaya Anda tahu ketika saya melakukannya saya mendapatkan kesalahan plugin yang rusak :(
wmebane
Terima kasih atas umpan balik @wmebane. Saya ingin memperbaiki masalah plugin yang rusak untuk Anda. Silakan laporkan pesan kesalahan di hub.qgis.org/projects/disconnected-islands/issues/new atau via email (klik pada Author di dalam plugin manager).
Peter
8

Anda dapat dengan mudah menggunakan PostGIS untuk memilih jalan yang tidak memotong jalan lain:

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

Anda dapat menggunakan skrip QGIS Python ini untuk mendeteksi baris yang tidak terhubung ke apa pun:

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

Perhatikan bahwa ini tidak akan berfungsi pada baris multi-bagian. Saya tidak berpikir itu bisa dibuat lebih cepat ...

ArMoraer
sumber
Saya memiliki masalah yang sama dengan pertanyaan dalam topik ini. Terima kasih atas solusi Anda, saya menikmatinya. Saya mendapat kesalahan "'lanjutkan' tidak benar dalam lingkaran". Saya menggunakan qgis3.4 dan python3.7, karena saya seorang pemula dengan python, saya harap Anda dapat membantu saya. Terima kasih banyak ..
User0AB
3

Anda dapat menghapus jalan yang mudah dengan metode @ dbaston terlebih dahulu, kemudian gunakan pgRouting untuk menemukan kasus yang lebih rumit, seperti ketika Anda memiliki jaringan jalan yang tidak terhubung ke jaringan lain.

Pilih ruas jalan yang secara definitif berada di dalam jaringan utama, lalu cobalah untuk menemukan rute dari masing-masing ruas yang lain ke yang itu. Jika tidak ada rute, hapus segmen tersebut.

Rob Skelly
sumber