Bắt các nút bắt đầu và kết thúc của các dòng thành các dòng khác trong PostGIS


9

Có rất nhiều ví dụ cho thấy cách bắt các dòng thành điểm, nhưng tôi không thể tìm thấy bất kỳ cách nào (nhanh!) Khi bắt các nút bắt đầu và kết thúc của các chuỗi dòng thành các nút của các dòng khác.

Về cơ bản, tôi muốn "làm sạch" lớp của mình trong postgis (2.0), di chuyển các điểm gần giống nhau lại với nhau và khâu các khe hở nhỏ giữa các chuỗi dòng.

Sẽ không có vấn đề gì nhiều nếu tôi thêm một nút khác, di chuyển nút đầu tiên / cuối cùng của một trong hai dòng hoặc di chuyển cả hai điểm đến trung tâm.

Tôi đã tìm thấy hai tùy chọn, nhưng tôi không biết bắt đầu với một trong hai tùy chọn đó như thế nào:

Tùy chọn thứ hai nghe có vẻ khả thi, nhưng bất kỳ trợ giúp nào về cách làm theo phương pháp này sẽ được đánh giá rất cao.

Câu trả lời:


6

Tôi đã quản lý để giải quyết vấn đề này mà không cần sử dụng các công cụ GRASS hoặc các chức năng tô pô đã đề cập.

Về cơ bản, tôi lấy tất cả các nút bắt đầu và kết thúc, đặt chúng vào một bảng mới, tạm thời, đặt một bộ đệm xung quanh chúng, hợp nhất các đối tượng bộ đệm và di chuyển tất cả các nút tìm thấy trong mỗi bộ đệm đến trung tâm của bộ đệm.

Khi xong, tôi di chuyển điểm bắt đầu và điểm kết thúc ban đầu đến vị trí mới.

Dễ dàng hơn dự kiến ​​và vẫn nhanh, nhưng tôi hy vọng PostGIS sẽ có một số chức năng tích hợp sẵn cho việc này - điều đó sẽ còn nhanh hơn nữa.

Chỉnh sửa: vì lợi ích của việc trả lại cho cộng đồng, đây là mã (khá nhảm nhí) của tôi bây giờ.

drop table if exists nodes;
drop table if exists nodes2;
drop table if exists buffers;

-- Get Start and End nodes
select ST_StartPoint(wkb_geometry) startnode,  ST_EndPoint(wkb_geometry) endnode,    ogc_fid into nodes  from sourceTable;
-- Combine all nodes into one table for easier queries
select startnode node, ogc_fid into nodes2 from nodes;
insert into nodes2 select endnode node, ogc_fid from nodes;

-- Some indexes to speed everything up
CREATE INDEX nodesstart_idx ON nodes USING gist  (startnode);
CREATE INDEX nodesend_idx ON nodes USING gist  (endnode);
CREATE INDEX nodes2_idx ON nodes2 USING gist  (node);
CREATE INDEX nodes_ogcfid_idx ON nodes USING btree (ogc_fid ASC NULLS LAST);

-- Create buffers, combine them, split combined objects again
select (ST_Dump(ST_Union(ST_Buffer(node, 1)))).geom geom into buffers from nodes2;
CREATE INDEX buffers_idx ON buffers USING gist  (geom);

-- Update start/end nodes table
UPDATE nodes SET startnode = ST_Centroid((select geom from buffers WHERE geom && startnode));
UPDATE nodes SET endnode = ST_Centroid((select geom from buffers WHERE geom && endnode));
-- Update original points
update sourceTable set wkb_geometry = ST_SetPoint(
ST_SetPoint(wkb_geometry, 0, (select startnode from nodes where ogc_fid=sourceTable.ogc_fid)), 
ST_NumPoints(wkb_geometry) - 1, (select endnode from nodes where ogc_fid=sourceTable.ogc_fid));

DROP TABLE nodes;
DROP TABLE nodes2;
DROP TABLE buffers;

Câu trả lời này trông khá giống với gợi ý "không tô pô" từ câu trả lời của tôi. Sẽ thật tử tế nếu bạn đưa ra một câu trả lời hoặc chọn câu trả lời. Đó là những gì nuôi sống cộng đồng ở đây :)
katahdin

Bạn đúng. Tôi đã đưa ra câu trả lời của bạn và sẽ chỉnh sửa câu trả lời của tôi để bao gồm mã của tôi.
Jelmer Baas

4

Dưới đây là ba lựa chọn. Hy vọng một người sẽ giúp.

v.

Sử dụng các công cụ GRASS trong QGIS, bạn có thể dọn sạch cấu trúc liên kết của một đối tượng không gian. Người dùng @RK cung cấp một bộ hướng dẫn tốt về cách thực hiện điều này trong câu trả lời cho một câu hỏi khác . Ưu điểm mà GRASS mang lại là nó sẽ suy ra cấu trúc liên kết của shapefile. Bất lợi cho tình huống của bạn là dữ liệu của bạn không ở trong một shapefile. Tất nhiên, bạn có thể xuất dữ liệu từ Postgres sang shapefile bằng công cụ "Thêm lớp PostGIS", nhưng đó là một bước bổ sung.

Các chức năng PostGIS không tô pô

Trong PostGIS, bạn có thể sử dụng các hàm ST_EndPointST_StartPoint để có điểm kết thúc và điểm bắt đầu cho một linestring. Sau đó, bằng cách sử dụng kết hợp ST_DWithi n và ST_Distance , bạn có thể tìm điểm bắt đầu hoặc điểm kết thúc gần nhất trên hình hình học gần đó. Nếu bạn có nhiều điểm thì ST_DWithin sẽ tăng tốc truy vấn rất nhiều - giả sử bạn có một chỉ mục tại chỗ. Từ đó bạn sẽ cần thiết lập một quy tắc xác định điểm nào sẽ được sửa đổi và điểm nào được sửa.

Ưu điểm ở đây là bạn không phải gửi dữ liệu của mình ra GRASS để dọn dẹp, nhưng có một số cạm bẫy cần chú ý.

Các chức năng PostGIS cấu trúc liên kết

Câu hỏi tham khảo các chức năng tô pô của PostGIS. Chúng hoạt động rất tốt, nhưng, như wiki mô tả , bạn phải xác định rõ ràng các cạnh, nút và mặt. Rõ ràng đây sẽ là một vấn đề cho tập dữ liệu của bạn vì bạn đã biết các vấn đề với cấu trúc liên kết.


1

PostGIS có chức năng chụp nhanh .. có lẽ họ sẽ giúp?

ST_Snap: Chụp các phân đoạn và đỉnh của hình học đầu vào thành các đỉnh của hình học tham chiếu.

ST_SnapToGrid: Chụp tất cả các điểm của hình dạng đầu vào vào một lưới thông thường.


1
Cảm ơn, tôi biết các chức năng này. ST_Snap chụp TẤT CẢ các nút, tôi chỉ muốn nút bắt đầu và kết thúc. ST_SnapToGrid không thực sự phù hợp vì nó sửa đổi tất cả các hình dạng hiện có và có cơ hội di chuyển các nút ở gần hơn, vì chúng chỉ rơi vào một phân khúc khác.
Jelmer Baas
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.