Truy vấn PostGIS để chọn các tính năng không được kết nối với phần còn lại của mạng lưới đường?


8

Tôi có bộ dữ liệu về các con đường trong thành phố được lưu trữ trong cơ sở dữ liệu hỗ trợ PostGIS. Tôi muốn xác định và xóa bất kỳ tính năng nào không được kết nối với phần còn lại của mạng lưới đường bộ. Hành vi này là phổ biến xung quanh các cạnh của mạng, nơi dữ liệu được cắt bớt.

nhập mô tả hình ảnh ở đây

Tôi đã tìm thấy các câu trả lời khác trên GIS SE thực hiện điều này, nhưng tất cả chúng dường như sử dụng ArcGIS và tôi muốn giải quyết vấn đề bằng PostGIS, QGIS hoặc tập lệnh Python.

Bộ dữ liệu của tôi có thể bao gồm hơn một triệu tính năng, vì vậy hiệu suất là một mối quan tâm.

Câu trả lời:


3

Tôi đã gặp một vấn đề tương tự, vì vậy tôi đã phát triển một plugin QGIS hiện có sẵn trong kho lưu trữ bổ trợ chính thức của QGIS và có thể tìm thấy trong menu QGIS: Plugins / Manage and Install Plugins ... và tìm kiếm Đảo bị ngắt kết nối.

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

Plugin này chạy trên một lớp polyline, xây dựng biểu đồ mạng đường bộ (hoặc đường sắt, v.v.) của các liên kết được kết nối. Sau đó, nó phân tích các sơ đồ con được kết nối, các sơ đồ được kết nối với nhau, nhưng không được kết nối với các liên kết bị cô lập hoặc nổi. Nó tạo ra một thuộc tính bổ sung chứa ID nhóm của sơ đồ con. Điều này sau đó có thể được sử dụng để tạo kiểu cho lớp với các kiểu Phân loại hoặc Thu phóng để chọn. Các liên kết bị ngắt kết nối sau đó có thể được sửa chữa hoặc gỡ bỏ.

Mã nguồn có thể được rẽ nhánh từ: https://github.com/AfriGIS-South-Africa/disconnected-islands

Bộ dữ liệu của tôi có khoảng 2 triệu liên kết và nó được phân tích trong vòng chưa đầy 15 phút, sử dụng 55 GB RAM.


Điều này nghe có vẻ hoàn hảo nhưng chỉ để bạn biết khi tôi gặp sự cố, tôi đã gặp lỗi plugin :(
wmebane

Cảm ơn phản hồi @wmebane. Tôi muốn khắc phục sự cố plugin bị hỏng cho bạn. Vui lòng bạn sẽ báo cáo thông báo lỗi tại hub.qgis.org/projects/disconnected-islands/issues/new hoặc qua email (nhấp vào Author bên trong trình quản lý plugin).
Peter

8

Bạn có thể dễ dàng sử dụng PostGIS để chọn những con đường không giao nhau với bất kỳ con đường nào khác:

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

Bạn có thể sử dụng tập lệnh Python QGIS này để phát hiện các dòng không được kết nối với bất kỳ thứ gì:

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

Lưu ý rằng điều này sẽ không hoạt động trên nhiều dòng. Tôi không nghĩ rằng nó có thể được thực hiện nhanh hơn nhiều ...


Tôi đang có cùng một vấn đề như câu hỏi trong chủ đề này. Cảm ơn giải pháp của bạn, tôi rất thích nó. Tôi đã gặp lỗi "'tiếp tục" không đúng trong vòng lặp ". Tôi sử dụng qgis3.4 và python3.7, vì tôi là người mới bắt đầu với python, tôi hy vọng bạn có thể giúp tôi. Cảm ơn rất nhiều ..
User0AB

3

Trước tiên, bạn có thể loại bỏ các đường dễ dàng bằng phương pháp @ dbaston, sau đó sử dụng pgRouting để tìm các trường hợp phức tạp hơn, chẳng hạn như khi bạn có một mạng lưới đường không được kết nối với một số mạng khác.

Chọn một đoạn đường chắc chắn nằm trong mạng chính, sau đó thử tìm một tuyến đường từ đoạn khác đến đoạn đó. Nếu không có tuyến đường tồn tại, xóa đoạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.