如何编写查询语句找出未合并的等高线(LineString)
找出未合并等高线的PostGIS查询语句
核心思路
未合并的等高线通常满足两个核心条件:
- 拥有相同的高程值(等高线的核心属性);
- 两条线的端点相互重合(具备拼接成单条线的条件)。
查询语句示例
假设你的等高线表名为contours,存储高程的字段为elevation,几何字段为geom:
WITH contour_endpoints AS ( -- 提取每条等高线的起点和终点 SELECT id, elevation, ST_StartPoint(geom) AS start_pt, ST_EndPoint(geom) AS end_pt, geom FROM contours ) SELECT c1.id AS contour_id_1, c2.id AS contour_id_2, c1.elevation, c1.geom AS geom_1, c2.geom AS geom_2 FROM contour_endpoints c1 JOIN contour_endpoints c2 ON -- 匹配同一高程的等高线 c1.elevation = c2.elevation -- 排除自身与自身的匹配 AND c1.id < c2.id -- 检查两条线是否有端点重合 AND (ST_Equals(c1.start_pt, c2.start_pt) OR ST_Equals(c1.start_pt, c2.end_pt) OR ST_Equals(c1.end_pt, c2.start_pt) OR ST_Equals(c1.end_pt, c2.end_pt)) -- 可选:排除已经连续可直接拼接的线(若无需此判断可删除) WHERE NOT ST_Contiguous(c1.geom, c2.geom);
关键函数说明
ST_StartPoint/ST_EndPoint:提取线要素的起点、终点坐标;ST_Equals:精准判断两个点是否完全重合;ST_Contiguous:判断两条线是否已处于连续可拼接状态(部分PostGIS版本支持,无此函数可替换为ST_Touches);WITH子句:预处理每条线的端点信息,简化后续关联逻辑。
处理浮点精度误差场景
如果等高线存在端点极近但不完全重合的情况(因浮点精度导致),可改用ST_DWithin设置距离阈值(示例为0.1米):
AND (ST_DWithin(c1.start_pt, c2.start_pt, 0.1) OR ST_DWithin(c1.start_pt, c2.end_pt, 0.1) OR ST_DWithin(c1.end_pt, c2.start_pt, 0.1) OR ST_DWithin(c1.end_pt, c2.end_pt, 0.1))
内容的提问来源于stack exchange,提问作者lucasmsqt
相关产品推荐
相关产品推荐

