在计算两个纬度/经度坐标之间的距离时,我的输出似乎略有偏差,我似乎无法弄清楚原因。下面是我的代码(半正矢公式的实现)
float calcDistance(double latHome, double lonHome, double latDest, double lonDest) {
double pi = 3.141592653589793;
int R = 6371; //Radius of the Earth
latHome = (pi/180)*(latHome);
latDest = (pi/180)*(latDest);
double differenceLon = (pi/180)*(lonDest - lonHome);
double differenceLat = (pi/180)*(latDest - latHome);
double a = sin(differenceLat/2) * sin(differenceLat/2) +
cos(latHome) * cos(latDest) *
sin(differenceLon/2) * sin(differenceLon/2);
double c = 2 * atan2(sqrt(a), sqrt(1-a));
double distance = R * c;
printf("%f\n", distance);
return distance;
}
输入:38.898556 -77.037852 38.897147 -77.043934
输出:0.526339
应该得到 0.5492
最佳答案
我能想到的唯一一件事(如果修复给出了预期的结果)是您覆盖本地参数 latHome
和 latDest
(但可能应该使用计算a
上面的differenceLon
和differenceLat
时的原始值)。为它们使用不同的名称,例如 latHomeTmp
,然后使用新名称计算 a
,它将起作用,例如:
double latHomeTmp = (pi/180)*(latHome);
double latDestTmp = (pi/180)*(latDest);
double a = sin(differenceLat/2.) * sin(differenceLat/2.) +
cos(latHomeTmp) * cos(latDestTmp) *
sin(differenceLon/2.) * sin(differenceLon/2.);
一般来说,保持传递给函数的参数不可变是一个好主意,以避免出现这样的情况(当然,这不是一成不变的规则,但我通常会遵守它)。
关于C - 半正矢公式略有偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32622440/