ios 百度地图,火星坐标,地球坐标互转
转载声明:
本文为摘录自“博客园”,版权归原作者所有。
温馨提示:
为了更好的体验,请点击原文链接进行浏览
摘录时间:
2020-03-18 22:10:20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
// // CLLocation+YCLocation.h // Topevery.GPS 转换 // // Created by JY Mac on 15-5-30. // Copyright (c) 2015年 JY. All rights reserved. // 火星坐标系转换扩展 /* 从 CLLocationManager 取出来的经纬度放到 mapView 上显示,是错误的! 从 CLLocationManager 取出来的经纬度去 Google Maps API 做逆地址解析,当然是错的! 从 MKMapView 取出来的经纬度去 Google Maps API 做逆地址解析终于对了。去百度地图API做逆地址解析,依旧是错的! 从上面两处取的经纬度放到百度地图上显示都是错的!错的!的! 分为 地球坐标,火星坐标(iOS mapView 高德 , 国内google ,搜搜、阿里云 都是火星坐标),百度坐标(百度地图数据主要都是四维图新提供的) 火星坐标: MKMapView 地球坐标: CLLocationManager 当用到CLLocationManager 得到的数据转化为火星坐标, MKMapView不用处理 API 坐标系 百度地图API 百度坐标 腾讯搜搜地图API 火星坐标 搜狐搜狗地图API 搜狗坐标 阿里云地图API 火星坐标 图吧MapBar地图API 图吧坐标 高德MapABC地图API 火星坐标 灵图51ditu地图API 火星坐标 */ #import <CoreLocation/CoreLocation.h> @interface CLLocation (YCLocation) //从地图坐标转化到火星坐标 - (CLLocation*)locationMarsFromEarth; //从火星坐标转化到百度坐标 - (CLLocation*)locationBaiduFromMars; //从百度坐标到火星坐标 - (CLLocation*)locationMarsFromBaidu; //从火星坐标到地图坐标 - (CLLocation*)locationEarthFromMars; //从百度坐标到地图坐标 - (CLLocation*)locationEarthFromBaidu; @end |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
// // CLLocation+YCLocation.m // Topevery.GPS 转换 // // Created by JY Mac on 15-5-30. // Copyright (c) 2015年 JY. All rights reserved. // #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 --- // 参考来源: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_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 --- // 参考来源:http://blog.woodbunny.com/post-68.html 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); } |