PostGIS 또는 기타 OGC 호환 소프트웨어로 구현할 수있는 일반적인 솔루션입니다.
참고 : 앞에서 말했듯 이 FOSS 및 GIS의 핵심 개념은 표준화입니다 . 최상의 솔루션은 OGC 표준과 같은 표준을 채택 합니다.
당신의 문제는 "의사 노드를 찾는 것"입니다 ... 그러나 나는 그것이 "의사 노드가 아닌 의사 노드의 라인을 찾는 것"이라고 생각합니다. 내 솔루션을 모두 사용할 수 있습니다.
OGC 표준은 다음을 제공합니다.
ST_Boundary (geom) : 라인의 노드를 감지
ST_Dump (geom) : 각 단일 노드를 SQL 테이블 레코드에 넣습니다.
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap을 변경 공차에 사용할 수 있습니다. ST_DWithin을 사용하고 있습니다.
이러한 객체와 속성으로 주요 문제를 지정할 수 있다고 가정 할 수 있습니다.
LINESTRING 지오메트리로 표시되는 ( 테이블 lineegment의 ) 선 세그먼트 만 있습니다 ... MULTILNE로 테스트하지 않았습니다. geometrytype = MULTIPOINT가있는 경우 ST_Dump 및 ST_LineMerge를 사용하여 MULTILINE을 분할하고 캐스트 할 수 있습니다.
각 선분에는 (형상 ID) gid 및 (색상 ID) idline이 있습니다.
첫 번째 단계는 연결 라인에서 나오는 노드를 얻는 것입니다.
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;
참고 : 캐시는보기보다 빠르기 때문에 캐시를 사용합니다. CPU 시간을 확인하려면 "EXPLAIN SELECT ..."를 사용하십시오. 시간이 오래 걸릴 수 있습니다.
여기에서 사이클과 연속 (동일한 색상) 선은 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 ...