C - 半正矢公式略有偏差

标签 c haversine

在计算两个纬度/经度坐标之间的距离时,我的输出似乎略有偏差,我似乎无法弄清楚原因。下面是我的代码(半正矢公式的实现)

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

最佳答案

我能想到的唯一一件事(如果修复给出了预期的结果)是您覆盖本地参数 latHomelatDest (但可能应该使用计算a上面的differenceLondifferenceLat时的原始值)。为它们使用不同的名称,例如 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/

相关文章:

Python for循环遍历一列的所有行

c# - 使用 C# 将半径添加到经度和纬度

mysql - 计算最低距离点GeoJSON + Mysql + Node

c - C 编程中的格子冷杉滤波器?

c++ - 用于 DNS 更改通知的 Windows API

c - 为什么在结构和套接字创建中提到套接字的地址族?

c - 带有 iommu=on 且没有 VFIO 的 Linux 用户空间 DMA

javascript - 2 点之间的距离

c++ - 计算器程序错误

c - 在 C 中使用 do while 循环时遇到问题