Burada, PostGIS veya diğer OGC uyumlu yazılımlarla uygulayabileceğiniz genel bir çözüm.
NOT: daha önce söylediğim gibi , FOSS ve CBS'de kilit bir kavram standardizasyondur : en iyi çözümler OGC olanlar gibi standartları benimser .
Senin sorunun "sahte düğüm bulmak" ... Ama ben biraz daha fazla olduğunu düşünüyorum, "sahte olmayan düğümleri bulmak ve sahte düğüm satırları katılmak". Benim çözümüm her ikisi için de kullanılabilir.
OGC standartları şunları sunar:
ST_Boundary (geom) : çizgilerin düğümlerini tespit etmek için
ST_Dump (geom) : her bir düğümü SQL tablo kaydına koymak için.
ST_Dİçinde, ST_Equals, ST_SnapToGrid, ST_Snap değişiklik toleransı için kullanılabilir. ST_DWithin kullanıyorum.
Ana sorununuzun bu nesneler ve özelliklerle belirtilebileceğini varsayabiliriz,
bir LINESTRING geometrisi ile temsil edilen sadece çizgi bölümleri (bir tablo çizgisi ) vardır ... MULTILNE ile test edilmedim, geometri tip = MULTIPOINT varsa, MULTILINE'ları ST_Dump ve ST_LineMerge ile bölebilir ve dökebilirsiniz;
her çizgi parçası bir (geometri kimliği) gid ve (renk kimliği) idline sahiptir .
Yani, ilk adım, çizgilere katılmadan gelen düğümleri elde etmektir,
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;
NOT: önbellekleri kullanarak görünümlerden daha hızlıdırlar. CPU süresini kontrol etmek için "EXPLAIN SELECT ..." seçeneğini kullanın, uzun sürebilir.
Burada döngüler ve sürekli (aynı renk) çizgiler ncolors=1
nokta olarak algılanır ve sözde düğümler ncolors=2
noktalara göre belirlenir, böylece bu noktalara sahip bir katmanınız olur.
"İyi düğümler" tablonuz orijinal "sınırlayıcı noktalar" ile ve "sözde düğümler" olmadan.
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 ...