Тут є загальне рішення, яке ви можете використовувати з PostGIS або будь-яким іншим програмним забезпеченням, сумісним з OGC.
Примітка: як я кажу , перш , ключовим поняттям в FOSS і ГІС є стандартизація : кращі рішення прийняти стандарти, як OGC з них.
Ваша проблема полягає в тому, щоб "знайти псевдовузли" ... Але я думаю, що це трохи більше, "знайти непсевдозвукові вузли та з'єднати рядки псевдовузлів". Моє рішення можна використовувати для обох.
Стандарти OGC пропонують:
ST_Boundary (geom) : для виявлення вузлів ліній
ST_Dump (geom) : щоб помістити кожен окремий вузол у запис таблиці SQL.
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap можна використовувати для толерантності до змін. Я використовую ST_DWithin.
Ми можемо припустити, що ваша основна проблема може бути вказана з цими об'єктами та властивостями,
є тільки відрізки (з таблиці LineSegment ), представлені геометрією LINESTRING ... Я не перевіряв з мультилінії, якщо у вас є geometrytype = MULTIPOINT, ви можете розділити і лите Multilines з ST_Dump і ST_LineMerge;
кожен відрізок має геометрію (ID) G і (колір 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;
ПРИМІТКА. Використовуйте кеші, оскільки вони швидші, ніж перегляди. Використовуйте "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 ...