【发布时间】:2010-08-24 22:26:32
【问题描述】:
我正在尝试将球坐标(即来自 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 米),距离似乎与半正弦公式(20-25%)如此不同?
更新 2:
正如 Oli Charlesworth 指出的那样,不考虑 z axis 会使这种转换成为不介意南北差异的投影。这也是我指出的增量差异的原因。事实上,在正确的变换中,z 与纬度有关,如果你考虑它,然后计算两点之间的欧几里得距离(现在在 3d 空间中),纬度和经度都会导致一个很好的近似 对于小三角洲。
例如,纬度的误差约为 1.41 米。
【问题讨论】:
-
“然后我应用欧几里得距离计算两点之间的距离,但我找到的值并不总是与我可以使用 hasrsine 公式计算的距离相同。”欧几里得距离是直线距离 b/w 点,而“haversine 公式”计算球体上沿大圆的距离。为什么这些会给出相同的结果?
-
我正在计算笛卡尔坐标系中投影点之间的距离
-
@rano: 这与地球表面的距离不同。
-
在xy平面上的简单投影下,北极和南极之间没有“距离”。我认为该投影成为您想要的可能性是〜nil
-
@rano:回答为什么它似乎适用于经度而不是纬度。您依赖于小角度近似值(如果您尝试几度的经度增量,您会看到它们发散)。纬度根本不起作用,因为您没有正确保持南北距离。
标签: c coordinate-systems cartesian haversine