搜索
bottom↓
回复: 5

请教计算两点GPS坐标相对方位

[复制链接]

出0入0汤圆

发表于 2012-1-3 20:56:45 | 显示全部楼层 |阅读模式
请教一下大家,我在A点开启GPS后获得这点的GPS坐标,然后我任意方向走开到下一个点B点,获取这个B点上的GPS坐标,那么我需要得到我B点相对A点得方向角度请问怎么计算呀.
   比如我在A点获取坐标后,向A点3点钟方向走,在获取B点坐标,我需要计算出B点相对A点是90°
   千万不来来复杂的数学公式,最好能有个具体的解算方法和步骤,谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-1-3 21:57:39 | 显示全部楼层
回复【楼主位】huang137
-----------------------------------------------------------------------

小范围用三角形估算:
arctan((cos(YB)*(XB-XA))/(YB-YA))或arctan((cos(YB)*(XB-XA))/(YB-YA))+180;正北为0,顺时针为0~360,是否加180由XBXAYBYA关系进行象限判别;
大范围就要用复杂的数学公式了,你不想知道我也不想写。

出0入0汤圆

发表于 2012-1-3 22:40:55 | 显示全部楼层
这个复杂了,通过高斯投影来推算,到51map普及下基础知识,下面有推导好的简易公式

http://api.51ditu.com/docs/knowledge.html

地图应用接口中使用的经纬度单位是NTU,您需要把其它单位的经纬度值转化过来,以下为常用的转换关系:

基本转换:
NTU = 度*100000
度 = NTU/100000
例如:
经度 = 116.21345°
纬度 = 39.445875°
NTU经度:116.21345 * 100000 = 11621345(NTU)
NTU纬度:39.445874*100000=3944587(NTU)

度分转换:
将度分单位数据转换为度单位数据
度=度+分/60
例如:
经度 = 116°20.12’
纬度 = 39°12.34’
经度 = 116 + 20.12 / 60 = 116.33533°
纬度 = 39 + 12.34 / 60 = 39.20567°
NTU经度 = 116.33533 * 100000 = 11633533(NTU)
NTU纬度 = 39.20567 * 100000 = 3920567(NTU)

度分秒转换:
将度分秒单位数据转换为度单位数据
度 = 度 + 分 / 60 + 秒 / 60 / 60
例如:
经度 = 116°20’43”
纬度 = 39°12’37”
经度 = 116 + 20 / 60 + 43 / 60 / 60 = 116.34528°
纬度 = 39 + 12 / 60 + 37 / 60 / 60 = 39.21028°
NTU经度 = 116.34528 * 100000 = 11634528(NTU)
NTU纬度 = 39.21028 * 100000 = 3921028(NTU)
其格式的经纬值先转换度,再采用上面的运算。

与经纬度有关的基础知识:

NTU 相当于十万分之一度。


如何计算经度方向距离

比如:点A的纬度为3995400,点B的纬度为3995300,则这两个点在沿着纬线的方向相差100米。
点A的经度为11695400,点B的经度为11695300,则这两个点在沿着经线的方向相差大约为77米,
该值的计算方法可以用近似公式:
经度方向距离 = 经度差 * cos(纬度值) = 100 * cos(39) = 77米。

如何计算两点间距离

比如:点A的经度为11695400,纬度为3995400。点B的经度为11695300,纬度为3995300。
公式:两点间距离 = [ (A点经度 - B点经度)^2 + (A点纬度 - B点纬度)^2 ] ^ (1/2) = [ (11695400 - 11695300)^2
+ (3995400 - 3995300)^2 ] ^(1/2) =(10000+10000) ^ (1/2) =141米

公式说明:加法 + ,减法 - ,乘法 *,除法 /,幂运算 ^(1/2)表示平方根 ^2表示平方。

出0入0汤圆

发表于 2012-1-4 00:45:18 | 显示全部楼层
准备去玩玩GPS

出0入0汤圆

 楼主| 发表于 2012-1-4 03:40:20 | 显示全部楼层
谢谢二楼朋友的回答,但是还是没看明白
二楼能不能这样,举一个实际例子来说明计算方法,就从两点随意GPS经纬度,A点和B点开始,一直算出B点相对A的方位度数,谢谢。

出0入0汤圆

发表于 2016-8-6 13:16:43 | 显示全部楼层
huang137 发表于 2012-1-4 03:40
谢谢二楼朋友的回答,但是还是没看明白
二楼能不能这样,举一个实际例子来说明计算方法,就从两点随意GPS经 ...

//根据角度计算弧度
double rad(double d)
{
    const double PI = 3.1415926535898;
    return d * PI/180.0;
}
//根据弧度计算角度
double Angle(double r)
{
    const double PI = 3.1415926535898;
    return r * 180/PI;
}

//根据两点经纬度计算两点距离
double GetDistance(double lat1, double lng1, double lat2, double lng2)  
{  
    const double EARTH_RADIUS = 6378137;//地球半径(单位:m)
   
    double radLat1 = rad(lat1);//根据角度计算弧度
    double radLat2 = rad(lat2);
    double radLng1 = rad(lng1);
    double radLng2 = rad(lng2);
   
    double a = radLat1 - radLat2;
    double b = radLng1 - radLng2;
   
    double s = 2 * asin(sqrt(pow(sin(a/2),2) + cos(radLat1)*cos(radLat2)*pow(sin(b/2),2)));//google maps里面实现的算法
    s = s * EARTH_RADIUS;  
   
    return s;  
}

//计算方位角
double GetBearing(double lat1, double lng1, double lat2, double lng2)
{
    double d = 0;
   
    double radLat1 = rad(lat1);//根据角度计算弧度
    double radLat2 = rad(lat2);
    double radLng1 = rad(lng1);
    double radLng2 = rad(lng2);
   
    d = sin(radLat1)*sin(radLat2)+cos(radLat1)*cos(radLat2)*cos(radLng2-radLng1);
    d = sqrt(1-d*d);
    d = cos(radLat2)*sin(radLng2-radLng1)/d;
    d = Angle(asin(d));
   
    return d;//返回方位角
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-21 20:54

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

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