amobbs.com 阿莫电子技术论坛

标题: 已知2个GPS的经纬度,计算2点的距离,用公式计算不对,请教 [打印本页]

作者: jaky80000    时间: 2018-6-13 21:31
标题: 已知2个GPS的经纬度,计算2点的距离,用公式计算不对,请教
已知2个GPS的经纬度,计算2点的距离,用公式计算不对,请教
      经度                纬度
G1: 2236.860596,11402.199219
G2: 2236.859863,11402.200195

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

是精确不到2米的距离的原因导致的吗?
作者: longhua    时间: 2018-6-13 21:37


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;
作者: zouzhichao    时间: 2018-6-13 21:41
海拔高度,地球非圆都影响计算结果
作者: XUEPENGBIN    时间: 2018-6-13 21:49
合格的二楼。公式好复杂
作者: jaky80000    时间: 2018-6-13 21:57
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

出现负数了,计算不下去了 ,哪里错了?
作者: jaky80000    时间: 2018-6-13 21:59
zouzhichao 发表于 2018-6-13 21:41
海拔高度,地球非圆都影响计算结果

在短距离内,非圆影响是否可以忽略呀
另外,如果移动中,GPS吐的的航向角,以真北为基准的,是否可以直接使用呀
作者: get500wan    时间: 2018-6-13 22:00
一楼的那个网上的公式,连量纲都不对吧。
作者: hxled123    时间: 2018-6-13 22:18
精度要求不高时,短距离可以忽略弧度,从而简化计算
作者: zouzhichao    时间: 2018-6-13 22:19
jaky80000 发表于 2018-6-13 21:59
在短距离内,非圆影响是否可以忽略呀
另外,如果移动中,GPS吐的的航向角,以真北为基准的,是否可以直接 ...

考虑非圆,半径你按哪个数值计算?
作者: jaky80000    时间: 2018-6-13 22:27
get500wan 发表于 2018-6-13 22:00
一楼的那个网上的公式,连量纲都不对吧。

感觉是个勾股定律,直接计算距离的
作者: jaky80000    时间: 2018-6-13 22:27
zouzhichao 发表于 2018-6-13 22:19
考虑非圆,半径你按哪个数值计算?

我现在还没有计算出来2个点之间的距离呢,惭愧
作者: XA144F    时间: 2018-6-13 23:45
楼主是把球面坐标当成平面直角坐标系了吧?在不同的纬度,经度差1分的距离是不一样的啊。
作者: t3486784401    时间: 2018-6-14 07:02
考虑近距离简化,可以用lz的公式,但是算出来lat1-lat2应该是个弧长,而不是纬度差。我算了算,按6400km半径,一分的纬度差对应约1.8km,你这千分之一分左右的纬度差和经度差,不就是2m左右么。
作者: t3486784401    时间: 2018-6-14 07:05
另外注意GPS数据格式是ddmm.mmm,dddmm.mmm,度分写在一起的
作者: jaky80000    时间: 2018-6-14 08:20
XA144F 发表于 2018-6-13 23:45
楼主是把球面坐标当成平面直角坐标系了吧?在不同的纬度,经度差1分的距离是不一样的啊。 ...

是的,当平面坐标来计算的了
作者: jaky80000    时间: 2018-6-14 08:22
t3486784401 发表于 2018-6-14 07:02
考虑近距离简化,可以用lz的公式,但是算出来lat1-lat2应该是个弧长,而不是纬度差。我算了算,按6400km半 ...

用哪种计算公式才行呢?运算量少些的。
另外请教下,如果移动起来了,吐出来的航向角是否可以使用的,用来当指南针这样的用?
谢谢
作者: jaky80000    时间: 2018-6-14 08:24
t3486784401 发表于 2018-6-14 07:05
另外注意GPS数据格式是ddmm.mmm,dddmm.mmm,度分写在一起的

GPRMC是度数的,不是度分秒的,就是弧度了,对吧?
作者: t3486784401    时间: 2018-6-14 18:25
jaky80000 发表于 2018-6-14 08:22
用哪种计算公式才行呢?运算量少些的。
另外请教下,如果移动起来了,吐出来的航向角是否可以使用的,用 ...

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

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

G1: 2236.860596,11402.199219

实际代表:

23°36.860596' N, 114°02.199219' E

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


作者: t3486784401    时间: 2018-6-14 18:37
jaky80000 发表于 2018-6-14 08:24
GPRMC是度数的,不是度分秒的,就是弧度了,对吧?

我解析了下,这两个 GPS 数据指向 深圳北站附近的铁路上,这个对么?
作者: wumaoxu    时间: 2018-6-15 07:26
GPS民用不就是10米的精度吗?怎么想计算2米的移动。
作者: jaky80000    时间: 2018-6-15 08:15
t3486784401 发表于 2018-6-14 18:25
没具体去做过运算优化,不过如果是浮点数的话,倒是有类似“平方根倒数速算法”的加速算法。

角度数据啊 ...

