搜索
bottom↓
回复: 51
打印 上一主题 下一主题

已知2个GPS的经纬度,计算2点的距离,用公式计算不对,请教

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2018-6-13 21:31:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
已知2个GPS的经纬度,计算2点的距离,用公式计算不对,请教
      经度                纬度
G1: 2236.860596,11402.199219
G2: 2236.859863,11402.200195

用网上的方法:
((LAT1 - LAT2)^2 + (LON1 - LON2)^2),再开根号,计算出来是约128米,但我实际移动的距离就2米左右

是精确不到2米的距离的原因导致的吗?

出0入0汤圆

2
发表于 2018-6-13 21:37:42 | 只看该作者


var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();

var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
        Math.cos(φ1) * Math.cos(φ2) *
        Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

var d = R * c;

出10入23汤圆

3
发表于 2018-6-13 21:41:05 来自手机 | 只看该作者
海拔高度,地球非圆都影响计算结果

出0入0汤圆

4
发表于 2018-6-13 21:49:07 | 只看该作者
合格的二楼。公式好复杂

出0入0汤圆

5
 楼主| 发表于 2018-6-13 21:57:38 | 只看该作者
longhua 发表于 2018-6-13 21:37
var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();

谢谢!

var R = 6371e3; // metres   地球半径:6378.137
var φ1 = lat1.toRadians();   转成弧度
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();

var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
        Math.cos(φ1) * Math.cos(φ2) *
        Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

var d = R * c;

===========================
f1 = 2236.860596 * 180 / 3.1415926 = 39.041794882535693091772262366042
f2 = 199.00862219429608685028100673718

df =(lat2-lat1).toRadians() = (2236.859863 - 2236.860596) * 180 / 3.1415926 = 0.04199780709949469577945911891949
dl = (11402.199219 - 11402.200195) * 180 / 3.1415926 = 0.05592068175867233708151718972091

a = sin( df / 2) * sin( df / 2) +  cos( f1 ) * cos(f2) * sin(dl / 2) * sin(dl / 2)
  = 3.6649999804696497253335964771206e-4 * 3.6649999804696497253335964771206e-4 *  + 0.77668669174498135200681373915431 * -0.94546957154856971237408490012969 * 4.8799998895533660943331216020622e-4 * 4.8799998895533660943331216020622e-4
  = 1.3432224856842532868129844028456e-7 + -1.7487714094127387360187124919225e-7
  = -4.0554892372848544920572808907686e-8

出现负数了,计算不下去了 ,哪里错了?

出0入0汤圆

6
 楼主| 发表于 2018-6-13 21:59:24 | 只看该作者
zouzhichao 发表于 2018-6-13 21:41
海拔高度,地球非圆都影响计算结果

在短距离内,非圆影响是否可以忽略呀
另外,如果移动中,GPS吐的的航向角,以真北为基准的,是否可以直接使用呀

出0入4汤圆

7
发表于 2018-6-13 22:00:54 来自手机 | 只看该作者
一楼的那个网上的公式,连量纲都不对吧。

出0入0汤圆

8
发表于 2018-6-13 22:18:03 来自手机 | 只看该作者
精度要求不高时,短距离可以忽略弧度,从而简化计算

出10入23汤圆

9
发表于 2018-6-13 22:19:25 来自手机 | 只看该作者
jaky80000 发表于 2018-6-13 21:59
在短距离内,非圆影响是否可以忽略呀
另外,如果移动中,GPS吐的的航向角,以真北为基准的,是否可以直接 ...

考虑非圆,半径你按哪个数值计算?

出0入0汤圆

10
 楼主| 发表于 2018-6-13 22:27:01 | 只看该作者
get500wan 发表于 2018-6-13 22:00
一楼的那个网上的公式,连量纲都不对吧。

感觉是个勾股定律,直接计算距离的

出0入0汤圆

11
 楼主| 发表于 2018-6-13 22:27:48 | 只看该作者
zouzhichao 发表于 2018-6-13 22:19
考虑非圆,半径你按哪个数值计算?

我现在还没有计算出来2个点之间的距离呢,惭愧

出0入0汤圆

12
发表于 2018-6-13 23:45:50 来自手机 | 只看该作者
楼主是把球面坐标当成平面直角坐标系了吧?在不同的纬度,经度差1分的距离是不一样的啊。

