Last active
January 9, 2019 02:39
-
-
Save zvving/5476132 to your computer and use it in GitHub Desktop.
火星坐标系转换扩展。Earth(国外 WGS84), mars(国内 GCJ-02), bearPaw(百度 BD-09) 坐标系间相互转换
This file contains 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
// | |
// CLLocation+Sino.h | |
// | |
// Created by i0xbean@gmail.com on 13-4-26. | |
// 火星坐标系转换扩展 | |
// | |
// earth(国外 WGS84), mars(国内 GCJ-02), bearPaw(百度 BD-09) 坐标系间相互转换 | |
// 未包含 mars2earth. 需要这个可参考 http://xcodev.com/131.html | |
#import <CoreLocation/CoreLocation.h> | |
@interface CLLocation (Sino) | |
- (CLLocation*)locationMarsFromEarth; | |
//- (CLLocation*)locationEarthFromMars; // 未实现 | |
- (CLLocation*)locationBearPawFromMars; | |
- (CLLocation*)locationMarsFromBearPaw; | |
@end |
This file contains 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
// | |
// CLLocation+Sino.h | |
// | |
// Created by i0xbean@gmail.com on 13-4-26. | |
// 火星坐标系转换扩展 | |
#import "CLLocation+Sino.h" | |
void transform_earth_2_mars(double lat, double lng, double* tarLat, double* tarLng); | |
void transform_mars_2_bear_paw(double lat, double lng, double* tarLat, double* tarLng); | |
void transform_bear_paw_2_mars(double lat, double lng, double* tarLat, double* tarLng); | |
@implementation CLLocation (Sino) | |
- (CLLocation*)locationMarsFromEarth; | |
{ | |
double lat = 0.0; | |
double lng = 0.0; | |
transform_earth_2_mars(self.coordinate.latitude, self.coordinate.longitude, &lat, &lng); | |
return [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(lat, lng) | |
altitude:self.altitude | |
horizontalAccuracy:self.horizontalAccuracy | |
verticalAccuracy:self.verticalAccuracy | |
course:self.course | |
speed:self.speed | |
timestamp:self.timestamp]; | |
} | |
- (CLLocation*)locationEarthFromMars; | |
{ | |
// 二分法查纠偏文件 | |
// http://xcodev.com/131.html | |
return nil; | |
} | |
- (CLLocation*)locationBearPawFromMars; | |
{ | |
double lat = 0.0; | |
double lng = 0.0; | |
transform_mars_2_bear_paw(self.coordinate.latitude, self.coordinate.longitude, &lat, &lng); | |
return [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(lat, lng) | |
altitude:self.altitude | |
horizontalAccuracy:self.horizontalAccuracy | |
verticalAccuracy:self.verticalAccuracy | |
course:self.course | |
speed:self.speed | |
timestamp:self.timestamp]; | |
} | |
- (CLLocation*)locationMarsFromBearPaw; | |
{ | |
double lat = 0.0; | |
double lng = 0.0; | |
transform_bear_paw_2_mars(self.coordinate.latitude, self.coordinate.longitude, &lat, &lng); | |
return [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(lat, lng) | |
altitude:self.altitude | |
horizontalAccuracy:self.horizontalAccuracy | |
verticalAccuracy:self.verticalAccuracy | |
course:self.course | |
speed:self.speed | |
timestamp:self.timestamp]; | |
} | |
@end | |
// --- transform_earth_2_mars --- | |
// 参考来源:https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936 | |
// Krasovsky 1940 | |
// | |
// a = 6378245.0, 1/f = 298.3 | |
// b = a * (1 - f) | |
// ee = (a^2 - b^2) / a^2; | |
const double a = 6378245.0; | |
const double ee = 0.00669342162296594323; | |
bool transform_sino_out_china(double lat, double lon) | |
{ | |
if (lon < 72.004 || lon > 137.8347) | |
return true; | |
if (lat < 0.8293 || lat > 55.8271) | |
return true; | |
return false; | |
} | |
double transform_earth_2_mars_lat(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; | |
} | |
double transform_earth_2_mars_lng(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; | |
} | |
void transform_earth_2_mars(double lat, double lng, double* tarLat, double* tarLng) | |
{ | |
if (transform_sino_out_china(lat, lng)) | |
{ | |
*tarLat = lat; | |
*tarLng = lng; | |
return; | |
} | |
double dLat = transform_earth_2_mars_lat(lng - 105.0, lat - 35.0); | |
double dLon = transform_earth_2_mars_lng(lng - 105.0, lat - 35.0); | |
double radLat = lat / 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); | |
*tarLat = lat + dLat; | |
*tarLng = lng + dLon; | |
} | |
// --- transform_earth_2_mars end --- | |
// --- transform_mars_vs_bear_paw --- | |
// 参考来源:http://blog.woodbunny.com/post-68.html | |
const double x_pi = M_PI * 3000.0 / 180.0; | |
void transform_mars_2_bear_paw(double gg_lat, double gg_lon, double *bd_lat, double *bd_lon) | |
{ | |
double x = gg_lon, y = gg_lat; | |
double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi); | |
double theta = atan2(y, x) + 0.000003 * cos(x * x_pi); | |
*bd_lon = z * cos(theta) + 0.0065; | |
*bd_lat = z * sin(theta) + 0.006; | |
} | |
void transform_bear_paw_2_mars(double bd_lat, double bd_lon, double *gg_lat, double *gg_lon) | |
{ | |
double x = bd_lon - 0.0065, y = bd_lat - 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); | |
*gg_lon = z * cos(theta); | |
*gg_lat = z * sin(theta); | |
} | |
// --- transform_mars_vs_bear_paw end --- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
locationBearPawFromMars方法不是很准备,大概相差400-500米