Oto ogólne rozwiązanie, które można wdrożyć za pomocą PostGIS lub dowolnego innego oprogramowania zgodnego z OGC.
UWAGA: jak mówiłem wcześniej , kluczową koncepcją w FOSS i GIS jest normalizacja : najlepsze rozwiązania przyjmują standardy, takie jak OGC .
Twoim problemem jest „znaleźć pseudo-węzły” ... Ale myślę, że to trochę więcej, „znaleźć niepseudo-węzły i połączyć linie pseudo-węzłów”. Moje rozwiązanie może być wykorzystane w obu przypadkach.
Standardy OGC oferują:
ST_Boundary (geom) : do wykrywania węzłów linii
ST_Dump (geom) : aby umieścić każdy pojedynczy węzeł w rekordzie tabeli SQL.
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap mogą być używane do tolerancji zmian. Używam ST_DWithin.
Możemy przypuszczać, że główny problem można określić za pomocą tych obiektów i właściwości,
są tylko odcinki (z tabeli odcinek ), reprezentowana przez geometrii LineString ... Nie testowane MULTILNE, jeśli masz geometrytype = MULTIPOINT, można podzielić i multilinie odlewane z ST_Dump i ST_LineMerge;
każdy odcinek ma geometrię (ID) gid i kolor (ID) idline .
Pierwszym krokiem jest uzyskanie węzłów pochodzących z linii łączących,
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;
UWAGA: używanie pamięci podręcznej, ponieważ są one szybsze niż widoki. Użyj „WYBIERZ WYBÓR ...”, aby sprawdzić czas procesora, może to zająć dużo czasu.
Tutaj cykle i linie ciągłe (tego samego koloru) są wykrywane jako ncolors=1
punkty, a pseudo-węzły według ncolors=2
punktów, więc masz warstwę z tymi punktami.
Tabela „dobrych węzłów” zawiera oryginalne „punkty graniczne” i „pseudo-węzłów”.
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 ...