搜索
bottom↓
回复: 108

开源一个计算两点GPS距离的小程序

  [复制链接]

出0入0汤圆

发表于 2009-11-15 16:35:34 | 显示全部楼层 |阅读模式
开源一个计算两点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;


(原文件名:fgh.jpg)

点击此处下载 ourdev_503446.rar(文件大小:22K) (原文件名:GPSDistance.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-11-15 16:50:17 | 显示全部楼层
MARK GPS距离

出0入0汤圆

发表于 2009-11-15 19:19:43 | 显示全部楼层
不错。

出0入0汤圆

 楼主| 发表于 2009-11-19 15:45:15 | 显示全部楼层
升级了软件,加入多一个高精度的公式。

(原文件名:updatagpsdistance.jpg)

点击此处下载 ourdev_505002.rar(文件大小:28K) (原文件名:GPSDistance.rar)
欢迎测试使用,用过的请来这里做个报告,看看测试效果。

出0入0汤圆

发表于 2009-11-19 15:55:24 | 显示全部楼层
mark一下  lz是高手 呵呵···

不知道lz对差分gps有没有研究?

出0入0汤圆

发表于 2009-11-19 16:09:07 | 显示全部楼层
mark 一下 谢谢

出0入0汤圆

发表于 2009-11-19 16:54:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-19 17:35:29 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-11-19 19:23:41 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-11-19 19:46:17 | 显示全部楼层
LZ
你的软件,不能用啊
你自己测试过精度没有。

(1)45°42.02571‘N   126°50.86454’E
(2)45°42.02097‘N   126°50.85425’E
这两点实际距离为16m,
这是用差分GPS系统精度为厘米级设备测量的数据,
你验证下你的软件精度

出0入0汤圆

 楼主| 发表于 2009-11-20 08:39:37 | 显示全部楼层
差分GPS(DGPS)原理
  差分GPS (DGPS)是在正常的GPS外附加(差分)修正信号,此改正信号改善了GPS的精度。
  这三类差分方式的工作原理是相同的,即都是由基准站发送改正数,由用户站接收并对其测量结果进行改正,以获得精确的定位结果。所不同的是,发送改正数的具体内容不一样,其差分定位精度也不同。
  1. 位置差分原理
  这是一种最简单的差分方法,任何一种GPS接收机均可改装和组成这种差分系统。
  安装在基准站上的GPS接收机观测4颗卫星后便可进行三维定位,解算出基准站的坐标。由于存在着轨道误差、时钟误差、SA影响、大气影响、多径效应以及其他误差,解算出的坐标与基准站的已知坐标是不一样的, 存在误差。基准站利用数据链将此改正数发送出去,由用户站接收,并且对其解算的用户站坐标进行改正。
  最后得到的改正后的用户坐标已消去了基准站和用户站的共同误差,例如卫星轨道误差、 SA影响、大气影响等,提高了定位精度。以上先决条件是基准站和用户站观测同一组卫星的情况。 位置差分法适用于用户与基准站间距离在100km以内的情况。

复上楼朋友:根据以上资料,上楼的朋友所提出在50M范围内的定位测试,好像DGPS和GPS根本就是两回事,而且,你提出的是厘米级的挑战,民用的GPS那能达到如此的精度啊?正常来说民用级的gps定位误差也是在5-10M之间的。不正常的,像有些朋友测试的也有空间漂移达到100M的定位误差,如果像你这样的要求能做到CM级,那民间可以研制卫星定位的精确制导武器了:)再加上我们那里有仪器和基站来做差分测量啊,如果你有,你就拿出来让我们见识见识吧,谢谢先!

出0入0汤圆

 楼主| 发表于 2009-11-20 11:44:26 | 显示全部楼层
可能你没看清楚输入格式,要是以'结尾,N,E,W,S就要在前面,要不就省去',你输入45 42.02571N 或 N45 42.02571'也行。结果在下面,你看看。

(原文件名:fde.jpg)

出0入0汤圆

发表于 2009-11-20 13:02:27 | 显示全部楼层
DGPS 确实是厘米级精度。 至于一般的GPS,在open sky的情况下也是5米左右。DGPS应用已经很广了,尤其农业自动化上面。如果使用RTK,可以达到毫米级精度。 而且只要使用一般的Trimble,或者NovAtel的接收机就行了。不是什么保密的东西。

出0入0汤圆

发表于 2009-11-20 22:30:08 | 显示全部楼层
【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 能将高精度公式也贴出来,供大家参考。

出0入0汤圆

 楼主| 发表于 2009-11-22 11:11:30 | 显示全部楼层
