Aquí hay una solución genérica, que puede aplicar a PostGIS o cualquier otro software compatible con OGC.
NOTA: como digo anterior , un concepto clave en FOSS y GIS es standardization : las mejores soluciones adoptan estándares, como OGC unos.
Su problema es "encontrar pseudo nodos" ... Pero creo que es un poco más, "encontrar nodos no pseudo y unir líneas de pseudo nodos". Mi solución se puede utilizar para ambos.
Oferta de estándares de OGC:
-
ST_Boundary (geom) : para detectar los nodos de las líneas
-
ST_Dump (geom) : para colocar cada nodo en un registro de la tabla SQL.
-
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap se puede usar para cambiar la tolerancia. Estoy usando ST_DWithin.
Podemos suponer que su problema principal se puede especificar con estos objetos y propiedades,
-
solo hay segmentos de línea (de una tabla linesegment ), representados por una geometría LINESTRING ... No he probado con MULTILNE, si tiene geometrytype = MULTIPOINT, puede dividir y lance MULTILINEs con ST_Dump y ST_LineMerge;
-
cada segmento de línea tiene un (ID de geometría) gid y un (ID de color) idline.
Entonces, el primer paso es obtener los nodos que vienen de unir líneas,
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: usa cachés porque son más rápidos que las vistas. Use "EXPLAIN SELECT ..." para verificar el tiempo de CPU, puede llevar mucho tiempo.
Aquí los ciclos y las líneas continuas (del mismo color) se detectan como ncolors=1
puntos,
y los pseudonodos por ncolors=2
puntos, entonces, tienes una capa con esos puntos.
Su tabla de "nodos buenos" está con los "puntos de delimitación" originales y sin "pseudo nodos".
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 ...