Created
June 19, 2013 07:08
-
-
Save weekwood/5812219 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const double a = 6378245.0; | |
const double ee = 0.00669342162296594323; | |
static BOOL outOfChina(double lat, double lon){ | |
if(lon < 72.004 || lon > 137.8347){ | |
return true; | |
} | |
if(lat < 0.8293 || lat > 55.8271){ | |
return true; | |
} | |
return false; | |
} | |
static double transformLat(double x, double y) | |
{ | |
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x)); | |
ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0; | |
ret += (20.0 * sin(y * M_PI) + 40.0 * sin(y / 3.0 * M_PI)) * 2.0 / 3.0; | |
ret += (160.0 * sin(y / 12.0 * M_PI) + 320 * sin(y * M_PI / 30.0)) * 2.0 / 3.0; | |
return ret; | |
} | |
static double transformLon(double x, double y) | |
{ | |
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x)); | |
ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0; | |
ret += (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0; | |
ret += (150.0 * sin(x / 12.0 * M_PI) + 300.0 * sin(x / 30.0 * M_PI)) * 2.0 / 3.0; | |
return ret; | |
} | |
// World Geodetic System ==> Mars Geodetic System | |
static CLLocationCoordinate2D transform(double wgLat, double wgLon){ | |
if (outOfChina(wgLat, wgLon)){ | |
return CLLocationCoordinate2DMake(wgLat, wgLon); | |
} | |
double dLat = transformLat(wgLon - 105.0, wgLat - 35.0); | |
double dLon = transformLon(wgLon - 105.0, wgLat - 35.0); | |
double radLat = wgLat / 180.0 * M_PI; | |
double magic = sin(radLat); | |
magic = 1 - ee * magic * magic; | |
double sqrtMagic = sqrt(magic); | |
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * M_PI); | |
dLon = (dLon * 180.0) / (a / sqrtMagic *cos(radLat) * M_PI); | |
return CLLocationCoordinate2DMake(wgLat + dLat, wgLon + dLon); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment