PostGIS(PostgreSQL)查询识别无中断线串
识别无中断的线串(与其他线仅端点衔接)
以下查询可以筛选出那些仅通过端点与其他线衔接、自身未被其他线在中间截断的线串:
SELECT a.id, a.geom FROM mapeamento_urbano.hid_trecho_drenagem_l AS a WHERE NOT EXISTS ( SELECT 1 FROM mapeamento_urbano.hid_trecho_drenagem_l AS b WHERE a.id != b.id AND ST_Intersects(a.geom, b.geom) -- 排除两种中断情况: -- 1. 相交点不是a的起点/终点(a的中间被其他线截断) -- 2. 相交结果是线(两条线存在重叠,属于非端点衔接) AND ( NOT ( ST_Equals(ST_StartPoint(a.geom), ST_Intersection(a.geom, b.geom)) OR ST_Equals(ST_EndPoint(a.geom), ST_Intersection(a.geom, b.geom)) ) OR ST_GeometryType(ST_Intersection(a.geom, b.geom)) = 'ST_LineString' ) );
逻辑说明
- 用
ST_Intersects检测所有与当前线有交集的其他线 - 精准排除两类“中断”场景:
- 交集点既不是当前线的起点也不是终点,说明当前线的中间位置被其他线截断
- 交集为线类型,说明两条线存在重叠段,不属于端点衔接的连续情况
- 最终返回的线,均为仅通过端点与其他线衔接、自身无中断的线串
原查询的问题分析
原查询逻辑范围过窄,导致结果不符合预期:
- 仅检查了对方线的终点与交集点匹配,未覆盖当前线起点与其他线衔接的情况
- 用
ST_Touches限定了仅边界接触,遗漏了线重叠这类非端点衔接的中断场景 - 条件逻辑反向,错误排除了正常端点衔接的线
内容的提问来源于stack exchange,提问作者lucasmsqt
相关产品推荐
相关产品推荐

