Aqui está uma solução genérica, que você pode implementar com o PostGIS ou qualquer outro software compatível com OGC.
NOTA: como eu disse antes , um conceito-chave no software livre e no SIG é a padronização : as melhores soluções adotam padrões, como os OGC .
Seu problema é "encontrar pseudo-nós" ... Mas acho que é um pouco mais ", encontrar não-pseudo-nós e juntar linhas de pseudo-nós". Minha solução pode ser usada para ambos.
Os padrões OGC oferecem:
ST_Boundary (geom) : para detectar os nós das linhas
ST_Dump (geom) : para colocar cada nó único em um registro da tabela SQL.
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap podem ser usados para tolerância a alterações. Estou usando ST_DWithin.
Podemos supor que seu problema principal possa ser especificado com esses objetos e propriedades,
há apenas segmentos de linha (de uma tabela LineSegment ), representado por uma geometria LINESTRING ... Eu não testado com MULTILNE, se você tem GeometryType = multiponto, você pode dividir e multilines elenco com ST_Dump e ST_LineMerge;
cada segmento de linha possui um gid (ID da geometria) e um idline (ID da cor) .
Portanto, o primeiro passo é obter os nós resultantes da junção de linhas,
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: usando caches porque eles são mais rápidos que visualizações. Use "EXPLAIN SELECT ..." para verificar o tempo da CPU, isso pode levar um longo tempo.
Aqui, os ciclos e as linhas contínuas (da mesma cor) são detectados como ncolors=1
pontos, e os pseudo nós por ncolors=2
pontos; portanto, você tem uma camada com esses pontos.
Sua tabela de "bons nós" está com os "pontos limite" originais e sem "pseudo-nós".
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 ...