出200入2554汤圆

13
发表于 2018-6-14 07:02:53 来自手机 | 只看该作者
考虑近距离简化,可以用lz的公式,但是算出来lat1-lat2应该是个弧长,而不是纬度差。我算了算,按6400km半径,一分的纬度差对应约1.8km,你这千分之一分左右的纬度差和经度差,不就是2m左右么。

出200入2554汤圆

14
发表于 2018-6-14 07:05:52 来自手机 | 只看该作者
另外注意GPS数据格式是ddmm.mmm,dddmm.mmm,度分写在一起的

出0入0汤圆

15
 楼主| 发表于 2018-6-14 08:20:42 来自手机 | 只看该作者
XA144F 发表于 2018-6-13 23:45
楼主是把球面坐标当成平面直角坐标系了吧?在不同的纬度,经度差1分的距离是不一样的啊。 ...

是的,当平面坐标来计算的了

出0入0汤圆

16
 楼主| 发表于 2018-6-14 08:22:52 来自手机 | 只看该作者
t3486784401 发表于 2018-6-14 07:02
考虑近距离简化,可以用lz的公式,但是算出来lat1-lat2应该是个弧长,而不是纬度差。我算了算,按6400km半 ...

用哪种计算公式才行呢?运算量少些的。
另外请教下,如果移动起来了,吐出来的航向角是否可以使用的,用来当指南针这样的用?
谢谢

出0入0汤圆

17
 楼主| 发表于 2018-6-14 08:24:23 来自手机 | 只看该作者
t3486784401 发表于 2018-6-14 07:05
另外注意GPS数据格式是ddmm.mmm,dddmm.mmm,度分写在一起的

GPRMC是度数的,不是度分秒的,就是弧度了,对吧?

出200入2554汤圆

18
发表于 2018-6-14 18:25:05 | 只看该作者
jaky80000 发表于 2018-6-14 08:22
用哪种计算公式才行呢?运算量少些的。
另外请教下,如果移动起来了,吐出来的航向角是否可以使用的,用 ...

没具体去做过运算优化,不过如果是浮点数的话,倒是有类似“平方根倒数速算法”的加速算法。

角度数据啊,那个一查就有了。比如你的

G1: 2236.860596,11402.199219

实际代表:

23°36.860596' N, 114°02.199219' E

单位当然是度,不是弧度。

出200入2554汤圆

19
发表于 2018-6-14 18:37:18 | 只看该作者
jaky80000 发表于 2018-6-14 08:24
GPRMC是度数的,不是度分秒的,就是弧度了,对吧?

我解析了下,这两个 GPS 数据指向 深圳北站附近的铁路上,这个对么?

出0入0汤圆

20
发表于 2018-6-15 07:26:03 来自手机 | 只看该作者
GPS民用不就是10米的精度吗?怎么想计算2米的移动。

出0入0汤圆

21
 楼主| 发表于 2018-6-15 08:15:47 来自手机 | 只看该作者
t3486784401 发表于 2018-6-14 18:25
没具体去做过运算优化,不过如果是浮点数的话,倒是有类似“平方根倒数速算法”的加速算法。

角度数据啊 ...

用2楼的公式计算不出来啊。请推荐一个验证过的啊,非常感谢!

出0入0汤圆

22
 楼主| 发表于 2018-6-15 08:16:49 来自手机 | 只看该作者
t3486784401 发表于 2018-6-14 18:37
我解析了下,这两个 GPS 数据指向 深圳北站附近的铁路上,这个对么?

当时确实在深圳北附近啊,这都被你查到了,牛

出0入0汤圆

23
 楼主| 发表于 2018-6-15 08:19:05 来自手机 | 只看该作者
wumaoxu 发表于 2018-6-15 07:26
GPS民用不就是10米的精度吗?怎么想计算2米的移动。

精度这么差啊

出0入0汤圆

24
发表于 2018-6-15 08:20:07 | 只看该作者
这个误差不一定就是计算误差,GPS信号也是有误差的,一般民用的5~15米误差。

出0入0汤圆

25
 楼主| 发表于 2018-6-15 08:24:50 来自手机 | 只看该作者
carryonli 发表于 2018-6-15 08:20
这个误差不一定就是计算误差,GPS信号也是有误差的,一般民用的5~15米误差。 ...

