已知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米的距离的原因导致的吗? {: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; 海拔高度,地球非圆都影响计算结果 合格的二楼。公式好复杂 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:} ,哪里错了? zouzhichao 发表于 2018-6-13 21:41
海拔高度,地球非圆都影响计算结果
在短距离内,非圆影响是否可以忽略呀
另外,如果移动中,GPS吐的的航向角,以真北为基准的,是否可以直接使用呀 一楼的那个网上的公式,连量纲都不对吧。 精度要求不高时,短距离可以忽略弧度,从而简化计算 jaky80000 发表于 2018-6-13 21:59
在短距离内,非圆影响是否可以忽略呀
另外,如果移动中,GPS吐的的航向角,以真北为基准的,是否可以直接 ...
考虑非圆,半径你按哪个数值计算? get500wan 发表于 2018-6-13 22:00
一楼的那个网上的公式,连量纲都不对吧。
感觉是个勾股定律,直接计算距离的 zouzhichao 发表于 2018-6-13 22:19
考虑非圆,半径你按哪个数值计算?
我现在还没有计算出来2个点之间的距离呢,惭愧 楼主是把球面坐标当成平面直角坐标系了吧?在不同的纬度,经度差1分的距离是不一样的啊。 考虑近距离简化,可以用lz的公式,但是算出来lat1-lat2应该是个弧长,而不是纬度差。我算了算,按6400km半径,一分的纬度差对应约1.8km,你这千分之一分左右的纬度差和经度差,不就是2m左右么。 另外注意GPS数据格式是ddmm.mmm,dddmm.mmm,度分写在一起的 XA144F 发表于 2018-6-13 23:45
楼主是把球面坐标当成平面直角坐标系了吧?在不同的纬度,经度差1分的距离是不一样的啊。 ...
是的,当平面坐标来计算的了 t3486784401 发表于 2018-6-14 07:02
考虑近距离简化,可以用lz的公式,但是算出来lat1-lat2应该是个弧长,而不是纬度差。我算了算,按6400km半 ...
用哪种计算公式才行呢?运算量少些的。
另外请教下,如果移动起来了,吐出来的航向角是否可以使用的,用来当指南针这样的用?
谢谢 t3486784401 发表于 2018-6-14 07:05
另外注意GPS数据格式是ddmm.mmm,dddmm.mmm,度分写在一起的
GPRMC是度数的,不是度分秒的,就是弧度了,对吧? jaky80000 发表于 2018-6-14 08:22
用哪种计算公式才行呢?运算量少些的。
另外请教下,如果移动起来了,吐出来的航向角是否可以使用的,用 ...
没具体去做过运算优化,不过如果是浮点数的话,倒是有类似“平方根倒数速算法”的加速算法。
角度数据啊,那个一查就有了。比如你的
G1: 2236.860596,11402.199219
实际代表:
23°36.860596' N, 114°02.199219' E
单位当然是度,不是弧度。
jaky80000 发表于 2018-6-14 08:24
GPRMC是度数的,不是度分秒的,就是弧度了,对吧?
我解析了下,这两个 GPS 数据指向 深圳北站附近的铁路上,这个对么? GPS民用不就是10米的精度吗?怎么想计算2米的移动。 t3486784401 发表于 2018-6-14 18:25
没具体去做过运算优化,不过如果是浮点数的话,倒是有类似“平方根倒数速算法”的加速算法。
角度数据啊 ...
用2楼的公式计算不出来啊。请推荐一个验证过的啊,非常感谢! t3486784401 发表于 2018-6-14 18:37
我解析了下,这两个 GPS 数据指向 深圳北站附近的铁路上,这个对么?
当时确实在深圳北附近啊,这都被你查到了,牛 wumaoxu 发表于 2018-6-15 07:26
GPS民用不就是10米的精度吗?怎么想计算2米的移动。
精度这么差啊 这个误差不一定就是计算误差,GPS信号也是有误差的,一般民用的5~15米误差。 carryonli 发表于 2018-6-15 08:20
这个误差不一定就是计算误差,GPS信号也是有误差的,一般民用的5~15米误差。 ...
看来这个地图定位要精确定位还需要配合地图数据,计算出来的定位数据了。 jaky80000 发表于 2018-6-15 08:24
看来这个地图定位要精确定位还需要配合地图数据,计算出来的定位数据了。 ...
一般10米误差都可以用,你要求高精度就得用高精度GPS测量仪。 高精度的用不起啊。回头再测测 jaky80000 发表于 2018-6-15 08:15
用2楼的公式计算不出来啊。请推荐一个验证过的啊,非常感谢!
用公式编辑器打了一遍,再要是算不出来就可以回炉平面几何了。
试试这个程序,我自己在用的
#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;
} 楼主的角度和弧度换算出现了问题,GPS的输出实际应该是22度36.860596分这样的格式,要将这个转换为弧度计算才对。
举个例子:22度36.860596分=22.61434327度=0.394694741弧度。
短距离的计算的话可以近似为平面,28楼的计算很直观和简单。
t3486784401 发表于 2018-6-15 12:31
用公式编辑器打了一遍,再要是算不出来就可以回炉平面几何了。
非常感谢呀,这么用心。
谢谢,谢谢! tdchenke 发表于 2018-6-15 19:15
试试这个程序,我自己在用的
#include
好的,谢谢!
我拿来计算测试一下,谢谢! sun_sky 发表于 2018-6-16 01:26
楼主的角度和弧度换算出现了问题,GPS的输出实际应该是22度36.860596分这样的格式,要将这个转换为弧度计算 ...
谢谢解答,
我注意一下角度和弧度之间的转换关系。 留个记号,会用到的 我们公司要求计算点到线的距离 点到经纬度的表示的,线也是两个点表示的 jjj 发表于 2018-6-17 11:48
点到经纬度的表示的,线也是两个点表示的
翻看我的旧帖,会有收获 我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》
精确的算法是用半正矢公式,距离较近时可以用近似算法,但至少也要考虑所在纬度上每 1 度经度对应的距离是多少
这个 PPT 我直接传上来了
jaky80000 发表于 2018-6-16 08:23
非常感谢呀,这么用心。
谢谢,谢谢!
经38楼提醒,不同纬度上,相同经度差对应的东西方向距离不一样。
这么看来之前的公式只适合低纬度情况。
考虑纬度的话,需要增加 cos(纬度) 因子:
dlx=Rcosφy×dφx
dly=Rdφy wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》
感谢干货分享! wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》
非常感谢! t3486784401 发表于 2018-6-15 12:31
用公式编辑器打了一遍,再要是算不出来就可以回炉平面几何了。
收藏这个公式 这里有计算器:
http://www.storyday.com/wp-content/uploads/2008/09/latlung_dis.html
还有,你这是哪门子的经纬度啊。我是把整数修理了一下才能输入了。 sqrt((36.860596-36.859863)^2+(2.199219-2.200195)^2)/60*2*pi/360*6400km=???m "计算出来是约128米": 128*2*pi()/360=???m wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》
GAO REN YA 米8的双模定位,不知道是不是吹牛逼的 wudicgi 发表于 2018-6-17 12:54
我以前做过的一个 PPT 有距离计算公式的说明
《查找附近地点的算法 —— Geohash》
感谢分享,高人啊
感谢分享!确实都是高人! £££££ 让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]