Truy vấn đệ quy PostGIS dựa trên kết nối đường truyền


9

Tôi đang gặp khó khăn với một truy vấn. Tôi có một mạng lưới các linestrings, mỗi chuỗi có một giá trị trong cột n_type. Đây có thể là một trong số ít các lựa chọn. Tôi muốn tạo một bảng mới, nhóm bất kỳ dòng nào có cùng loại và tạo thành một dòng liên tục.

Trước:

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

Sau:

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

Đây là những gì tôi đã có cho đến nay. Nó trả về kết quả nhưng chúng không có ý nghĩa gì - các loại không khớp và nó trả về quá nhiều tính năng.

Cũng xin lưu ý rằng tôi đã xác định "liên tục" là bất kỳ dòng nào trong phạm vi 5 feet so với hàng xóm của nó và gặp nhau ở góc dưới 30 độ.

WITH RECURSIVE all_links (i, pk_uid, n_type, geom) AS (
    SELECT  1 AS i,
            pk_uid,
            n_type,
            geom
    FROM    network
    WHERE   n_type != 'none'

    UNION ALL

    SELECT  a.i + 1,
            b.pk_uid,
            b.n_type,
            b.geom
    FROM    network b, all_links a
    WHERE   b.n_type = a.n_type
    AND     b.geom <#> a.geom <= 5  --lines are continuous if within 5 feet of neighbor
    AND     ABS( DEGREES( 3*pi() - st_azimuth(st_startpoint(a.geom),st_endpoint(a.geom)) + st_azimuth(st_startpoint(b.geom),st_endpoint(b.geom)))::int % 360 - 180) <= 30 )  --only take links within 30 degrees of the same angle

SELECT i, n_type, ST_Union(the_geom) FROM all_links GROUP BY i, n_type

Tôi đã giả sử một truy vấn đệ quy là cách để đi, nhưng tôi rất vui khi được chứng minh là sai về điều đó. Đệ quy là một chút khó khăn để mò mẫm.

Chỉnh sửa: Tôi cũng nên thêm rằng tôi đã thử tổng hợp bằng ST_Union và ST_Linemerge, sau đó hủy kết quả. Kiểu này hoạt động, nhưng không chiếm giao lộ> 30 độ và cũng không thể tôn vinh khả năng chịu đựng năm chân cho kết nối.


Không đào sâu vào vấn đề này, một vài quan sát. Bạn sẽ cần hợp nhất a.geom và b.geom trong mệnh đề chọn của bạn. Bạn có thể nên đảm bảo rằng bạn không thử và tham gia một dòng với chính nóa.pk_uid != b.pk_uid
MickyT

@MickyT cảm ơn. Tôi nên đã đề cập rằng tôi có thể thực hiện liên kết trong mệnh đề CHỌN cuối cùng nhưng trong thời gian này vừa được chọn * để tôi có thể thấy tất cả các kết quả. Tôi sẽ sửa đổi đoạn mã của mình để hiển thị cuối cùng nó sẽ trông như thế nào.
spencerrecneps 17/2/2015

Truy vấn đệ quy là khó để mò mẫm. Lol và +1
John Powell

Một cái nhìn nhanh cho thấy bạn có thể có vấn đề với truy vấn cơ sở / neo của bạn. Bạn cần chọn điểm bắt đầu cho mỗi dòng, A, B, C, v.v., sau đó bạn sẽ xây dựng trong phần đệ quy. Có thể bạn cần thêm một số loại thứ tự vào truy vấn neo (có thể theo x hoặc y, hướng - khó biết mà không nhìn thấy dữ liệu). Tôi sẽ phá vỡ điều này và chắc chắn rằng tôi đã nhận được điểm bắt đầu hợp lý trước, trước khi tiếp tục với phần đệ quy. Tôi đã sử dụng một truy vấn đệ quy để tìm các vệt trong chuỗi thời gian gần đây và một khi tôi đã xác định chính xác các điểm neo, phần còn lại rất dễ dàng (ish)
John Powell

@dbaston. Điểm hay, nhưng bạn cũng có thể làm điều này với một truy vấn đệ quy và không phải ai cũng đã cài đặt nó.
John Powell

Câu trả lời:


1

Giải pháp của bạn là, ít nhất, thiếu một đơn đặt hàng trước của các thành phần dòng như John Barça nói.

Các truy vấn đệ quy là rất, rất khó để mò mẫm, tôi sẽ nói.

Bạn phải cố gắng sao chép hành vi ST_Linemerge trong một chức năng cơ sở dữ liệu mới. Trước tiên tôi sẽ thử xem nguồn gốc của việc thực hiện ST_Linemerge và sao chép, thay đổi nó để tạo ra co giật góc 30 độ.

Để loại bỏ khỏi tập hợp các phân đoạn không nằm ở góc <30 độ, bạn phải so sánh chúng trong vòng lặp tổng hợp.

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.