看来这个地图定位要精确定位还需要配合地图数据,计算出来的定位数据了。

出0入0汤圆

26
发表于 2018-6-15 08:40:26 | 只看该作者
jaky80000 发表于 2018-6-15 08:24
看来这个地图定位要精确定位还需要配合地图数据,计算出来的定位数据了。 ...

一般10米误差都可以用,你要求高精度就得用高精度GPS测量仪。

出0入0汤圆

27
 楼主| 发表于 2018-6-15 12:08:40 来自手机 | 只看该作者
高精度的用不起啊。回头再测测

出200入2554汤圆

28
发表于 2018-6-15 12:31:02 | 只看该作者
jaky80000 发表于 2018-6-15 08:15
用2楼的公式计算不出来啊。请推荐一个验证过的啊,非常感谢!

用公式编辑器打了一遍,再要是算不出来就可以回炉平面几何了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

29
发表于 2018-6-15 19:15:34 | 只看该作者
试试这个程序,我自己在用的
#include <math.h>

#define  PI_S                     (double)(3.1415926)
#define  EARTH_RADIUS      (double)(6378.137)//地球近似半径

/*============================================================================
  函数名称    :  
  函数功能    : 求弧度
  输入参数    :  
  返回值      :   
  说明        :
=============================================================================*/
double radian(double d)
{
    return (d*PI_S/180.0);  
}
/*============================================================================
  函数名称    :  
  函数功能    : 计算距离
  输入参数    :  
  返回值      :   
  说明        : 单位:km
=============================================================================*/
double get_distance(double lat1, double lng1, double lat2, double lng2)
{
    double rad_lat1 = radian(lat1);
    double rad_lat2 = radian(lat2);
   
    double a = rad_lat1     - rad_lat2;
    double b = radian(lng1) - radian(lng2);
     
    double dst = 2 * asin((sqrt(pow(sin(a/2),2) + cos(rad_lat1)*cos(rad_lat2)*pow(sin(b/2),2))));
     
    dst = dst * EARTH_RADIUS;
    dst = round(dst*10000)/10000;
   
    return dst;
}

出0入0汤圆

30
发表于 2018-6-16 01:26:19 | 只看该作者
楼主的角度和弧度换算出现了问题,GPS的输出实际应该是22度36.860596分这样的格式,要将这个转换为弧度计算才对。
举个例子:22度36.860596分=22.61434327度=0.394694741弧度。
短距离的计算的话可以近似为平面,28楼的计算很直观和简单。

出0入0汤圆

31
 楼主| 发表于 2018-6-16 08:23:52 | 只看该作者
t3486784401 发表于 2018-6-15 12:31
用公式编辑器打了一遍,再要是算不出来就可以回炉平面几何了。

非常感谢呀,这么用心。
谢谢,谢谢!

出0入0汤圆

32
 楼主| 发表于 2018-6-16 08:24:34 | 只看该作者
tdchenke 发表于 2018-6-15 19:15
试试这个程序,我自己在用的
#include

好的,谢谢!
我拿来计算测试一下,谢谢!

出0入0汤圆

33
 楼主| 发表于 2018-6-16 08:25:29 | 只看该作者
sun_sky 发表于 2018-6-16 01:26
楼主的角度和弧度换算出现了问题,GPS的输出实际应该是22度36.860596分这样的格式,要将这个转换为弧度计算 ...

谢谢解答,
我注意一下角度和弧度之间的转换关系。

出0入0汤圆

34
发表于 2018-6-16 09:42:46 来自手机 | 只看该作者
留个记号,会用到的

出0入0汤圆

35
发表于 2018-6-17 11:47:45 来自手机 | 只看该作者
我们公司要求计算点到线的距离

出0入0汤圆

36
发表于 2018-6-17 11:48:45 来自手机 | 只看该作者
点到经纬度的表示的,线也是两个点表示的

出10入23汤圆

37
发表于 2018-6-17 12:35:10 来自手机 | 只看该作者
jjj 发表于 2018-6-17 11:48
点到经纬度的表示的,线也是两个点表示的

翻看我的旧帖,会有收获

出0入0汤圆

38
发表于 2018-6-17 12:54:50 | 只看该作者
我以前做过的一个 PPT 有距离计算公式的说明
查找附近地点的算法 —— Geohash