有空再和你讨论,我现在还没操得太多的时间聊这个更高精度的,我手上也没这类接收器,等我找到再说。

出0入0汤圆

发表于 2009-12-29 11:23:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-13 11:25:22 | 显示全部楼层
学习了,谢谢。

出0入0汤圆

发表于 2010-4-13 11:53:01 | 显示全部楼层
好帖!

出0入0汤圆

发表于 2010-4-13 12:31:14 | 显示全部楼层
呵呵,不错~

出0入0汤圆

发表于 2010-4-13 12:51:05 | 显示全部楼层
mark   GPS距离  ^-^

出0入0汤圆

发表于 2010-7-30 16:41:08 | 显示全部楼层
程序下下来我怎么不能运行呢?还有有汇编的程序吗?C#我不大溜

出0入0汤圆

发表于 2010-9-8 14:47:38 | 显示全部楼层
double centralAngle = atan2( sqrt(part1 + part2) / part3 );
我的编译器,提示参数不对,该为两个吧?谢谢指正

出0入0汤圆

发表于 2010-9-10 15:17:24 | 显示全部楼层
看了一下,对其计算原理不太明白!

出0入0汤圆

发表于 2010-9-28 17:53:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-28 14:14:16 | 显示全部楼层
非常感谢············ 已经用上了

出0入0汤圆

发表于 2010-11-24 15:30:09 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-11-24 19:29:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-24 20:20:43 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-11-25 17:40:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-15 18:05:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-12 19:13:12 | 显示全部楼层
学习!

出0入0汤圆

发表于 2011-4-18 22:48:14 | 显示全部楼层
好,试下。

出0入0汤圆

发表于 2011-4-26 08:54:02 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-5-3 09:36:39 | 显示全部楼层
学习学习再学习

出0入0汤圆

发表于 2011-5-27 10:30:02 | 显示全部楼层
有做出来的吗?

出0入0汤圆

发表于 2011-6-22 16:54:51 | 显示全部楼层
那来用一下

出0入0汤圆

发表于 2011-6-29 11:09:42 | 显示全部楼层
请问楼主:这个程序是用C#写的吗?我用VC++编译通不过,我不会用C#

出0入0汤圆

发表于 2011-6-29 11:33:25 | 显示全部楼层
学习

出0入0汤圆

发表于 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;

出0入0汤圆

发表于 2011-8-4 09:10:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-4 14:39:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-4 14:40:52 | 显示全部楼层
mark,马上要开题了,收集资料中……

出0入0汤圆

发表于 2011-9-30 17:19:24 | 显示全部楼层
回复【楼主位】rfour
-----------------------------------------------------------------------

先试试看

出0入10汤圆

发表于 2011-9-30 21:53:32 | 显示全部楼层
好好学习了。

出15入9汤圆

发表于 2011-9-30 23:40:59 | 显示全部楼层
嘿嘿,收起来留着用

出0入0汤圆

发表于 2011-10-1 00:28:05 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-10-1 14:05:50 | 显示全部楼层
MARK GPS距离

出0入0汤圆

发表于 2011-10-7 15:27:59 | 显示全部楼层
好迷茫·········

出0入0汤圆

发表于 2011-10-13 22:09:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-13 22:47:54 | 显示全部楼层
好贴!MARK!

出0入0汤圆

发表于 2011-10-27 18:19:44 | 显示全部楼层
回复【38楼】usr.cn
-----------------------------------------------------------------------

对于两个GPS坐标不在同一半球的情况,怎么算?比如一个在东经北纬的点,一个在西经南纬的点

出0入0汤圆

发表于 2011-11-2 19:57:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-4 12:29:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-14 12:37:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-14 13:33:35 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-11-14 15:04:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-5 15:56:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-5 18:39:52 | 显示全部楼层
有人测试过了么?

出0入0汤圆

发表于 2011-12-5 18:41:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-25 16:18:33 | 显示全部楼层
MARK

出90入0汤圆

发表于 2011-12-26 10:00:51 | 显示全部楼层
谢谢楼主分享^_^
有空再细看~

出0入0汤圆

发表于 2012-2-17 17:55:06 | 显示全部楼层
短距离(<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));

        }

出0入0汤圆

发表于 2012-2-26 12:10:11 | 显示全部楼层
发现这个论坛真的很专业!!GPS在我感觉上是很高端的了。不知道中国的北斗什么时候也可以民用化,希望楼主们多多分享

出0入0汤圆

发表于 2012-3-3 15:01:22 | 显示全部楼层
谢谢,学习一下。

出0入0汤圆

发表于 2012-3-3 22:16:33 | 显示全部楼层
高手啊

出0入0汤圆

