两个经纬度偏角_怎么根据两个经纬度计算出航向

C/C++ codedouble CChartCtrl::CalcltDirct(float fStarPtx, float fStarPty, float fEndPtx, float fEndPty)

{

//已知起始点坐标(fStartPtx, fStartPty)及到达点坐标(fEndPtx,fEndPty)

//计算航向fDirect.

//起始点,到达点坐标:经纬度

//航向:角度

//Created by zhl

//2002.7.2

//check param

CString strErr;

strErr.LoadString(IDS_CHK_15002);

if(fStarPtx>90.0f||fStarPtx180.0f

||fStarPty90.0f||fEndPtx

||fEndPty>180.0f||fEndPty

{

// AfxMessageBox(strErr);

return -1;

}

double delta_fy=fEndPtx-fStarPtx;

double delta_lnmg=fEndPty-fStarPty;

//经度差应小于180度

if(delta_lnmg < -180.0)

delta_lnmg += 360.0;

if(delta_lnmg > 180.0)

delta_lnmg -= 360.0;

//delta_lnmg > 0.0 从 西 ---> 东 delta_lnmg < 0.0 从 东 ---> 西

BOOL bGoEast=FALSE,bGoNorth=FALSE;

if(delta_lnmg >= 0.0)

bGoEast=TRUE;

else

bGoEast=FALSE;

//delta_fy > 0.0 从 南 ---> 北 delta_fy < 0.0 从 北 ---> 南

if(delta_fy>=0.0)

bGoNorth=TRUE;

else

bGoNorth=FALSE;

if(delta_fy==0)

{

if(delta_lnmg==0)return 0;

return bGoEast?90:270;

}

double d1=7915.7045*(e/2*log10((1-e*sin(fStarPtx*M_PI/180))

/(1+e*sin(fStarPtx*M_PI/180)))

+log10(tan((45+fStarPtx/2)*M_PI/180.0)));//纬度渐长率

double d2=7915.7045*(e/2*log10((1-e*sin(fEndPtx*M_PI/180))/

(1+e*sin(fEndPtx*M_PI/180)))

+log10(tan((45+fEndPtx/2)*M_PI/180.0)));//纬度渐长率

double delta_d=d2-d1;纬度渐长率差(分)

double dbDir=atan(delta_lnmg*60/delta_d)*180/M_PI;

if(!bGoEast&&bGoNorth)dbDir=360+dbDir;

if(!bGoEast&&!bGoNorth)dbDir=180+dbDir;

if(bGoEast&&!bGoNorth)dbDir=180+dbDir;

return dbDir;

}

------解决方案--------------------

这个问题不难啊,LZ。这种距离不远的情况下无需考虑地球的曲率。所以直接按照平面坐标计算即可。记住几点:正北为0度,顺时针为正,这样两点之间,采用正切(tan)或正弦、余弦等方式计算角度即可得到航向。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值