Ecco una soluzione generica, che puoi implementare con PostGIS o qualsiasi altro software conforme a OGC.
NOTA: come ho detto prima , un concetto chiave in FOSS e GIS è la standardizzazione : le migliori soluzioni adottano standard, come quelli OGC .
Il tuo problema è "trovare pseudo nodi" ... Ma penso che sia un po 'di più "trova nodi non pseudo e unisce linee di pseudo nodi". La mia soluzione può essere utilizzata per entrambi.
Gli standard OGC offrono:
ST_Boundary (geom) : per rilevare i nodi delle linee
ST_Dump (geom) : per inserire ogni singolo nodo in un record di tabella SQL.
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap possono essere utilizzati per la tolleranza di modifica. Sto usando ST_DWithin.
Possiamo supporre che il tuo problema principale possa essere specificato con questi oggetti e proprietà,
ci sono solo segmenti di linea (di una tabella di segmento ), rappresentate da una geometria LINESTRING ... non provato con MULTILNE, se avete GeometryType = MULTIPOINT, è possibile dividere e multilinee del cast con ST_Dump e ST_LineMerge;
ogni segmento di linea ha un gid (ID geometria) e un idline (ID colore) .
Quindi, il primo passo è ottenere i nodi che provengono dall'unione di linee,
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;
NOTA: utilizzo delle cache perché sono più veloci delle viste. Utilizzare "EXPLAIN SELECT ..." per controllare il tempo della CPU, può richiedere molto tempo.
Qui i cicli e le linee continue (dello stesso colore) vengono rilevate come ncolors=1
punti e gli pseudo nodi per ncolors=2
punti, quindi hai un livello con quei punti.
La tua tabella dei "buoni nodi" è con i "punti di demarcazione" originali e senza "pseudo nodi".
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 ...