电子海图开发第十六篇 ,墨卡托海图经纬度c++算法(共一百篇)

开发电子海图肯定要涉及到墨卡托计算,分享墨卡托转平面坐标的算法 

struct GeoPoint
{
    double lon;
    double lat;
};

double m_R;

//计算海图的基准维度,一般取30°

void getR(double lat)
{

 lat = lat*PI / 180;

 double N = 6378137 / sqrt(1 - 0.08189*0.08189*sin(lat)*sin(lat));
 m_R = N*cos(lat);

}

//将墨卡托海图经纬度坐标转换为平面坐标,单位 :米

void  getMokato(GeoPoint *point)
{

 point->lon = point->lon / m_icoord*PI / 180;
 point->lat = point->lat / m_icoord*PI / 180;
 double Q = log(tan(0.785398163375 + point->lat / 2)) - 0.040945*log((1 + 0.08189*sin(point->lat)) / (1 - 0.08189*sin(point->lat)));
 point->lon = point->lon*m_R ;
 point->lat = m_R*Q ;

}


double getLat(double pointx, double x)
{

 double d_e = 0.08189;
 double G = d_e / 2 * log((1 + d_e *sin(x)) / (1 - d_e * sin(x))) + pointx / m_R;
 return  2 * atan(exp(G)) - PI / 2;
}

//将屏幕坐标转换为墨卡托海图坐标,进行多次迭代计算,

void  getLatlon(GeoPoint *point)
{
 point->lat = point->lat;
 double d_x = 0.0;
 d_x = getLat(point->lat, d_x);
 d_x = getLat(point->lat, d_x);
 d_x = getLat(point->lat, d_x);
 d_x = getLat(point->lat, d_x);
 point->lat= d_x * 180 / PI;
  point->lon = point->lon / m_R * 180 / PI;   
}

 联系作者及参考文章:http://www.sailxy.com

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电子海图(微信lvxin6136)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值