四维图新地图坐标_iOS关于百度地图坐标转换问题

#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);

}

这是个小技术点,在这里是汇总了我在解决这个问题上的方法包括在网上找的资料,整理了一下,有不足之处可以提出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值