C,计算两个GPS位置之间的距离?

问题描述 投票:0回答:5

如果我有两个 GPS 位置,例如 51.507222、-0.1275 和 48.856667、2.350833,我可以使用什么公式来计算两者之间的距离?我听说过很多关于半正矢公式的信息,但找不到任何有关它的信息,或者如何将其应用于 C。

我写了下面的代码,但是,它非常不准确。有人知道为什么吗?我想不通。问题出在函数本身,但我不知道它是什么。

float calcDistance(float A, float B, float C, float D) 
{
    float dLat;
    float dLon;
    dLat = (C - A);
    dLon = (D - B);
    dLat /= 57.29577951;
    dLon /= 57.29577951; 
    float v_a;
    float v_c;
    float distance;

    v_a = sin(dLat/2) * sin(dLat/2) + cos(A) * cos(C) * sin(dLon/2) * sin(dLon/2);
    v_c = 2 * atan2(sqrt(v_a),sqrt(1-v_a));
    distance = r * v_c;
    return distance;
}
c gps coordinates distance haversine
5个回答
4
投票

您的代码绝对正确。

我会将参数

A
B
C
D
重命名为
lat1
lon1
lat2
lon2

它返回以公里为单位的距离。 您需要将

r
定义为 6371,大约是地球的 半径


2
投票

您要寻找的是大圆距离


1
投票

这个页面有一段Javascript,我相信你可以很容易地在C中适应:

var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();

var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
        Math.cos(φ1) * Math.cos(φ2) *
        Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

var d = R * c;

1
投票

也许为时已晚,但这就是计算不准确的原因: -> A 和 C(lat1 和 lat2)也必须从度数转换为弧度

dLat /= 57.295779513082325;
dLon /= 57.295779513082325;
lat1 /= 57.295779513082325;
lat2 /= 57.295779513082325;

问候, 奥梅尔


0
投票

除数 (dlat/2) 也应该是双精度 (dlat/2.0)

© www.soinside.com 2019 - 2024. All rights reserved.