Это общее решение, которое вы можете использовать с 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;
у каждого сегмента линии есть (идентификатор геометрии) гид и (идентификатор цвета) 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 ...