You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

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

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:15:02