ฉันจัดการเพื่อแก้ปัญหานี้โดยไม่ต้องใช้เครื่องมือ GRASS หรือฟังก์ชั่นทอพอโลยีที่กล่าวถึง
โดยทั่วไปฉันใช้การเริ่มต้นและสิ้นสุดทั้งหมดวางไว้ในตารางใหม่ชั่วคราววางบัฟเฟอร์รอบพวกเขารวมวัตถุบัฟเฟอร์และย้ายโหนดที่พบทั้งหมดในแต่ละบัฟเฟอร์ไปยัง centroid ของบัฟเฟอร์
เมื่อเสร็จแล้วฉันจะย้ายจุดเริ่มต้นและจุดสิ้นสุดดั้งเดิมไปยังตำแหน่งใหม่
ง่ายกว่าที่คาดไว้และยังเร็ว แต่ฉันคาดว่า PostGIS จะมีฟังก์ชันในตัวสำหรับสิ่งนี้ - ซึ่งจะเร็วกว่า
แก้ไข: เพื่อประโยชน์ในการคืนกลับสู่ชุมชนนี่คือรหัสของฉัน (ค่อนข้างเส็งเคร็ง) ในตอนนี้
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;