我试图将球坐标(即从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米。
“然后,我计算应用欧几里得距离的两点之间的距离,但我发现的值并不总是与使用半正弦公式计算的距离相同。” 欧氏距离是直线距离b/w点,而“半正规公式”计算球体上一个大圆的距离。为什么这些会产生相同的结果? – Jonathan 2010-08-24 22:31:42
我正在计算笛卡尔系统中投影点之间的距离 – rano 2010-08-24 22:41:38
@rano:这与沿地球表面的距离不一样。 – 2010-08-24 22:48:00