由于国家规定,在使用谷歌地图时,GPS会使用一个保密的算法进行偏移。此偏移算法在互联网上是公开的秘密。可以使用谷歌搜索"wgtochina_lb"。以下代码实现了GCJ-02到WGS-84的转换。可以在谷歌地图上验证过。
MapFix.h
class CMapFix
{
public:
static CMapFix* getInstance()
{
if (m_pInstance == NULL)
{
m_pInstance = new CMapFix();
}
return m_pInstance;
}
private:
CMapFix();
private:
double m_casm_f;
double m_casm_rr;
double m_casm_t1;
double m_casm_t2;
double m_casm_x1;
double m_casm_x2;
double m_casm_y1;
double m_casm_y2;
static CMapFix* m_pInstance;
public:
//纠偏计算
//dSrcLat 纠偏之前的纬度,dSrcLong纠偏之前的经度
//dDstLat 纠偏之后的纬度,dSrcLong纠偏之后的经度(这两个作为返回值使用)
void GPSFix(double dSrcLat, double dSrcLong, double& dDstLat, double& dDstLong);
private:
struct MapPoint
{
double dLatitude;
double dLongitude;
};
private:
void IniCasm(double w_time, double w_lng, double w_lat);
double random_yj();
double Transform_jy5(double x, double xx);
double Transform_jyj5(double x, double yy);
double Transform_yj5(double x, double y);
double Transform_yjy5(double x, double y);
MapPoint* wgtochina_lb(int wg_flag, int wg_lng, int wg_lat, int wg_heit, int wg_week, int wg_time);
double yj_sin2(double x);
};
MapFix.cpp
#include "MapFix.h"
#include <math.h>
CMapFix* CMapFix::m_pInstance = NULL;
CMapFix::CMapFix()
{
m_casm_f = 0.0;
m_casm_rr = 0.0;
m_casm_t1 = 0.0;
m_casm_t2 = 0.0;
m_casm_x1 = 0.0;
m_casm_x2 = 0.0;
m_casm_y1 = 0.0;