ここでは、PostGISまたは他のOGC準拠のソフトウェアで改善できる一般的なソリューションです。
注:前に言ったように、FOSSとGISの重要な概念は標準化です。最適なソリューションはOGCなどの標準を採用します。
あなたの問題は「擬似ノードを見つける」ことです...しかし、もう少し「非擬似ノードを見つけて擬似ノードの行を結合する」と思います。私のソリューションは両方に使用できます。
OGC標準は以下を提供します:
これらのオブジェクトとプロパティを使用して主な問題を特定できると想定できますが、
したがって、最初のステップは、ラインを結合することから来るノードを取得することです。
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;
注:ビューよりも高速であるため、キャッシュを使用します。「EXPLAIN SELECT ...」を使用してCPU時間を確認します。長時間かかる場合があります。
ここでは、サイクルと連続した(同じ色の)線がncolors=1
ポイントとして検出され、擬似ノードはポイントごとに検出されるncolors=2
ため、そのポイントを持つレイヤーができます。
「適切なノード」のテーブルには、元の「境界点」があり、「疑似ノード」はありません。
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 ...