用2楼的公式计算不出来啊。请推荐一个验证过的啊,非常感谢!
作者: jaky80000    时间: 2018-6-15 08:16
t3486784401 发表于 2018-6-14 18:37
我解析了下,这两个 GPS 数据指向 深圳北站附近的铁路上,这个对么?

当时确实在深圳北附近啊,这都被你查到了,牛
作者: jaky80000    时间: 2018-6-15 08:19
wumaoxu 发表于 2018-6-15 07:26
GPS民用不就是10米的精度吗?怎么想计算2米的移动。

精度这么差啊
作者: carryonli    时间: 2018-6-15 08:20
这个误差不一定就是计算误差,GPS信号也是有误差的,一般民用的5~15米误差。
作者: jaky80000    时间: 2018-6-15 08:24
carryonli 发表于 2018-6-15 08:20
这个误差不一定就是计算误差,GPS信号也是有误差的,一般民用的5~15米误差。 ...

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

一般10米误差都可以用,你要求高精度就得用高精度GPS测量仪。
作者: jaky80000    时间: 2018-6-15 12:08
高精度的用不起啊。回头再测测
作者: t3486784401    时间: 2018-6-15 12:31
jaky80000 发表于 2018-6-15 08:15
用2楼的公式计算不出来啊。请推荐一个验证过的啊,非常感谢!

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

[attach]416562[/attach]
作者: tdchenke    时间: 2018-6-15 19:15
试试这个程序,我自己在用的
#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;
}
作者: sun_sky    时间: 2018-6-16 01:26
楼主的角度和弧度换算出现了问题,GPS的输出实际应该是22度36.860596分这样的格式,要将这个转换为弧度计算才对。
举个例子:22度36.860596分=22.61434327度=0.394694741弧度。
短距离的计算的话可以近似为平面,28楼的计算很直观和简单。


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

非常感谢呀,这么用心。
谢谢,谢谢!
作者: jaky80000    时间: 2018-6-16 08:24
tdchenke 发表于 2018-6-15 19:15
试试这个程序,我自己在用的
#include

好的,谢谢!
我拿来计算测试一下,谢谢!
作者: jaky80000    时间: 2018-6-16 08:25
sun_sky 发表于 2018-6-16 01:26
楼主的角度和弧度换算出现了问题,GPS的输出实际应该是22度36.860596分这样的格式,要将这个转换为弧度计算 ...

谢谢解答,
我注意一下角度和弧度之间的转换关系。
作者: shuailong0411    时间: 2018-6-16 09:42
留个记号,会用到的
作者: jjj    时间: 2018-6-17 11:47
我们公司要求计算点到线的距离
作者: jjj    时间: 2018-6-17 11:48
点到经纬度的表示的,线也是两个点表示的
作者: zouzhichao    时间: 2018-6-17 12:35
jjj 发表于 2018-6-17 11:48
点到经纬度的表示的,线也是两个点表示的

翻看我的旧帖,会有收获
作者: wudicgi    时间: 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
查找附近地点的算法 —— Geohash

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

这个 PPT 我直接传上来了

[attach]416699[/attach]


作者: t3486784401    时间: 2018-6-17 14:11
jaky80000 发表于 2018-6-16 08:23
非常感谢呀,这么用心。
谢谢,谢谢!

经38楼提醒,不同纬度上,相同经度差对应的东西方向距离不一样。
这么看来之前的公式只适合低纬度情况。
考虑纬度的话,需要增加 cos(纬度) 因子:
dlx=Rcosφy×dφx
dly=Rdφy
作者: t3486784401    时间: 2018-6-17 14:16
wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》


感谢干货分享!
作者: jaky80000    时间: 2018-6-17 15:53
wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》

非常感谢!        
作者: huangqi412    时间: 2018-6-17 16:20
t3486784401 发表于 2018-6-15 12:31
用公式编辑器打了一遍,再要是算不出来就可以回炉平面几何了。

收藏这个公式
作者: zsmbj    时间: 2018-6-17 17:37
这里有计算器:

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


作者: zsmbj    时间: 2018-6-17 17:38
还有,你这是哪门子的经纬度啊。我是把整数修理了一下才能输入了。
作者: millwood0    时间: 2018-6-17 18:13
sqrt((36.860596-36.859863)^2+(2.199219-2.200195)^2)/60*2*pi/360*6400km=???m
作者: millwood0    时间: 2018-6-17 18:38
"计算出来是约128米": 128*2*pi()/360=???m
作者: jjj    时间: 2018-6-17 22:13
wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》

GAO REN YA
作者: wxty    时间: 2018-6-18 07:01
米8的双模定位,不知道是不是吹牛逼的
作者: 贪吃的蚂蚁    时间: 2019-3-21 11:03
wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》

感谢分享,高人啊

作者: 蛋定    时间: 2019-3-21 11:10
感谢分享!确实都是高人!
作者: 王二小    时间: 2024-3-8 13:48
£££££
作者: rz007    时间: 2024-3-8 16:21
让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;
}






欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4