开源一个计算两点GPS距离的小程序
开源一个计算两点gps定位距离的C函数这个算法来自一个英国的网站,我把他转成C下调用了。源型数学模型在:http://www.movable-type.co.uk/scripts/latlong-vincenty.html
/************************/
struct GPS
{
int sign;
int deg;
int min;
int sec;
} GPSPoint;
double getDistance(GPSPoint latFrom, GPSPoint lngFrom, GPSPoint latTo, GPSPoint lngTo)
{
double latFromRad = gpsToRad(latFrom);
double lngFromRad = gpsToRad(lngFrom);
double latToRad = gpsToRad(latToRad);
double lngToRad = gpsToRad(lngTo);
double lngDiff = lngToRad-lngFromRad;
double part1 = pow( cos(latToRad)*sin(lngDiff) , 2);
//double part2 = pow( cos(latFromRad)*sin(latToRad)*cos(lngDiff) , 2);
double part2 = Pow(Cos(latFromRad) * Sin(latToRad) - Sin(latFromRad)*Cos(latToRad)* Cos(lngDiff), 2);
double part3 = sin(latFromRad)*sin(latToRad)+cos(latFromRad)*cos(latToRad)*cos(lngDiff);
double centralAngle = atan2( sqrt(part1 + part2) / part3 );
return 6371.01 * centralAngle;//Return Distance in Kilometer
}
double gpsToRad(GPSPoint point)
{
return point.sign * (point.deg + (point.min + point.sec / 60) / 60) * 3.141592654 / 180;
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503445.jpg
(原文件名:fgh.jpg)
点击此处下载 ourdev_503446.rar(文件大小:22K) (原文件名:GPSDistance.rar) MARK GPS距离 不错。 升级了软件,加入多一个高精度的公式。
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_505001.jpg
(原文件名:updatagpsdistance.jpg)
点击此处下载 ourdev_505002.rar(文件大小:28K) (原文件名:GPSDistance.rar)
欢迎测试使用,用过的请来这里做个报告,看看测试效果。 mark一下lz是高手 呵呵···
不知道lz对差分gps有没有研究? mark 一下 谢谢 mark MARK MARK LZ
你的软件,不能用啊
你自己测试过精度没有。
(1)45°42.02571‘N 126°50.86454’E
(2)45°42.02097‘N 126°50.85425’E
这两点实际距离为16m,
这是用差分GPS系统精度为厘米级设备测量的数据,
你验证下你的软件精度 差分GPS(DGPS)原理
差分GPS (DGPS)是在正常的GPS外附加(差分)修正信号,此改正信号改善了GPS的精度。
这三类差分方式的工作原理是相同的,即都是由基准站发送改正数,由用户站接收并对其测量结果进行改正,以获得精确的定位结果。所不同的是,发送改正数的具体内容不一样,其差分定位精度也不同。
1. 位置差分原理
这是一种最简单的差分方法,任何一种GPS接收机均可改装和组成这种差分系统。
安装在基准站上的GPS接收机观测4颗卫星后便可进行三维定位,解算出基准站的坐标。由于存在着轨道误差、时钟误差、SA影响、大气影响、多径效应以及其他误差,解算出的坐标与基准站的已知坐标是不一样的, 存在误差。基准站利用数据链将此改正数发送出去,由用户站接收,并且对其解算的用户站坐标进行改正。
最后得到的改正后的用户坐标已消去了基准站和用户站的共同误差,例如卫星轨道误差、 SA影响、大气影响等,提高了定位精度。以上先决条件是基准站和用户站观测同一组卫星的情况。 位置差分法适用于用户与基准站间距离在100km以内的情况。
复上楼朋友:根据以上资料,上楼的朋友所提出在50M范围内的定位测试,好像DGPS和GPS根本就是两回事,而且,你提出的是厘米级的挑战,民用的GPS那能达到如此的精度啊?正常来说民用级的gps定位误差也是在5-10M之间的。不正常的,像有些朋友测试的也有空间漂移达到100M的定位误差,如果像你这样的要求能做到CM级,那民间可以研制卫星定位的精确制导武器了:)再加上我们那里有仪器和基站来做差分测量啊,如果你有,你就拿出来让我们见识见识吧,谢谢先! 可能你没看清楚输入格式,要是以'结尾,N,E,W,S就要在前面,要不就省去',你输入45 42.02571N 或 N45 42.02571'也行。结果在下面,你看看。
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_505233.jpg
(原文件名:fde.jpg) DGPS 确实是厘米级精度。 至于一般的GPS,在open sky的情况下也是5米左右。DGPS应用已经很广了,尤其农业自动化上面。如果使用RTK,可以达到毫米级精度。 而且只要使用一般的Trimble,或者NovAtel的接收机就行了。不是什么保密的东西。 【10楼】 rfour
根据以上资料,上楼的朋友所提出在50M范围内的定位测试,好像DGPS和GPS根本就是两回事,而且,你提出的是厘米级的挑战,民用的GPS那能达到如此的精度啊?正常来说民用级的gps定位误差也是在5-10M之间的。不正常的,像有些朋友测试的也有空间漂移达到100M的定位误差,如果像你这样的要求能做到CM级,那民间可以研制卫星定位的精确制导武器了:)再加上我们那里有仪器和基站来做差分测量啊,如果你有,你就拿出来让我们见识见识吧,谢谢先!
--------------------------------------------------------------------------------------------------------------
复楼上:
你所说这些话好像在赌气,我贴的数据只是想作为大家开源时,作为验证依据,让程序更加完善。
而差分系统也没有什么神秘,差分已经在我们GPS接受机中应用非常广泛,特别是导航定位仪中。DGPS大体可分为两类,实时动态差分(RTK)和广域差分(WAAS,MASA,EGNOS)。广域差分系统免费提供差分信号,在我们国内地区主要接收的差分信号,是日本发射的广域差分系统MASA,在我们市场上目前所见到的大多具有接收差分信号的GPS-OEM都能接收的到,其动态误差大多为3m--5m,在静态可达到亚米。在精细农业中,如【12楼】 litao8421 所说毫米级精度已不神秘。
如果【10楼】 rfour 所开源的GPS距离算法,能在任何地方静态测量达到亚米精度,并能应用到单片机或者DSP上的话,将会对手持式GPS测量仪得到质的提高。希望 rfour 能将高精度公式也贴出来,供大家参考。 有空再和你讨论,我现在还没操得太多的时间聊这个更高精度的,我手上也没这类接收器,等我找到再说。 mark 学习了,谢谢。 好帖! 呵呵,不错~ mark GPS距离^-^ 程序下下来我怎么不能运行呢?还有有汇编的程序吗?C#我不大溜 double centralAngle = atan2( sqrt(part1 + part2) / part3 );
我的编译器,提示参数不对,该为两个吧?谢谢指正 看了一下,对其计算原理不太明白! mark 非常感谢············ 已经用上了 Mark mark Mark mark mark 学习! 好,试下。 学习 学习学习再学习 有做出来的吗? 那来用一下 请问楼主:这个程序是用C#写的吗?我用VC++编译通不过,我不会用C# 学习 请注意,此程序是错误的,用了半下午的时间得出的结论,请后面的朋友不要再浪费时间。
作者给出的源链接是对的: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; mark mark mark,马上要开题了,收集资料中…… 回复【楼主位】rfour
-----------------------------------------------------------------------
先试试看 好好学习了。 嘿嘿,收起来留着用 MARK MARK GPS距离 好迷茫········· mark 好贴!MARK! 回复【38楼】usr.cn
-----------------------------------------------------------------------
对于两个GPS坐标不在同一半球的情况,怎么算?比如一个在东经北纬的点,一个在西经南纬的点 mark mark mark mark! mark mark 有人测试过了么? mark MARK 谢谢楼主分享^_^
有空再细看~ 短距离(<1km)计算的话,不需要这么多的sin\cos运算,要不,单片机算不过来了。。。
/// <summary>
///计算两点GPS坐标的距离
/// </summary>
/// <param name="n1">第一点的纬度坐标</param>
/// <param name="e1">第一点的经度坐标</param>
/// <param name="n2">第二点的纬度坐标</param>
/// <param name="e2">第二点的经度坐标</param>
/// <returns></returns>
public static double Distance(double n1, double e1, double n2, double e2)
{
double jl_jd = 102834.74258026089786013677476285;
double jl_wd = 111712.69150641055729984301412873;
double b = Math.Abs((e1 - e2) * jl_jd);
double a = Math.Abs((n1 - n2) * jl_wd);
return Math.Sqrt((a * a + b * b));
} 发现这个论坛真的很专业!!GPS在我感觉上是很高端的了。不知道中国的北斗什么时候也可以民用化,希望楼主们多多分享 谢谢,学习一下。 高手啊 收藏!!!! 试试,还不能发帖? mark,GPS测距, 可惜现在下载不了 mark ,gps计算距离 MARK GPS 距离 学习学习 mark 有这个想法以后用的到 感谢分享 mark,正研究这个 mark mark{:lol:} rfour 发表于 2009-11-19 15:45 static/image/common/back.gif
升级了软件,加入多一个高精度的公式。
(原文件名:updatagpsdistance.jpg)
好东西,顶上 顶下,要用到了,gps距离 GPS计算两点距离,好东西,马克备用 GPS学习了。 学习一下.... {:handshake:} 软件是错的,我用我的算法计算的是15.9530米,还不错 mark学校 gps 距离计算有平面计算 球面计算两种
两种的区别?误差大吗? 标记,有空研究 MARK!好东西 nark
学习………… MARK{:lol:} mark~! 好东西 昨晚刚找到另外一个,改天再试试两个公式的差距 这程序用了三角涵数,运行速度奇慢,而且狂占空间,我用的三角拟合方法比这个快多了 关注,学习 youlingfeng11 发表于 2009-11-19 19:46 static/image/common/back.gif
LZ
你的软件,不能用啊
你自己测试过精度没有。
我的计算结果:
1)15.7947m 计算方法:给定大地坐标(WGS84椭球) --> 高斯平面坐标 --> 勾股定理算出平面距离。
2)15.7684m 计算方法:给定大地坐标(克拉索夫斯基椭球) --> 高斯平面坐标 --> 勾股定理算出平面距离。
mark 谢谢 GPS距离计算,很好。 有时间好好研究一下 mark,值得一看。。。 mark 一下,慢慢研究
页:
[1]
2