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:

Sau:

Đâ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.
a.pk_uid != b.pk_uid