怀疑转换球坐标

时间:2010-08-24 22:26:32

标签: c coordinate-systems cartesian haversine

我正在尝试将球面坐标(即GPS设备的纬度和经度)转换为笛卡尔坐标。我正在追踪从极坐标转换方程中得到的this simple conversion

然后我计算应用欧氏距离的两点之间的距离,但我找到的值并不总是与我使用haversine formula计算的距离相同。特别是我注意到,给定不同的经度但相同的纬度导致两种算法计算的距离相同,而具有相同的经度和改变纬度会带来不同的值。

这是我正在使用的C代码:

double ComputeDistance(double lat1,double lon1, double lat2, double lon2)
{

    double dlon, dlat, a, c;
    dlon = lon2- lon1;
    dlat = lat2 - lat1;
    a = pow(sin(dlat/2),2) + cos(lat1) * cos(lat2) * pow(sin(dlon/2),2);
    c = 2 * atan2(sqrt(a), sqrt(1-a));
    return 6378140 * c;  /* 6378140 is the radius of the Earth in meters*/


}
int main (int argc, const char * argv[]) {

    double lat1 = 41.788251028649575;
    double lat2 = 41.788251028649575;
    double long1 = -118.1457209154;
    double long2 = -118.1407209154;//just ~10 meters distant

    lat1 = DEGREES_TO_RADIANS(lat1);
    lat2 = DEGREES_TO_RADIANS(lat2);
    long1 = DEGREES_TO_RADIANS(long1);
    long2 = DEGREES_TO_RADIANS(long2);

    //transform in cartesian coordinates
    double x = 6378140 * cos(lat1) * cos(long1);
    double y = 6378140 * cos(lat1) * sin(long1);

    double x2 = 6378140 * cos(lat2) * cos(long2);
    double y2 = 6378140 * cos(lat2) * sin(long2);


    double dist = sqrt(pow(x2 - x, 2) + pow(y2 - y, 2));
    printf("DIST %lf\n", dist);
    printf("NDIST %lf\n", ComputeDistance(lat1, long1, lat2, long2));

    return 0;
}

我做错了什么或背后有一些数学我没看到(也许在Mathoverflow板上问这个?)。 更新没有必要跨板,因为有人正确指出这种转换对于计算两点之间的确切距离没有意义(两极之间的距离为零)。因此,我将其重新表述为:为什么在小的三角洲(0.0001,相当于10 mts或多或少)纬度,距离似乎与半正式公式(20-25%)如此不同?

更新2: 正如Oli Charlesworth指出的那样,不考虑z axis使得这种转换成为一种不考虑南北差异的预测。这也是我指出的三角洲差异的原因。事实上,在正确的变换中,z与纬度有关,如果你考虑它,那么计算两点之间的欧氏距离(现在在3d空间中),纬度和经度将导致良好的近似值对于小增量。 例如,对于纬度,误差为~1.41米。

1 个答案:

答案 0 :(得分:1)

this开始,没有2D地图投影,其中保留了距离。计算距离点投影的距离是没有用的。