代码之家  ›  专栏  ›  技术社区  ›  rano

球面坐标转换中的疑问

  •  1
  • rano  · 技术社区  · 14 年前

    我正在尝试将球面坐标(即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;
    }
    

    我是否做了一些不正确的事情,或者背后有一些我看不到的数学知识(也许在数学溢出板上问这个问题?). 更新 没有必要交叉木板,因为有人正确地指出,这种转换对于计算两点之间的精确距离(两极之间的距离为零)没有意义。因此,我将其重新表述为:为什么在纬度的小三角洲(0.0001,相当于10米左右)处,距离似乎与哈弗斯线公式(20-25%)大不相同?

    更新2: 正如奥利·查尔斯沃思指出的,不考虑 z axis 使这种转换成为一种不考虑南北差异的投影。这也是我指出的三角洲差异的原因。事实上,在正确的变换中,z与纬度有关,如果你考虑它,然后计算两点之间的欧几里得距离(现在在三维空间中),纬度和经度都会得到一个很好的近似值。 对于小三角洲 . 例如,纬度误差为1.41米。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Forrest Voight    14 年前

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