Di sini soluion generik, yang dapat Anda perbaiki dengan PostGIS atau perangkat lunak lain yang sesuai dengan OGC.
CATATAN: seperti yang saya katakan sebelumnya , konsep kunci dalam FOSS dan GIS adalah standardisasi : solusi terbaik mengadopsi standar, seperti yang OGC .
Masalah Anda adalah untuk "menemukan node semu" ... Tapi saya pikir itu sedikit lebih, "menemukan node non-semu dan bergabung dengan garis-garis node semu". Solusi saya dapat digunakan untuk keduanya.
Standar OGC menawarkan:
ST_Boundary (geom) : untuk mendeteksi node dari garis
ST_Dump (geom) : untuk menempatkan setiap node dalam catatan tabel SQL.
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap dapat digunakan untuk mengubah toleransi. Saya menggunakan ST_DWithin.
Kami dapat menganggap bahwa masalah utama Anda dapat ditentukan dengan objek dan properti ini,
hanya ada segmen garis (dari pembagian baris tabel ), yang diwakili oleh geometri LINESTRING ... Saya tidak diuji dengan MULTILNE, jika Anda memiliki geometritip = MULTIPOINT, Anda dapat membagi dan membuat MULTILINE dengan ST_Dump dan ST_LineMerge;
setiap segmen garis memiliki (geometri ID) gid dan (ID warna) idline .
Jadi, langkah pertama adalah untuk mendapatkan node yang berasal dari bergabung dengan garis,
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;
CATATAN: menggunakan cache karena mereka lebih cepat daripada tampilan. Gunakan "EXPLAIN SELECT ..." untuk memeriksa waktu CPU, ini bisa memakan waktu lama.
Di sini siklus dan garis kontinyu (warna yang sama) dideteksi sebagai ncolors=1
titik, dan titik semu menurut ncolors=2
titik, jadi, Anda memiliki lapisan dengan titik itu.
Tabel "good node" Anda adalah dengan "poin pembatas" asli dan tanpa "pseudo node".
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 ...