rfour 发表于 2009-11-15 16:35:34

开源一个计算两点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)

caplsc 发表于 2009-11-15 16:50:17

MARK GPS距离

xk2yx 发表于 2009-11-15 19:19:43

不错。

rfour 发表于 2009-11-19 15:45:15

升级了软件,加入多一个高精度的公式。
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_505001.jpg
(原文件名:updatagpsdistance.jpg)

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

litteworm 发表于 2009-11-19 15:55:24

mark一下lz是高手 呵呵···

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

yaya001 发表于 2009-11-19 16:09:07

mark 一下 谢谢

zc3909 发表于 2009-11-19 16:54:29

mark

yeyu1234 发表于 2009-11-19 17:35:29

MARK

kidcao1987 发表于 2009-11-19 19:23:41

MARK

youlingfeng11 发表于 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系统精度为厘米级设备测量的数据,
你验证下你的软件精度

rfour 发表于 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级,那民间可以研制卫星定位的精确制导武器了:)再加上我们那里有仪器和基站来做差分测量啊,如果你有,你就拿出来让我们见识见识吧,谢谢先!

rfour 发表于 2009-11-20 11:44:26

可能你没看清楚输入格式,要是以'结尾,N,E,W,S就要在前面,要不就省去',你输入45 42.02571N 或 N45 42.02571'也行。结果在下面,你看看。
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_505233.jpg
(原文件名:fde.jpg)

litao8421 发表于 2009-11-20 13:02:27

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

youlingfeng11 发表于 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 能将高精度公式也贴出来,供大家参考。

rfour 发表于 2009-11-22 11:11:30

有空再和你讨论,我现在还没操得太多的时间聊这个更高精度的,我手上也没这类接收器,等我找到再说。

xxx7597 发表于 2009-12-29 11:23:52

mark

phil 发表于 2010-4-13 11:25:22

学习了,谢谢。

kangar0065 发表于 2010-4-13 11:53:01

好帖!

boy364100 发表于 2010-4-13 12:31:14

呵呵,不错~

shdzbsl 发表于 2010-4-13 12:51:05

mark   GPS距离^-^

coolsly 发表于 2010-7-30 16:41:08

程序下下来我怎么不能运行呢?还有有汇编的程序吗?C#我不大溜

wdmfhvk 发表于 2010-9-8 14:47:38

double centralAngle = atan2( sqrt(part1 + part2) / part3 );
我的编译器,提示参数不对,该为两个吧?谢谢指正

jackielau 发表于 2010-9-10 15:17:24

看了一下,对其计算原理不太明白!

hanhuliang 发表于 2010-9-28 17:53:40

mark

wwek 发表于 2010-10-28 14:14:16

非常感谢············ 已经用上了

dingxiao 发表于 2010-11-24 15:30:09

Mark

lghtjpu 发表于 2010-11-24 19:29:56

mark

DoDo915 发表于 2010-11-24 20:20:43

Mark

hekun559 发表于 2010-11-25 17:40:06

mark

zhenhuah 发表于 2011-1-15 18:05:58

mark

Bastagne 发表于 2011-3-12 19:13:12

学习!

ifus 发表于 2011-4-18 22:48:14

好,试下。

cmyldd 发表于 2011-4-26 08:54:02

学习

Edward1010 发表于 2011-5-3 09:36:39

学习学习再学习

isbit 发表于 2011-5-27 10:30:02

有做出来的吗?

xiaojuren 发表于 2011-6-22 16:54:51

那来用一下

jy6715 发表于 2011-6-29 11:09:42

请问楼主:这个程序是用C#写的吗?我用VC++编译通不过,我不会用C#

zforce 发表于 2011-6-29 11:33:25

学习

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

llyuli 发表于 2011-8-4 09:10:51

mark

bluelool 发表于 2011-8-4 14:39:59

mark

zhaoming 发表于 2011-9-4 14:40:52

mark,马上要开题了,收集资料中……

zhang_fan80 发表于 2011-9-30 17:19:24

回复【楼主位】rfour
-----------------------------------------------------------------------

先试试看

widesoft2 发表于 2011-9-30 21:53:32

好好学习了。

pcwhy 发表于 2011-9-30 23:40:59

嘿嘿,收起来留着用

416446891 发表于 2011-10-1 00:28:05

MARK

nirvanasyl 发表于 2011-10-1 14:05:50

MARK GPS距离

a54229912a 发表于 2011-10-7 15:27:59

好迷茫·········

wpnx 发表于 2011-10-13 22:09:11

mark

omlarn 发表于 2011-10-13 22:47:54

好贴!MARK!

rj1985 发表于 2011-10-27 18:19:44

