如何基于MySQL的GPS轨迹点与里程桩表生成QGIS可绘视图
解决MySQL生成QGIS可用轨迹线段的问题
我来帮你搞定这个问题!你的原SQL主要有几个关键问题导致线段不连接、重复生成:
- 分组逻辑缺失:只按
end_chainage分组,没关联R_id,导致不同线路(不同R_id)的同里程区段被错误合并 - 轨迹点未排序:
GROUP_CONCAT时没按chainage升序排列,生成的LineString点顺序混乱,自然连不成正确的线段 - 关联逻辑冗余:
LEFT JOIN会保留不在任何里程区段的轨迹点,改用INNER JOIN更贴合需求(只处理在区段内的点)
正确的SQL语句
CREATE VIEW qgis_track_segments AS SELECT t2.R_ID AS route_id, t2.Start_Chainage AS start_chainage, t2.End_Chainage AS end_chainage, t2.Condition AS segment_condition, -- 按里程顺序拼接轨迹点,生成LineString ST_GeomFromText( CONCAT( 'LineString(', GROUP_CONCAT(CONCAT(t1.longitude, ' ', t1.latitude) ORDER BY t1.chainage ASC SEPARATOR ','), ')' ), 4326 ) AS line_geom FROM Trackpoint t1 INNER JOIN Chainage t2 ON t1.r_id = t2.R_ID AND t1.chainage BETWEEN t2.Start_Chainage AND t2.End_Chainage -- 按线路+里程区段唯一分组,确保每个区段对应一条线段 GROUP BY t2.R_ID, t2.Start_Chainage, t2.End_Chainage, t2.Condition;
关键修正说明
- 分组逻辑优化:通过
R_ID + Start_Chainage + End_Chainage组合分组,确保每个线路的每个里程区段只生成一条线段 - 轨迹点排序:在
GROUP_CONCAT中添加ORDER BY t1.chainage ASC,让轨迹点严格按里程顺序排列,生成连续的线段 - 关联方式调整:用
INNER JOIN替代LEFT JOIN,只保留属于某个里程区段的轨迹点,避免无效的空线段 - 视图创建:直接创建视图
qgis_track_segments,方便后续在QGIS中直接加载
QGIS使用步骤
- 在QGIS中添加MySQL数据库连接
- 找到刚创建的
qgis_track_segments视图,添加到画布中 - 系统会自动识别
line_geom字段为空间几何列,直接就能看到正确连接的轨迹线段
内容的提问来源于stack exchange,提问作者loy
相关产品推荐
相关产品推荐

