#import
"CLLocation+YCLocation.h"
void
transform_earth_from_mars(double
lat, double
lng, double*
tarLat, double*
tarLng);
void
transform_mars_from_baidu(double
lat, double
lng, double*
tarLat, double*
tarLng);
void
transform_baidu_from_mars(double
lat, double
lng, double*
tarLat, double*
tarLng);
@implementation
CLLocation (YCLocation)
- (CLLocation*)locationMarsFromEarth
{
double
lat = 0.0;
double
lng = 0.0;
transform_earth_from_mars(self.coordinate.latitude,
self.coordinate.longitude,
&lat, &lng);
return
[[CLLocation
alloc]
initWithCoordinate:CLLocationCoordinate2DMake(lat+self.coordinate.latitude,
lng+self.coordinate.longitude)
altitude:self.altitude
horizontalAccuracy:self.horizontalAccuracy
verticalAccuracy:self.verticalAccuracy
course:self.course
speed:self.speed
timestamp:self.timestamp];
}
- (CLLocation*)locationEarthFromMars
{
double
lat = 0.0;
double
lng = 0.0;
transform_earth_from_mars(self.coordinate.latitude,
self.coordinate.longitude,
&lat, &lng);
return
[[CLLocation
alloc]
initWithCoordinate:CLLocationCoordinate2DMake(self.coordinate.latitude-lat,
self.coordinate.longitude-lng)
altitude:self.altitude
horizontalAccuracy:self.horizontalAccuracy
verticalAccuracy:self.verticalAccuracy
course:self.course
speed:self.speed
timestamp:self.timestamp];
return nil;
}
- (CLLocation*)locationBaiduFromMars
{
double
lat = 0.0;
double
lng = 0.0;
transform_mars_from_baidu(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*)locationMarsFromBaidu
{
double
lat = 0.0;
double
lng = 0.0;
transform_baidu_from_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*)locationEarthFromBaidu
{
double
lat = 0.0;
double
lng = 0.0;
CLLocation
*Mars
= [self
locationMarsFromBaidu];
transform_earth_from_mars(Mars.coordinate.latitude,
Mars.coordinate.longitude,
&lat, &lng);
return
[[CLLocation
alloc]
initWithCoordinate:CLLocationCoordinate2DMake(Mars.coordinate.latitude-lat,
Mars.coordinate.longitude-lng)
altitude:self.altitude
horizontalAccuracy:self.horizontalAccuracy
verticalAccuracy:self.verticalAccuracy
course:self.course
speed:self.speed
timestamp:self.timestamp];
return nil;
}
@end
// --- transform_earth_from_mars ---
// 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_from_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_from_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_from_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_from_mars_lat(lng
- 105.0,
lat - 35.0);
double
dLon = transform_earth_from_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 = dLat;
*tarLng = dLon;
}
// --- transform_earth_from_mars end ---
// --- transform_mars_vs_bear_paw ---
const
double
x_pi = M_PI
* 3000.0
/ 180.0;
void
transform_mars_from_baidu(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_baidu_from_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);
}
这是个小技术点,在这里是汇总了我在解决这个问题上的方法包括在网上找的资料,整理了一下,有不足之处可以提出