Đây là một giải pháp chung, mà bạn có thể áp dụng với PostGIS hoặc bất kỳ phần mềm tương thích OGC nào khác.
LƯU Ý: như tôi đã nói trước đây , một khái niệm quan trọng trong FOSS và GIS là tiêu chuẩn hóa : các giải pháp tốt nhất áp dụng các tiêu chuẩn, giống như các tiêu chuẩn OGC .
Vấn đề của bạn là "tìm các nút giả" ... Nhưng tôi nghĩ rằng đó là một chút nữa, "tìm các nút không giả và nối các dòng của các nút giả". Giải pháp của tôi có thể được sử dụng cho cả hai.
Tiêu chuẩn OGC cung cấp:
ST_Boundary (geom) : để phát hiện các nút của các dòng
ST_Dump (geom) : để đặt từng nút đơn trong bản ghi bảng SQL.
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap có thể được sử dụng để thay đổi dung sai. Tôi đang sử dụng ST_DWithin.
Chúng tôi có thể giả sử rằng vấn đề chính của bạn có thể được chỉ định với các đối tượng và thuộc tính này,
chỉ có đoạn thẳng (của một bảng đoạn thẳng ), đại diện bởi một hình học LineString ... Tôi không thử nghiệm với MULTILNE, nếu bạn có GeometryType = MultiPoint, bạn có thể chia nhỏ và MULTILINEs dàn diễn viên với ST_Dump và ST_LineMerge;
mỗi phân đoạn dòng có gid (ID hình học) và idline (ID màu) .
Vì vậy, bước đầu tiên là có được các nút xuất phát từ việc nối các dòng,
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;
LƯU Ý: sử dụng bộ đệm vì chúng nhanh hơn chế độ xem. Sử dụng "GIẢI THÍCH CHỌN ..." để kiểm tra thời gian CPU, có thể mất nhiều thời gian.
Ở đây các chu kỳ và các đường liên tục (cùng màu) được phát hiện dưới dạng ncolors=1
các điểm và các nút giả theo ncolors=2
điểm, vì vậy, bạn có một lớp với các điểm đó.
Bảng "nút tốt" của bạn có "điểm giới hạn" ban đầu và không có "nút giả".
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 ...