ios 百度地图,火星坐标,地球坐标互转
|
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.htmlconst 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);} |
ios 百度地图,火星坐标,地球坐标互转的更多相关文章
- delphi 调用百度地图WEBSERVICE转换GPS坐标 转
http://www.cnblogs.com/happyhills/p/3789864.html 百度地图的API说明 使用方法 第一步,申请密钥(ak),作为访问服务的依据: 第二步,按照请求参 ...
- C#的百度地图开发(三)依据坐标获取位置、商圈及周边信息
原文:C#的百度地图开发(三)依据坐标获取位置.商圈及周边信息 我们得到了百度坐标,现在依据这一坐标来获取相应的信息.下面是相应的代码 public class BaiduMap { /// < ...
- 【地图功能开发系列:二】根据地址名称通过百度地图API查询出坐标
根据地址名称通过百度地图API查询出坐标 百度地图ApiUrl string url = "http://api.map.baidu.com/geocoder?address={0}& ...
- delphi 调用百度地图WEBSERVICE转换GPS坐标
百度地图的API说明 使用方法 第一步,申请密钥(ak),作为访问服务的依据: 第二步,按照请求参数说明拼写发送http请求的url,注意需使用第一步申请的ak: 第三步,接收返回的数据(json或者 ...
- iOS百度地图简单使用详解
iOS百度地图简单使用详解 百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰 ...
- iOS百度地图SDK集成详细步骤
1.iOS百度地图下载地址 http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download 根据需要选择不同的版本 ...
- IOS百度地图之--->第一篇《环境配置与基本使用》
Ios 百度地图SDK简易使用说明:http://developer.baidu.com/map/index.php?title=iossdk 先道歉:对于原来上传的Demo我很抱歉,什么都没有,也没 ...
- iOS 百度地图坐标标注
注:由于iOS9改用更安全的https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用. <key>NSApp ...
- iOS百度地图简单使用
本文介绍三种接口: 1.基础地图2.POI检索3.定位 首先是配置环境,有两种方法,方法在官方教程里都有,不再多说 1.使用CocoaPods自动配置[这个方法特别好,因为当你使用CocoaPods配 ...
随机推荐
- socket 长连接
实现: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的. 如果,长时间未发送维持连接包,服务端程序将断开连接. 服务端: 由于客户端会定时(keepAliveDelay毫秒)发送 ...
- [RF] Robot Framework新手干货(转载)
Robot Framework用法总结 Robot Framework完整流程学习系列一 Robotframework自动化新手常见问题总结--(基础篇)
- js,jquery的数字型字符串变量比较大小
转:http://blog.csdn.net/dxnn520/article/details/8267173 var定义的变量应该是字符串,有时没有经过类型转换而进行比较的话,小于十的话还可以,如果大 ...
- idea部署tomcat-404错误
今天在部署数据质量web工程在tomcat后,访问时报404错误,在网上搜了很多相关配置,也都是一步一步来的 Application Context 也配置好了,Artifact也添加了,就是访问不了 ...
- webapp利用iscroll实现同时横滚|竖滚
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- windows下tomcat+nginx+openssl配置双向认证
1. 基础知识 CA证书:https://blog.csdn.net/yangyuge1987/article/details/79209473 SSL双向认证原理:https://blog.csdn ...
- rails 辅助方法
rails辅助方法全解: https://ruby-china.github.io/rails-guides/routing.html
- vi三种模式的切换
基础上vi/vim共分为三种模式,分别是命令模式,输入模式和底线命令模式. 一.命令模式 用户刚刚启动vi/vim,便进入了命令模式. 在此状态下敲击键盘动作会被vim识别为命令,而非输入字符.比如我 ...
- 1.2OpenCV如何扫描图像,利用查找表和计时
查找表 颜色缩减法:如果矩阵元素存储的是单通道像素,使用C或C++的无符号字符类型,那么像素可有256个不同值. 但若是三通道图像,这种存储格式的颜色数就太多了(确切地说,有一千六百多万种).用如此之 ...
- poj-1195(二维树状数组)
题目链接:传送门 题意:给出操作,按照操作进行. 思路:将树状数组设置为二维的就行了. 注意: (1)每次求出的面积是S(x2,y2)-S(x1-1,y2)-S(x2,y1-1)+S(x1-1,y1- ...