回复【38楼】usr.cn
-----------------------------------------------------------------------

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

xintaisniper 发表于 2011-11-2 19:57:41

mark

nirvanasyl 发表于 2011-11-4 12:29:07

mark

kiema 发表于 2011-11-14 12:37:01

mark

charlie2008 发表于 2011-11-14 13:33:35

mark!

chaled 发表于 2011-11-14 15:04:06

mark

yixuanyuxiao 发表于 2011-12-5 15:56:32

mark

taojie 发表于 2011-12-5 18:39:52

有人测试过了么?

HYZ1989 发表于 2011-12-5 18:41:56

mark

shizhijian 发表于 2011-12-25 16:18:33

MARK

xuyapple 发表于 2011-12-26 10:00:51

谢谢楼主分享^_^
有空再细看~

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

      }

optim 发表于 2012-2-26 12:10:11

发现这个论坛真的很专业!!GPS在我感觉上是很高端的了。不知道中国的北斗什么时候也可以民用化,希望楼主们多多分享

skdyu 发表于 2012-3-3 15:01:22

谢谢,学习一下。

clever0725 发表于 2012-3-3 22:16:33

高手啊

diziaihaozhe 发表于 2012-3-24 17:50:07

收藏!!!!

TLAKE 发表于 2012-5-5 17:30:23

试试,还不能发帖?

myqq110 发表于 2012-5-7 15:48:09

mark,GPS测距,

hpdell 发表于 2012-5-24 11:28:41

可惜现在下载不了

Teapot_studyT 发表于 2012-6-21 18:45:31

mark ,gps计算距离

yurinacn 发表于 2012-6-22 01:33:00

MARK GPS 距离

zhoufenga 发表于 2012-8-28 19:37:49

学习学习

ztg328 发表于 2012-8-29 00:03:48

mark 有这个想法以后用的到

beck75 发表于 2012-8-29 00:26:47

感谢分享

XL_J 发表于 2012-9-7 09:31:34

mark,正研究这个

youmeng 发表于 2012-9-7 10:05:12

mark mark{:lol:}

xts 发表于 2012-9-18 16:14:00

rfour 发表于 2009-11-19 15:45 static/image/common/back.gif
升级了软件,加入多一个高精度的公式。

(原文件名:updatagpsdistance.jpg)


好东西,顶上

337zhang 发表于 2012-9-24 00:29:09

顶下,要用到了,gps距离

52robot 发表于 2012-10-1 14:16:45

GPS计算两点距离,好东西,马克备用

御风逍遥Fly 发表于 2013-3-6 21:16:24

GPS学习了。

jz701209李 发表于 2013-3-27 13:33:03

学习一下....

dreamboy 发表于 2013-3-31 14:14:51

{:handshake:}

yixuanyuxiao 发表于 2013-4-28 16:08:44

软件是错的,我用我的算法计算的是15.9530米,还不错

aceaip 发表于 2013-5-20 16:29:46

mark学校

ljt80158015 发表于 2013-5-20 17:30:16

gps 距离计算有平面计算 球面计算两种

两种的区别?误差大吗?

yuqilala 发表于 2013-6-26 07:54:31

标记,有空研究

bencsj1 发表于 2013-7-2 12:23:10

MARK!好东西

ylliu_10 发表于 2013-7-2 12:44:29

nark
         

jsntzxh 发表于 2013-7-2 14:09:53

学习…………

wsh 发表于 2013-8-29 11:49:12

MARK{:lol:}

Rainfieldwood 发表于 2013-8-29 11:50:49

mark~! 好东西

shenrongze 发表于 2013-8-29 11:55:21

昨晚刚找到另外一个,改天再试试两个公式的差距

qxj_2011 发表于 2013-9-7 06:18:15

这程序用了三角涵数,运行速度奇慢,而且狂占空间,我用的三角拟合方法比这个快多了

jsntzxh 发表于 2013-9-7 11:19:46

关注,学习

hendry 发表于 2013-9-7 19:39:51

youlingfeng11 发表于 2009-11-19 19:46 static/image/common/back.gif
LZ
你的软件,不能用啊
你自己测试过精度没有。


我的计算结果:

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

wsm80828 发表于 2013-9-8 06:00:51

mark 谢谢

3.3v 发表于 2013-9-8 07:42:16

GPS距离计算,很好。

dianzi_zhong 发表于 2013-10-3 23:52:16

有时间好好研究一下

zjk 发表于 2013-10-23 16:30:34

mark,值得一看。。。

Passion 发表于 2013-10-23 17:49:47

mark 一下,慢慢研究
页: [1] 2
查看完整版本: 开源一个计算两点GPS距离的小程序