Hier eine generische Lösung, die Sie mit PostGIS oder einer anderen OGC-konformen Software umsetzen können.
HINWEIS: wie ich sage vor , ein Schlüsselbegriff in FOSS und GIS ist Standardisierung : Die besten Lösungen verabschieden Standards wie OGC diejenigen.
Ihr Problem ist, "Pseudoknoten zu finden" ... Aber ich denke, dass es ein bisschen mehr ist, "Nicht-Pseudoknoten zu finden und Linien von Pseudoknoten zu verbinden". Meine Lösung kann für beide verwendet werden.
OGC-Standards bieten:
ST_Boundary (geom) : um die Knoten der Linien zu erkennen
ST_Dump (geom) : um jeden einzelnen Knoten in einen SQL-Tabellendatensatz einzufügen .
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap können für die Änderungstoleranz verwendet werden. Ich benutze ST_DWithin.
Wir können davon ausgehen, dass Ihr Hauptproblem mit diesen Objekten und Eigenschaften spezifiziert werden kann.
nur Liniensegmente (eine Tabelle sind Liniensegment ), durch eine Linienfolge Geometrie dargestellt ... ich nicht mit MULTILNE getestet, wenn Sie GeometryType haben = MEHRFACH, können Sie teilen und Gussmultilinien mit ST_Dump und ST_LineMerge;
Jedes Liniensegment hat eine (Geometrie-ID) -ID und eine (Farb-ID) -ID .
Der erste Schritt besteht also darin, die Knoten zu ermitteln, die von Verbindungslinien stammen.
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;
HINWEIS: Verwenden von Caches, da diese schneller sind als Ansichten. Verwenden Sie "EXPLAIN SELECT ...", um die CPU-Zeit zu überprüfen. Dies kann sehr lange dauern.
Hier werden Zyklen und durchgehende (gleichfarbige) Linien als ncolors=1
Punkte und die Pseudoknoten als Punkte erkannt. ncolors=2
Sie haben also eine Ebene mit diesen Punkten.
Ihre Tabelle mit "guten Knoten" enthält die ursprünglichen "Begrenzungspunkte" und keine "Pseudoknoten".
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 ...