寻求可提取重复线对象的PostGIS函数,`st_overlap`等无法实现
PostGIS提取重复线对象的解决方案
一、提取完全重复的线对象
如果是完全重合的线(含方向一致的情况),用ST_Equals函数即可匹配:
SELECT a.id, b.id FROM lines a JOIN lines b ON a.id < b.id WHERE ST_Equals(a.geom, b.geom);
注:a.id < b.id是为了避免重复配对(比如a.id=1和b.id=2,不会再出现a.id=2和b.id=1的情况)。
如果线的方向相反但几何上完全重合,结合ST_Reverse扩展判断:
SELECT a.id, b.id FROM lines a JOIN lines b ON a.id < b.id WHERE ST_Equals(a.geom, b.geom) OR ST_Equals(a.geom, ST_Reverse(b.geom));
二、提取部分重叠的线段
若要提取两个线对象的重叠部分几何,使用ST_Intersection函数,并过滤出有效线段交集:
SELECT a.id, b.id, ST_Intersection(a.geom, b.geom) AS overlapping_segment FROM lines a JOIN lines b ON a.id != b.id WHERE ST_GeometryType(ST_Intersection(a.geom, b.geom)) = 'ST_LineString';
这个语句会返回两个线重叠的线段部分,同时排除仅相交于点的无效情况。
三、关于ST_Overlaps/ST_Intersects无效的原因
ST_Overlaps:要求两个几何对象维度相同,且交集维度与原对象一致,同时各自存在部分区域不被对方包含。完全重合的线不满足“各自有部分不在对方内”,因此返回false。ST_Intersects:完全重合的线会返回true,但如果查询未排除自身匹配(比如没加a.id != b.id),或过滤条件有误,可能得不到预期结果。
内容的提问来源于stack exchange,提问作者OH.hong
相关产品推荐
相关产品推荐

