Last active
April 24, 2022 08:26
-
-
Save heliang219/078561f593c4ee55016249e00e7faf2b 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
来源:https://www.jianshu.com/p/27dbe24e8771 | |
/** | |
百度坐标转高德坐标 | |
@param glat 纬度 | |
@param glon 经度 | |
@return 数组【转换后的纬度,转换后的经度】 | |
*/ | |
+ (NSArray *)bd09llToGCJLat:(double)glat lon:(double)glon { | |
double X_PI = M_PI * 3000.0 / 180.0; | |
double x = glon - 0.0065; | |
double y = glat - 0.006; | |
double z = sqrt(x * x + y * y) - 0.00002 * sin(y * X_PI); | |
double theta = atan2(y, x) - 0.000003 * cos(x * X_PI); | |
double lat = z * sin(theta); | |
double lon = z * cos(theta); | |
NSArray *latlon = @[[NSNumber numberWithDouble:lat],[NSNumber numberWithDouble:lon]]; | |
return latlon; | |
} | |
/** | |
高德坐标转系统自带坐标 | |
@param array 数组 需要转换的坐标【纬度,经度】 | |
@return 数组【转换后的纬度,转换后的经度】 | |
*/ | |
+ (NSArray *)gcjToWGS:(NSArray *)array { | |
double lat = [array.firstObject doubleValue]; | |
double lon = [array.lastObject doubleValue]; | |
if ([self outOfChinalat:lat lon:lon]){ | |
return @[[NSNumber numberWithDouble:lat],[NSNumber numberWithDouble:lon]]; | |
} | |
NSArray *latlon = [self deltalat:lat lon:lon]; | |
return latlon; | |
} | |
+ (BOOL)outOfChinalat:(double)lat lon:(double)lon { | |
if (lon < 72.004 || lon > 137.8347) | |
return true; | |
if (lat < 0.8293 || lat > 55.8271) | |
return true; | |
return false; | |
} | |
+ (NSArray *)deltalat:(double)wgLat lon:(double)wgLon { | |
double OFFSET = 0.00669342162296594323; | |
double AXIS = 6378245.0; | |
double dLat = [self transformLatx:(wgLon - 105.0) lon:(wgLat - 35.0)]; | |
double dLon = [self transformLonx:(wgLon - 105.0) lon:(wgLat - 35.0)]; | |
double radLat = wgLat / 180.0 * M_PI; | |
double magic = sin(radLat); | |
magic = 1 - OFFSET * magic * magic; | |
double sqrtMagic = sqrt(magic); | |
dLat = (dLat * 180.0) / ((AXIS * (1 - OFFSET)) / (magic * sqrtMagic) * M_PI); | |
dLon = (dLon * 180.0) / (AXIS / sqrtMagic * cos(radLat) * M_PI); | |
return @[[NSNumber numberWithDouble:(wgLat - dLat)],[NSNumber numberWithDouble:(wgLon - dLon)]]; | |
} | |
+ (double)transformLatx:(double)x lon:(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; | |
} | |
+ (double)transformLonx:(double)x lon:(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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment