我正试图将球面坐标(即GPS设备的经纬度)转换成笛卡尔坐标。下面是从极坐标转换方程导出的。
然后我用欧几里德距离计算两点之间的距离,但我得到的值并不总是和我用this simple conversion计算的距离相同。特别是我注意到,给定不同的经度,但相同的纬度会导致两种算法计算出的距离相同,而拥有相同的经度和改变纬度会带来不同的值。
这是我正在使用的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:
正如奥利·查尔斯沃思指出的,不考虑z axis会使这种转换成为一种不考虑南北差异的投影。这也是我指出的三角洲差异的原因。事实上,在正确的变换中z与纬度有关,如果你考虑它,然后计算两个点之间的欧几里德距离(现在在三维空间),纬度和经度都会导致小三角洲的良好近似。
例如,对于纬度度,误差约为1.41米。

最佳答案

this开始,没有保留距离的二维地图投影。从点的二维投影计算距离是无用的。

10-05 18:00
查看更多