首先,解决一下上一回那篇文章 iOS Google地图SDK入门教程 中有位同学提出的问题:
经过研究查证,主要有两点可能导致地图显示不出来,第一就是 下载的 SDK 跟注册的 API Key 不配套,不过如果按照教程上面的步骤,基本不会出现这问题。第二,就是 google map 被我大天朝给墙了。
谷歌基本上是被和谐透了,谷歌地图API自然也打不开了,于是 googleMap 都变成空白了…总不能让访客都自己翻墙吧。为了避免打开地图页面显示不出的尴尬情况,只能找一个不开VPN也不被墙的方法。
其实 googleMap 的服务并没有完全被屏蔽,只是我们以前访问的域名 访问不了了。而我们用的 SDK 正是用的这一个。但是 googleMap 还有一个域名: ,这一个却是能正常访问的!
OK,找到了问题所在,那就找到了解决方法。但是通过之前的 SDK 的方法还是不行,我们需要借助 H5 来实现,地图功能由 H5 来提供,因为他们可以把这个 API 给改掉。我们只用 webView 来展示。
这是 google 官方给出的 H5 实现地图的 API :(地址: )
googleMap H5 实现方法
那么只需要让 H5 的兄弟把原来的JS引用地址 替换成 就解决了。
这时候再也不用担心被墙了!关掉 VPN ,运行,立马出来了!
不需要翻墙也能显示
目前这是我亲测成功的一个方案,至于有没有别的更好的可行方案,还有待继续研究。如果有什么好的可行方案,希望各位大神指点。谢谢!
好了!现在进入这一章我们来探讨的问题,上一次我们通过 iOS 跳转方式实现地图导航功能,但是在研究下去,却发现了我大天朝神秘的”火星坐标”。
当我们如果一开始用的 googleMap ,然后跳转到别的地图上,用的同一经纬度,你会发现有时候却跑到了不一样的地方。
位置变了!
这就是因为用的坐标体系不同,发生了偏移。
美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这应该是国际共识。但在我国,出 于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,业内将前者 称之为地球坐标,后者称之为火星坐标。
百度给出的名词解释:
火星坐标系统
是一种国家保密插件,也叫做加密插件或者加偏或者SM模组,其实就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。而加密后的坐标也常被人称为火星坐标系统。
简单点来讲就是:
1、火星地图:坐标加密了的地图。
2、火星坐标:用正确的坐标经过了与火星地图一样的算法偏移后产生的经纬度坐标。
3、地球地图:通常意义上的地图。
4、地球坐标:通常意义上的经纬度坐标。
5、火星坐标+火星地图=地图定位准确。
这个想一下就可以理解,相同的算法偏移后,就能在地图上正确显示定位。
那意思就明了了,我们只要把这个坐标转变过来就可以了!网络上各种各样的方法,但是好像都比较古老,而且很多都是 C++,C语言的,在我们这里却用不了。失望告终!后来从公司老员工那里要了一套,不知道是不是祖传下来的,亲测可用!在这里做个分享,如果有需要地图坐标转换的,不妨试一试。
OK,我们还是新建一个类,继承于 NSObject 就可以了,方便以后也可以用。
然后在这个类的 .h 文件中声明我们需要使用的转换方法:
.h 文件
最后,到 .m 文件中去实现这个方法:
.m 文件
具体代码如下:
#import "WGS84TOGCJ02.h"
const double a = 6378245.0;
const double ee = 0.00669342162296594323;
const double pi = 3.14159265358979324;
@implementation WGS84TOGCJ02
+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc
{
CLLocationCoordinate2D adjustLoc;
double adjustLat = [self transformLatWithX:wgsLoc.longitude - 105.0 withY:wgsLoc.latitude - 35.0];
double adjustLon = [self transformLonWithX:wgsLoc.longitude - 105.0 withY:wgsLoc.latitude - 35.0];
double radLat = wgsLoc.latitude / 180.0 * pi;
double magic = sin(radLat);
magic = 1 - ee * magic * magic;
double sqrtMagic = sqrt(magic);
adjustLat = (adjustLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
adjustLon = (adjustLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi);
adjustLoc.latitude = wgsLoc.latitude + adjustLat;
adjustLoc.longitude = wgsLoc.longitude + adjustLon;
return adjustLoc;
}
+(double)transformLatWithX:(double)x withY:(double)y
{
double lat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(fabs(x));
lat += (20.0 * sin(6.0 * x * pi) + 20.0 *sin(2.0 * x * pi)) * 2.0 / 3.0;
lat += (20.0 * sin(y * pi) + 40.0 * sin(y / 3.0 * pi)) * 2.0 / 3.0;
lat += (160.0 * sin(y / 12.0 * pi) + 320 * sin(y * pi / 30.0)) * 2.0 / 3.0;
return lat;
}
+(double)transformLonWithX:(double)x withY:(double)y
{
double lon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(fabs(x));
lon += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;
lon += (20.0 * sin(x * pi) + 40.0 * sin(x / 3.0 * pi)) * 2.0 / 3.0;
lon += (150.0 * sin(x / 12.0 * pi) + 300.0 * sin(x / 30.0 * pi)) * 2.0 / 3.0;
return lon;
}
@end
好了!然后我们只需要在跳转地图的时候,把这个坐标转换一下就可以了。
转换坐标
转换完实现效果如下:
回到正确的位置了!
网络上很多说还有一个百度坐标
百度坐标 (BD-09)
百度坐标在火星坐标基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。
但我实现了一下,跳转百度地图,用同样的这套转换方法,也是正确的位置。
如果有哪位大神知道其中缘由的,希望帮忙解答一下!