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

修正Delphi 11 Pascal GPS两点距离计算公式(误差翻倍问题)

Delphi 11 GPS短距离计算修正方案及对比

修正后的短距离计算代码

针对车辆每秒行驶的极短距离场景,可忽略地球曲率采用平面近似法,修正后的代码如下:

const 
  degToRad = System.Pi / 180;
  iEarthRadius = 6371000; // 单位:米
var   
  dDistance, dLat1, dLon1, dLat2, dLon2: Double;
  dLatRad, dLonRad, meanLatRad: Double;
begin
  // 计算经纬度差的弧度值
  dLatRad := (dLat2 - dLat1) * degToRad;
  dLonRad := (dLon2 - dLon1) * degToRad;
  
  // 取两点平均纬度的弧度值(短距离下用任意一点纬度也可,精度差异可忽略)
  meanLatRad := ((dLat1 + dLat2) / 2) * degToRad;
  
  // 平面近似法计算距离
  dDistance := iEarthRadius * System.Sqrt(
    System.Math.Power(dLatRad, 2) + 
    System.Math.Power(dLonRad * System.Cos(meanLatRad), 2)
  );
end;

原代码的缺陷分析

原代码存在3个核心问题,直接导致计算结果出现±2倍误差:

  1. 三角函数误用:错误使用余割Cosecant(即1/Sin),而经度方向的距离校正应使用余弦Cos;
  2. 单位未统一:纬度差dLat1 - dLat2直接以度数参与计算,未转换为弧度,导致维度方向距离缩放错误;
  3. 缩放逻辑混乱:将iEarthRadius * degToRad作为整体缩放系数,但内部经纬度差仍为度数,双重缩放引发结果偏差。

与Haversine公式的对比

  • 精度层面:对于每秒行驶的极短距离(通常几十米以内),平面近似法和Haversine公式的计算结果几乎一致,地球曲率的影响可完全忽略;
  • 性能层面:平面近似法仅需基础加减乘除和一次余弦计算,运算速度更快,更适合高频次的每秒计算场景;
  • 适用场景:若后续需计算长距离(如跨城市),Haversine公式的大圆距离计算会更准确,但对于当前车辆短距离的需求,平面近似法已足够理想。

内容的提问来源于stack exchange,提问作者EKISEK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:42:23