Voici une solution générique, que vous pouvez mettre en œuvre avec PostGIS ou tout autre logiciel compatible OGC.
REMARQUE: ce que je dis avant , un concept clé dans les logiciels libres et SIG est la standardisation : les meilleures solutions à adopter des normes, comme l' OGC les.
Votre problème est de "trouver des pseudo-noeuds" ... Mais je pense que c'est un peu plus, "trouver des non-pseudo-noeuds et joindre des lignes de pseudo-noeuds". Ma solution peut être utilisée pour les deux.
Les normes OGC offrent:
ST_Boundary (geom) : pour détecter les nœuds des lignes
ST_Dump (geom) : pour placer chaque nœud unique dans un enregistrement de table SQL.
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap peuvent être utilisés pour la tolérance de changement. J'utilise ST_DWithin.
Nous pouvons supposer que votre problème principal peut être spécifié avec ces objets et propriétés,
il n'y a que des segments de ligne (d'un segment de table ), représentés par une géométrie LINESTRING ... Je n'ai pas testé avec MULTILNE, si vous avez geometrytype = MULTIPOINT, vous pouvez diviser et caster MULTILINEs avec ST_Dump et ST_LineMerge;
chaque segment de ligne possède une (géométrie ID) GID et une (couleur ID) idline .
Donc, la première étape consiste à obtenir les nœuds qui proviennent de la jonction des lignes,
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;
REMARQUE: utiliser des caches car ils sont plus rapides que les vues. Utilisez "EXPLAIN SELECT ..." pour vérifier le temps CPU, cela peut prendre du temps.
Ici, les cycles et les lignes continues (de même couleur) sont détectés en tant que ncolors=1
points, et les pseudo-nœuds par ncolors=2
points, vous avez donc un calque avec ces points.
Votre tableau de "bons nœuds" est avec les "points limites" d'origine et sans "pseudo-nœuds".
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 ...