这里是一个通用解决方案,您可以将其与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 ...