如何在PostGIS中获取A、B两点之间的经纬度坐标点
PostGIS获取A、B两点间带经纬度坐标点的解决方案

你可以根据实际需求场景选择对应的实现方法:
场景1:获取两点直连线段上的坐标点
如果不需要考虑实际路网,只需要两点直线连线上的采样点,可通过PostGIS内置的几何处理函数实现:
- 首先通过
ST_MakeLine将A、B两个点构造为LineString类型的线段 - 如果需要按固定间隔采样整条线段上的所有点:先使用
ST_Segmentize设置采样间隔,再通过ST_DumpPoints将拆分后的线段转为独立的点集合,最后通过ST_X、ST_Y提取经纬度
示例代码如下:
-- 示例:A点(116.39, 39.9)、B点(116.4, 39.92),按100米间隔采样线段上的所有点 SELECT ST_X((dp).geom) AS 经度, ST_Y((dp).geom) AS 纬度, ST_AsText((dp).geom) AS 点WKT格式 FROM ( SELECT ST_DumpPoints( ST_Segmentize( ST_MakeLine( ST_SetSRID(ST_MakePoint(116.39, 39.9), 4326)::geography, ST_SetSRID(ST_MakePoint(116.4, 39.92), 4326)::geography ), 100 -- 采样间隔单位为米,使用geography类型自动适配米级单位 )::geometry ) AS dp ) t;
如果只需要取线段上距离A点指定距离的单个点,使用ST_LineInterpolatePoint即可,示例:
-- 取线段上距离A点300米位置的坐标点 SELECT ST_X(geom) AS 经度, ST_Y(geom) AS 纬度 FROM ( SELECT ST_LineInterpolatePoint( ST_MakeLine( ST_SetSRID(ST_MakePoint(116.39, 39.9), 4326), ST_SetSRID(ST_MakePoint(116.4, 39.92), 4326) ), -- 计算目标点占线段总长度的比例 300 / ST_Length( ST_MakeLine( ST_SetSRID(ST_MakePoint(116.39, 39.9), 4326)::geography, ST_SetSRID(ST_MakePoint(116.4, 39.92), 4326)::geography ) ) ) AS geom ) t;
场景2:获取OSM路网中A、B两点通行路径上的坐标点
如果需要获取实际道路路径上的坐标点,需搭配pgRouting插件先计算路径,再拆分几何:
- 第一步:导入OSM数据时提前构建路网拓扑,生成source、target顶点字段
- 第二步:使用
pgr_dijkstra等路径规划函数计算两点间的最短/最优路径,得到路径对应的道路线段集合 - 第三步:将线段集合合并为完整路径线,再用上述
ST_Segmentize+ST_DumpPoints的方法提取坐标点
示例代码如下:
WITH path AS ( -- 计算两点最短路径,获取路径对应的道路几何 SELECT geom FROM pgr_dijkstra( 'SELECT gid AS id, source, target, length AS cost FROM osm_roads', 起点顶点ID, 终点顶点ID, FALSE ) p LEFT JOIN osm_roads r ON p.edge = r.gid ), merge_line AS ( -- 合并所有路径线段为单条LineString SELECT ST_LineMerge(ST_Collect(geom)) AS geom FROM path ) -- 按50米间隔采样路径上的所有坐标点 SELECT ST_X((dp).geom) AS 经度, ST_Y((dp).geom) AS 纬度 FROM ( SELECT ST_DumpPoints(ST_Segmentize(geom::geography, 50)::geometry) AS dp FROM merge_line ) t;
注意事项
- 涉及距离计算时优先将geometry转换为geography类型,避免平面坐标系的距离计算误差
- 如果需要保留点的空间属性,可以直接输出
(dp).geom字段,无需单独提取经纬度
内容的提问来源于stack exchange,提问作者Takhir Atamuratov
相关产品推荐
相关产品推荐

