2010-08-24 69 views
1

我试图将球坐标(即从GPS设备的经度和纬度)转换为笛卡尔坐标。我遵循极坐标转换公式导出的this simple conversion转换球坐标的疑问

然后我计算应用欧几里得距离的两点之间的距离,但我发现的值并不总是与我使用haversine formula可以计算的距离相同。特别是我注意到,给定不同的经度,但相同的纬度导致由两种算法计算的相同距离,而具有相同的经度和改变纬度的值具有不同的值。

这里是我使用的C代码:(?也许问这对Mathoverflow板)

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; 
} 

我做得不正确或者有一些背后的数学,我没有看到。 UPDATE没有必要跨越棋盘,因为有人正确指出此转换对计算两点之间的精确距离(两极点之间的距离为零)没有意义。所以我将它改写为:为什么在小的三角洲(0.0001对应于10 mts或更多或更少)的纬度上,这个距离似乎与半散射公式(20-25%)有如此不同?

更新2: 作为奥利查尔斯沃思指出,不考虑z axis使这种转换不介意南北差异的投影。这也是我指出的三角洲差异的原因。事实上,在正确的变换中,z与纬度有关,如果你考虑它,然后计算两个点之间的欧氏距离(现在是3d空间),经纬度都会导致很好的近似值德尔塔斯。 例如纬度的误差为〜1.41米。

+3

“然后,我计算应用欧几里得距离的两点之间的距离,但我发现的值并不总是与使用半正弦公式计算的距离相同。” 欧氏距离是直线距离b/w点,而“半正规公式”计算球体上一个大圆的距离。为什么这些会产生相同的结果? – Jonathan 2010-08-24 22:31:42

+0

我正在计算笛卡尔系统中投影点之间的距离 – rano 2010-08-24 22:41:38

+0

@rano:这与沿地球表面的距离不一样。 – 2010-08-24 22:48:00

回答

1

this,没有保存距离的二维地图投影。计算从点的2D投影的距离是没有用的。

+1

我想你错了,有一些预测,如该页面所述,保留一些距离。 “......等距投影,如方位角等距投影,还有投影(毛勒,关闭),其中保留两点的真实距离”http://en.wikipedia.org/wiki/Azimuthal_equidistant_projection – rano 2010-08-24 22:42:39

+0

@rano:是的,所以无论投影如何,两个*任意*点之间的距离都不会保留。 – 2010-08-24 22:46:30

+0

正如上面的回答,我知道,我问为什么经度似乎保留它与经典转换 – rano 2010-08-24 22:50:55