Tham gia các đường giao nhau với PostGIS


15

Đây là điều mà tôi gần như xấu hổ khi hỏi nhưng dường như tôi không thể làm cho nó hoạt động được cho cuộc sống của tôi.

Tôi có một lớp đường với các phân khúc, mỗi phân khúc có một Road IDvà một phân khúc type.

Tôi muốn nối tất cả các phân đoạn lại với nhau, cho mỗi phân đoạn Road IDthành một dòng nhưng chỉ khi chúng giống nhau typechạm nhau (tất cả các dòng được nối với nhau).

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

Road ID - Type
   1       L
   1       L
   1       T
   1       L

Câu trả lời:


11

Tôi tin rằng mã dưới đây là một giải pháp sạch hơn một chút so với câu trả lời được chọn vì một vài lý do. Đầu tiên, không có phép nối bảng nào là cần thiết và do đó, một phụ lục của mệnh đề 'BẬT' là không cần thiết cho mỗi thuộc tính đường phố và thứ hai, phương pháp trên có thể có khả năng tạo ra nhiều đường nối nếu có nhiều cụm đường không liền kề có tất cả các giá trị thuộc tính giống nhau, trong khi ST_Dump xử lý vấn đề đó trong giải pháp này.

SELECT (ST_Dump(geom)).geom AS geom, "road_id", "road_type"
FROM (
    SELECT ST_LineMerge(ST_Union(geom)) AS geom, "road_id", "road_type"
    FROM "RoadCentreLines"
    GROUP BY "road_id", "road_type"
) AS street_union

Hình học của tôi không hợp nhất với một trong hai truy vấn
Luffydude

@Luffydude quan tâm để cung cấp thêm thông tin? Có thể hình học bạn đang làm việc không được căn chỉnh sao cho có thể hợp nhất nó
Grant Humphries

Điều này làm việc rất tốt cho tôi để hợp nhất một tập dữ liệu đường dựa trên id đường. Điều này xử lý các con đường với những khoảng trống đẹp mắt (không có đường kẻ trên các phần khe hở). Tôi không phải là OP, nhưng đây là một câu trả lời tuyệt vời. Đây phải là câu trả lời được chấp nhận. Cảm ơn.
jbalk

Đây là câu trả lời tốt nhất!
aborruso

6

Có vẻ công việc này

SELECT a."Road_ID",a."Road_Type", ST_LineMerge(ST_Collect(a.the_geom))
FROM "RoadCentreLines" as a 
LEFT JOIN "RoadCentreLines" as b ON 
ST_Touches(a.the_geom,b.the_geom) 
    AND a."Road_Type" = b."Road_Type" 
    AND a."Road_ID" = b."Road_ID"
GROUP BY ST_Touches(a.the_geom,b.the_geom), a."Road_Type", a."Road_ID"

0

Chỉ nhổ nước bọt nhưng tôi có thể nghĩ ra một vài giải pháp khác. Tôi không biết họ tốt hơn hay tệ hơn, chỉ là họ khác.

Đầu tiên, nếu chỉ có một vài loại đường, bạn có thể đi từng loại với một số thứ như:

WITH type As (SELECT "Road_ID" As id WHERE "Road_Type" = 'type')
SELECT ST_LineMerge (ST_Collect(the_geom))
FROM "RoadCentreLines"
WHERE ST_StartPoint(the_geom) && ST_EndPoint(the_geom) IS TRUE
AND "Road_ID" IN (SELECT id FROM type);

Bạn cũng có thể sử dụng hầu hết các cách trên với Road_Type làm biến trong vòng lặp FOR nếu có một loạt các loại.

Suy nghĩ cuối cùng của tôi liên quan đến việc hợp nhất tất cả các hình học, sau đó gọi ra các loại đường bằng hàm ST_Line_Sub chuỗi ( Liên kết liên kết ) nhưng điều đó hoàn toàn không hoạt động.

Chúc may mắn với nó, Rob

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.