นี่เป็นการแก้ปัญหาทั่วไปที่คุณสามารถบังคับใช้กับ PostGIS หรือซอฟต์แวร์ที่สอดคล้องกับ OGC อื่น ๆ
หมายเหตุ: ตามที่ผมบอกว่าก่อนที่จะเป็นแนวคิดที่สำคัญในฟอสส์และระบบสารสนเทศภูมิศาสตร์เป็นมาตรฐาน : โซลูชั่นที่ดีที่สุดนำมาใช้มาตรฐานเช่นOGCคน
ปัญหาของคุณคือ "ค้นหาโหนดหลอก" ... แต่ฉันคิดว่ามันเป็นอีกเล็กน้อย "ค้นหาโหนดที่ไม่ใช่หลอกและเข้าร่วมสายของโหนดหลอก" โซลูชันของฉันสามารถใช้ได้ทั้งคู่
ข้อเสนอมาตรฐาน OGC:
ST_Boundary (geom) : เพื่อตรวจจับโหนดของเส้น
ST_Dump (geom) : เพื่อวางแต่ละโหนดเดียวในระเบียน SQL ตาราง
ST_D ภายใน ST_Equals, ST_SnapToGrid, ST_Snap สามารถใช้สำหรับการยอมรับการเปลี่ยนแปลง ฉันใช้ ST_D ภายใน
เราสามารถสมมติว่าปัญหาหลักของคุณสามารถระบุได้ด้วยวัตถุและคุณสมบัติเหล่านี้
มีเพียงส่วนของเส้นตรง (ของเส้นตารางส่วนหนึ่ง ) ที่แสดงโดยรูปทรงเรขาคณิตของ LINESTRING ... ฉันไม่ได้ทดสอบกับ MULTILNE ถ้าคุณมีรูปทรงเรขาคณิต = MULTIPOINT คุณสามารถแยกและใช้ MULTILINE ด้วย ST_Dump และ ST_LineMerge;
ส่วนของเส้นแต่ละคนมี (ID เรขาคณิต) GIDและ (รหัสสี) idline
ดังนั้นขั้นตอนแรกคือการรับโหนดที่มาจากการรวมสาย
CREATE TABLE cache_bounds AS
SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
gid as color
-- if you not have something for "color label" of lines, use gid.
FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;
CREATE TABLE cache_joinnodes AS
-- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
SELECT *, array_length(colors,1) as ncolors FROM (
SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
SELECT
a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
, st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
FROM cache_bounds a, cache_bounds b
WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
-- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
GROUP BY a.gid, a.the_geom
) as t
) as t2;
หมายเหตุ: การใช้แคชเพราะเร็วกว่าการดู ใช้ "อธิบายเลือก ... " เพื่อตรวจสอบเวลา CPU ซึ่งอาจใช้เวลานาน
ที่นี่รอบและเส้น (สีเดียวกัน) อย่างต่อเนื่องตรวจพบเป็นncolors=1
จุดและโหนดหลอกโดยncolors=2
จุดดังนั้นคุณมีชั้นที่มีจุดที่
ตารางของ "โหนดที่ดี" ของคุณนั้นคือ "จุดเชื่อมต่อ" ดั้งเดิมและไม่มี "โหนดหลอก"
CREATE VIEW vw_joinnodes_full AS
SELECT b.*, j.ncolors
FROM cache_joinnodes j INNER JOIN cache_bounds b
ON j.gid=b.gid;
CREATE TABLE cache_good_nodes AS
SELECT *
FROM vw_joinnodes_full
WHERE ncolors=1 OR ncolors>2;
-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ...