|
发表于 2011-8-3 19:22:45
|
显示全部楼层
请注意,此程序是错误的,用了半下午的时间得出的结论,请后面的朋友不要再浪费时间。
作者给出的源链接是对的:http://www.movable-type.co.uk/scripts/latlong-vincenty.html
最简单的证明此程序错误的实验,纬度不变,修改经度一度,计算结果。
另外:【9楼】 youlingfeng11 提到的值结果是16m,但是楼主的程序测出的是16确是按照英里来计算的,单位都不对,这只是巧合。
而使用楼主提供的那个链接计算是正确的。
另外 在此提供一个可用的简单公式 单位千米,经过实际测试,误差较小,在可接受范围。
float calcDistance(float A, float B, float C, float D)
{
float dLat;
float dLon;
float v_a;
float v_c;
float distance;
dLat = (C - A);
dLon = (D - B);
dLat /= 57.29577951;
dLon /= 57.29577951;
v_a = sin(dLat/2) * sin(dLat/2) + cos(A) * cos(C) * sin(dLon/2) * sin(dLon/2);
v_c = 2 * atan2(sqrt(v_a),sqrt(1-v_a));
distance = 6371.004 * v_c;
return distance;
}
换算成米,注意经纬度都是以度为单位的。
u16 gps_distance(GPSPoint GpsA, GPSPoint GpsB)
{
float f=0.0;
f=calcDistance(GpsA.jingdu,GpsA.weidu,GpsB.jingdu,GpsB.weidu);
f=f*1000.0;
return (u16)f;
}
附GPS坐标信息结构体
typedef struct GPSPoint //GPS信息点 结构体
{
float jingdu;
float weidu;
u8 dongxi;//东西经 'E' 'W'
u8 nanbei;//南北纬 'S' 'N'
}GPSPoint; |
|