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