1. 程式人生 > 實用技巧 >電子海圖開發第十六篇 ,墨卡託海圖經緯度c++演算法(共一百篇)

電子海圖開發第十六篇 ,墨卡託海圖經緯度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; }

參考文章:電子海圖開發,web電子海圖開發,電子海圖二次開發