发表于 2012-3-24 17:50:07 | 显示全部楼层
收藏!!!!

出0入0汤圆

发表于 2012-5-5 17:30:23 | 显示全部楼层
试试,还不能发帖?

出0入0汤圆

发表于 2012-5-7 15:48:09 | 显示全部楼层
mark,GPS测距,

出0入0汤圆

发表于 2012-5-24 11:28:41 | 显示全部楼层
可惜现在下载不了

出0入0汤圆

发表于 2012-6-21 18:45:31 | 显示全部楼层
mark ,gps计算距离

出0入0汤圆

发表于 2012-6-22 01:33:00 | 显示全部楼层
MARK GPS 距离

出0入0汤圆

发表于 2012-8-28 19:37:49 | 显示全部楼层
学习学习

出15入118汤圆

发表于 2012-8-29 00:03:48 | 显示全部楼层
mark 有这个想法以后用的到

出0入0汤圆

发表于 2012-8-29 00:26:47 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2012-9-7 09:31:34 | 显示全部楼层
mark,正研究这个

出0入0汤圆

发表于 2012-9-7 10:05:12 | 显示全部楼层
mark mark

出0入0汤圆

发表于 2012-9-18 16:14:00 | 显示全部楼层
rfour 发表于 2009-11-19 15:45
升级了软件,加入多一个高精度的公式。

(原文件名:updatagpsdistance.jpg)

好东西,顶上

出0入0汤圆

发表于 2012-9-24 00:29:09 | 显示全部楼层
顶下,要用到了,gps距离

出0入0汤圆

发表于 2012-10-1 14:16:45 | 显示全部楼层
GPS计算两点距离,好东西,马克备用

出0入0汤圆

发表于 2013-3-6 21:16:24 | 显示全部楼层
GPS学习了。

出0入0汤圆

发表于 2013-3-27 13:33:03 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2013-3-31 14:14:51 | 显示全部楼层

出0入0汤圆

发表于 2013-4-28 16:08:44 | 显示全部楼层
软件是错的,我用我的算法计算的是15.9530米,还不错

出0入0汤圆

发表于 2013-5-20 16:29:46 | 显示全部楼层
mark  学校

出0入0汤圆

发表于 2013-5-20 17:30:16 | 显示全部楼层
gps 距离计算  有平面计算 球面计算  两种

两种的区别?  误差大吗?

出0入0汤圆

发表于 2013-6-26 07:54:31 | 显示全部楼层
标记,有空研究

出0入0汤圆

发表于 2013-7-2 12:23:10 | 显示全部楼层
MARK!好东西

出0入0汤圆

发表于 2013-7-2 12:44:29 | 显示全部楼层
nark
         

出200入0汤圆

发表于 2013-7-2 14:09:53 来自手机 | 显示全部楼层
学习…………

出0入0汤圆

发表于 2013-8-29 11:49:12 | 显示全部楼层
MARK

出0入0汤圆

发表于 2013-8-29 11:50:49 | 显示全部楼层
mark~! 好东西

出0入0汤圆

发表于 2013-8-29 11:55:21 | 显示全部楼层
昨晚刚找到另外一个,改天再试试两个公式的差距

出0入0汤圆

发表于 2013-9-7 06:18:15 | 显示全部楼层
这程序用了三角涵数,运行速度奇慢,而且狂占空间,我用的三角拟合方法比这个快多了

出200入0汤圆

发表于 2013-9-7 11:19:46 来自手机 | 显示全部楼层
关注,学习

出0入0汤圆

发表于 2013-9-7 19:39:51 | 显示全部楼层
youlingfeng11 发表于 2009-11-19 19:46
LZ
你的软件,不能用啊
你自己测试过精度没有。

我的计算结果:

1)  15.7947m               计算方法:给定大地坐标(WGS84椭球) --> 高斯平面坐标 --> 勾股定理算出平面距离。
2)  15.7684m               计算方法:给定大地坐标(克拉索夫斯基椭球) --> 高斯平面坐标 --> 勾股定理算出平面距离。

出0入0汤圆

发表于 2013-9-8 06:00:51 来自手机 | 显示全部楼层
mark 谢谢

出0入0汤圆

发表于 2013-9-8 07:42:16 | 显示全部楼层
GPS距离计算,很好。

出0入0汤圆

发表于 2013-10-3 23:52:16 | 显示全部楼层
有时间好好研究一下

出0入0汤圆

发表于 2013-10-23 16:30:34 | 显示全部楼层
mark,值得一看。。。

出0入0汤圆

发表于 2013-10-23 17:49:47 | 显示全部楼层
mark 一下,慢慢研究
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 08:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表