jaky80000 发表于 2018-6-13 21:31:35

已知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:42

{:smile:}

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:05

海拔高度,地球非圆都影响计算结果

XUEPENGBIN 发表于 2018-6-13 21:49:07

合格的二楼。公式好复杂

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

出现负数了,计算不下去了{:lol:} ,哪里错了?

jaky80000 发表于 2018-6-13 21:59:24

zouzhichao 发表于 2018-6-13 21:41
海拔高度,地球非圆都影响计算结果

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

get500wan 发表于 2018-6-13 22:00:54

一楼的那个网上的公式,连量纲都不对吧。

hxled123 发表于 2018-6-13 22:18:03

精度要求不高时,短距离可以忽略弧度,从而简化计算

zouzhichao 发表于 2018-6-13 22:19:25

jaky80000 发表于 2018-6-13 21:59
在短距离内,非圆影响是否可以忽略呀
另外,如果移动中,GPS吐的的航向角,以真北为基准的,是否可以直接 ...

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

jaky80000 发表于 2018-6-13 22:27:01

get500wan 发表于 2018-6-13 22:00
一楼的那个网上的公式,连量纲都不对吧。

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

jaky80000 发表于 2018-6-13 22:27:48

zouzhichao 发表于 2018-6-13 22:19
考虑非圆,半径你按哪个数值计算?

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

XA144F 发表于 2018-6-13 23:45:50

楼主是把球面坐标当成平面直角坐标系了吧?在不同的纬度,经度差1分的距离是不一样的啊。

t3486784401 发表于 2018-6-14 07:02:53

考虑近距离简化,可以用lz的公式,但是算出来lat1-lat2应该是个弧长,而不是纬度差。我算了算,按6400km半径,一分的纬度差对应约1.8km,你这千分之一分左右的纬度差和经度差,不就是2m左右么。

t3486784401 发表于 2018-6-14 07:05:52

另外注意GPS数据格式是ddmm.mmm,dddmm.mmm,度分写在一起的

jaky80000 发表于 2018-6-14 08:20:42

XA144F 发表于 2018-6-13 23:45
楼主是把球面坐标当成平面直角坐标系了吧?在不同的纬度,经度差1分的距离是不一样的啊。 ...

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

jaky80000 发表于 2018-6-14 08:22:52

t3486784401 发表于 2018-6-14 07:02
考虑近距离简化,可以用lz的公式,但是算出来lat1-lat2应该是个弧长,而不是纬度差。我算了算,按6400km半 ...

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

jaky80000 发表于 2018-6-14 08:24:23

t3486784401 发表于 2018-6-14 07:05
另外注意GPS数据格式是ddmm.mmm,dddmm.mmm,度分写在一起的

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

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

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

t3486784401 发表于 2018-6-14 18:37:18

jaky80000 发表于 2018-6-14 08:24
GPRMC是度数的,不是度分秒的,就是弧度了,对吧?

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

wumaoxu 发表于 2018-6-15 07:26:03

GPS民用不就是10米的精度吗?怎么想计算2米的移动。

jaky80000 发表于 2018-6-15 08:15:47

t3486784401 发表于 2018-6-14 18:25
没具体去做过运算优化,不过如果是浮点数的话,倒是有类似“平方根倒数速算法”的加速算法。

角度数据啊 ...

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

jaky80000 发表于 2018-6-15 08:16:49

t3486784401 发表于 2018-6-14 18:37
我解析了下,这两个 GPS 数据指向 深圳北站附近的铁路上,这个对么?

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

jaky80000 发表于 2018-6-15 08:19:05

wumaoxu 发表于 2018-6-15 07:26
GPS民用不就是10米的精度吗?怎么想计算2米的移动。

精度这么差啊

carryonli 发表于 2018-6-15 08:20:07

这个误差不一定就是计算误差,GPS信号也是有误差的,一般民用的5~15米误差。

jaky80000 发表于 2018-6-15 08:24:50

carryonli 发表于 2018-6-15 08:20
这个误差不一定就是计算误差,GPS信号也是有误差的,一般民用的5~15米误差。 ...

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

carryonli 发表于 2018-6-15 08:40:26

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

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

jaky80000 发表于 2018-6-15 12:08:40

高精度的用不起啊。回头再测测

t3486784401 发表于 2018-6-15 12:31:02

jaky80000 发表于 2018-6-15 08:15
用2楼的公式计算不出来啊。请推荐一个验证过的啊,非常感谢!

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

tdchenke 发表于 2018-6-15 19:15:34

试试这个程序,我自己在用的
#include <math.h>

#definePI_S                     (double)(3.1415926)
#defineEARTH_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:19

楼主的角度和弧度换算出现了问题,GPS的输出实际应该是22度36.860596分这样的格式,要将这个转换为弧度计算才对。
举个例子:22度36.860596分=22.61434327度=0.394694741弧度。
短距离的计算的话可以近似为平面,28楼的计算很直观和简单。

jaky80000 发表于 2018-6-16 08:23:52

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

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

jaky80000 发表于 2018-6-16 08:24:34

tdchenke 发表于 2018-6-15 19:15
试试这个程序,我自己在用的
#include



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

jaky80000 发表于 2018-6-16 08:25:29

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

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

shuailong0411 发表于 2018-6-16 09:42:46

留个记号,会用到的

jjj 发表于 2018-6-17 11:47:45

我们公司要求计算点到线的距离

jjj 发表于 2018-6-17 11:48:45

点到经纬度的表示的,线也是两个点表示的

zouzhichao 发表于 2018-6-17 12:35:10

jjj 发表于 2018-6-17 11:48
点到经纬度的表示的,线也是两个点表示的

翻看我的旧帖,会有收获

wudicgi 发表于 2018-6-17 12:54:50

我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》

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

这个 PPT 我直接传上来了



t3486784401 发表于 2018-6-17 14:11:27

jaky80000 发表于 2018-6-16 08:23
非常感谢呀,这么用心。
谢谢,谢谢!

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

t3486784401 发表于 2018-6-17 14:16:41

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



感谢干货分享!

jaky80000 发表于 2018-6-17 15:53:01

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



非常感谢!      

huangqi412 发表于 2018-6-17 16:20:09

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

收藏这个公式

zsmbj 发表于 2018-6-17 17:37:45

这里有计算器:

http://www.storyday.com/wp-content/uploads/2008/09/latlung_dis.html

zsmbj 发表于 2018-6-17 17:38:51

还有,你这是哪门子的经纬度啊。我是把整数修理了一下才能输入了。

millwood0 发表于 2018-6-17 18:13:41

sqrt((36.860596-36.859863)^2+(2.199219-2.200195)^2)/60*2*pi/360*6400km=???m

millwood0 发表于 2018-6-17 18:38:26

"计算出来是约128米": 128*2*pi()/360=???m

jjj 发表于 2018-6-17 22:13:33

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



GAO REN YA

wxty 发表于 2018-6-18 07:01:55

米8的双模定位,不知道是不是吹牛逼的

贪吃的蚂蚁 发表于 2019-3-21 11:03:40

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



感谢分享,高人啊

蛋定 发表于 2019-3-21 11:10:23

感谢分享!确实都是高人!

王二小 发表于 2024-3-8 13:48:14

£££££

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

页: [1]
查看完整版本: 已知2个GPS的经纬度,计算2点的距离,用公式计算不对,请教