void gcj2wgs(double gcjLat, double gcjLng, double *wgsLat, double *wgsLng) { if ((wgsLat == NULL) || (wgsLng == NULL)) { return; } if (outOfChina(gcjLat, gcjLng)) { *wgsLat = gcjLat; *wgsLng = gcjLng; return; } double dLat, dLng; delta(gcjLat, gcjLng, &dLat, &dLng); *wgsLat = gcjLat - dLat; *wgsLng = gcjLng - dLng; }
void wgs2gcj(double wgsLat, double wgsLng, double *gcjLat, double *gcjLng) { if ((gcjLat == NULL) || (gcjLng == NULL)) { return; } if (outOfChina(wgsLat, wgsLng)) { *gcjLat = wgsLat; *gcjLng = wgsLng; return; } double dLat, dLng; delta(wgsLat, wgsLng, &dLat, &dLng); *gcjLat = wgsLat + dLat; *gcjLng = wgsLng + dLng; }
void gps_transform( double wgLat, double wgLon, double& mgLat, double& mgLon) { if (outOfChina(wgLat, wgLon)) { mgLat = wgLat; mgLon = wgLon; return; } double dLat = transformLat(wgLon - 105.0, wgLat - 35.0); double dLon = transformLon(wgLon - 105.0, wgLat - 35.0); double radLat = wgLat / 180.0 * pi; double magic = sin(radLat); magic = 1 - ee * magic * magic; double sqrtMagic = sqrt(magic); dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi); mgLat = wgLat + dLat; mgLon = wgLon + dLon; }
void gcj2wgs_exact(double gcjLat, double gcjLng, double *wgsLat, double *wgsLng) { double dLat, dLng; // n_iter=2: centimeter precision, n_iter=5: double precision const int n_iter = 2; int i; if ((wgsLat == NULL) || (wgsLng == NULL)) { return; } *wgsLat = gcjLat; *wgsLng = gcjLng; if (outOfChina(gcjLat, gcjLng)) { return; } for (i = 0; i < n_iter; i++) { delta(*wgsLat, *wgsLng, &dLat, &dLng); *wgsLat = gcjLat - dLat; *wgsLng = gcjLng - dLng; } }