精确的算法是用半正矢公式,距离较近时可以用近似算法,但至少也要考虑所在纬度上每 1 度经度对应的距离是多少

这个 PPT 我直接传上来了



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出200入2554汤圆

39
发表于 2018-6-17 14:11:27 来自手机 | 只看该作者
jaky80000 发表于 2018-6-16 08:23
非常感谢呀,这么用心。
谢谢,谢谢!

经38楼提醒,不同纬度上,相同经度差对应的东西方向距离不一样。
这么看来之前的公式只适合低纬度情况。
考虑纬度的话,需要增加 cos(纬度) 因子:
dlx=Rcosφy×dφx
dly=Rdφy

出200入2554汤圆

40
发表于 2018-6-17 14:16:41 来自手机 | 只看该作者
wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》


感谢干货分享!

出0入0汤圆

41
 楼主| 发表于 2018-6-17 15:53:01 | 只看该作者
wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》

非常感谢!        

出0入0汤圆

42
发表于 2018-6-17 16:20:09 | 只看该作者
t3486784401 发表于 2018-6-15 12:31
用公式编辑器打了一遍,再要是算不出来就可以回炉平面几何了。

收藏这个公式

出0入0汤圆

43
发表于 2018-6-17 17:37:45 | 只看该作者
这里有计算器:

http://www.storyday.com/wp-conte ... 09/latlung_dis.html

出0入0汤圆

44
发表于 2018-6-17 17:38:51 | 只看该作者
还有,你这是哪门子的经纬度啊。我是把整数修理了一下才能输入了。

出0入0汤圆

45
发表于 2018-6-17 18:13:41 | 只看该作者
sqrt((36.860596-36.859863)^2+(2.199219-2.200195)^2)/60*2*pi/360*6400km=???m

出0入0汤圆

46
发表于 2018-6-17 18:38:26 | 只看该作者
"计算出来是约128米": 128*2*pi()/360=???m

出0入0汤圆

47
发表于 2018-6-17 22:13:33 | 只看该作者
wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》

GAO REN YA

出0入0汤圆

48
发表于 2018-6-18 07:01:55 来自手机 | 只看该作者
米8的双模定位,不知道是不是吹牛逼的

出0入0汤圆

49
发表于 2019-3-21 11:03:40 | 只看该作者
wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》

感谢分享,高人啊

出250入8汤圆

50
发表于 2019-3-21 11:10:23 来自手机 | 只看该作者
感谢分享!确实都是高人!

出375入0汤圆

51
发表于 2024-3-8 13:48:14 来自手机 | 只看该作者
£££££

出125入16汤圆

52
发表于 2024-3-8 16:21:27 | 只看该作者
让chatgpt3.5写了下,我在mdk时验证了,是2.1米左右
#include <math.h>

#define R 6371 // 地球半径,单位:公里

// 将度转换为弧度
double toRadians(double degree) {
    return degree * M_PI / 180.0;
}

// 计算两个GPS坐标点之间的距离
double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
    // 将度转换为弧度
    lat1 = toRadians(lat1);
    lon1 = toRadians(lon1);
    lat2 = toRadians(lat2);
    lon2 = toRadians(lon2);

    // 计算纬度和经度之差
    double deltaLat = lat2 - lat1;
    double deltaLon = lon2 - lon1;

    // 应用Haversine公式计算两点之间的距离
    double a = sin(deltaLat / 2) * sin(deltaLat / 2) + cos(lat1) * cos(lat2) * sin(deltaLon / 2) * sin(deltaLon / 2);
    double c = 2 * atan2(sqrt(a), sqrt(1 - a));
    double distance = R * c;

    // 返回距离(单位:公里)
    return distance * 1000; // 将距离单位转换为米
}

int main() {
    // 给定的GPS坐标点
    double lat1 = 22 + 36.860596 / 60;
    double lon1 = 114 + 2.199219 / 60;
    double lat2 = 22 + 36.859863 / 60;
    double lon2 = 114 + 2.200195 / 60;

    // 计算两点之间的距离
    double distance = calculateDistance(lat1, lon1, lat2, lon2);

    // 输出结果
    printf("两点之间的距离为:%f 米\n", distance);

    return 0;
}

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

本版积分规则

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

GMT+8, 2024-5-2 09:18

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

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