修正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倍误差:
- 三角函数误用:错误使用余割
Cosecant(即1/Sin),而经度方向的距离校正应使用余弦Cos; - 单位未统一:纬度差
dLat1 - dLat2直接以度数参与计算,未转换为弧度,导致维度方向距离缩放错误; - 缩放逻辑混乱:将
iEarthRadius * degToRad作为整体缩放系数,但内部经纬度差仍为度数,双重缩放引发结果偏差。
与Haversine公式的对比
- 精度层面:对于每秒行驶的极短距离(通常几十米以内),平面近似法和Haversine公式的计算结果几乎一致,地球曲率的影响可完全忽略;
- 性能层面:平面近似法仅需基础加减乘除和一次余弦计算,运算速度更快,更适合高频次的每秒计算场景;
- 适用场景:若后续需计算长距离(如跨城市),Haversine公式的大圆距离计算会更准确,但对于当前车辆短距离的需求,平面近似法已足够理想。
内容的提问来源于stack exchange,提问作者EKISEK
相关产品推荐
相关产品推荐

