基于Android平台的全球地图方案

现状

百度地图、高德地图在国外无法显示详细地面信息或显示不全面,Google Map在国内不好使。

需求

根据坐标在地图上显示位置,无论国内国外都要正常显示。

由于旅游公司一般都会有地图显示,所以笔者针对OTA行业的几款应用进行了调研,调研结果都是从App的展示现象总结的,未必是实际情况。

市场上部分OTA应用的地图使用情况

  • 携程
    Android 国内城市:百度地图;国际城市:Google地图(非地图控件,而是WebView访问自己站点网页)
    iOS 国内城市:高德地图;国际城市:Google地图(非地图控件,而是WebView访问自己站点网页)
  • 蚂蜂窝
    Android/iOS 国内城市:高德地图;国际城市:高德地图(当地图缩放到某个层级时,高德无法绘制更具体的地面信息,但高德提供了相关的API,可以在地图上覆盖Google瓦片,也就是可以通过Google地图展示更具体的信息)
  • 驴妈妈
    Android/iOS 国内城市:百度地图;国际城市:不显示地图(提示“无法获取地理位置信息”)

坐标类型及偏差范围

WGS-84 GCJ-02 bd-09/bd-09ll
原始坐标,国际上采用的地心坐标系,GPS拿到的原始经纬度数据,国内不允许直接使用该坐标; “火星坐标系”,由WGS-84加密而来,高德和Google在国内使用GCJ-02坐标; 百度坐标,在GCJ-02基础上再次加密;

如果把百度的坐标直接显示到高德或者谷歌地图上,肯定会有所偏差,因为他们使用的坐标类型不同,同理,高德坐标也不能直接显示到百度地图上,经过多组数据的比较,百度、高德和Google的经纬度偏差如下:

高德和Google 百度和高德/Google
<0.00001度(小于1米) <0.01度(小于1000米)

坐标转换

百度和高德都提供了将其他坐标类型转换为各自的坐标类型;
转为百度坐标:
百度提供:将google地图、soso地图、aliyun地图、mapabc地图和amap地图以及GPS所采集的坐标转换为百度坐标。参照地址

// 将google地图、soso地图、aliyun地图、mapabc地图和amap地图// 所用坐标转换成百度坐标 
CoordinateConverter converter  = new CoordinateConverter(); 
converter.from(CoordType.COMMON); 
// sourceLatLng待转换坐标 
converter.coord(sourceLatLng); 
LatLng desLatLng = converter.convert(); 
  
// 将GPS设备采集的原始GPS坐标转换成百度坐标 
CoordinateConverter converter  = new CoordinateConverter(); 
converter.from(CoordType.GPS); 
// sourceLatLng待转换坐标 
converter.coord(sourceLatLng); 
LatLng desLatLng = converter.convert();

转为高德坐标:
高德提供:支持GPS/Mapbar/Baidu等多种类型坐标在高德地图上使用。参见类CoordinateConverter。参照地址

CoordinateConverter converter  = new CoordinateConverter();
// CoordType.GPS 待转换坐标类型
converter.from(CoordType.GPS);
// sourceLatLng待转换坐标点 LatLng类型
converter.coord(sourceLatLng);
// 执行转换操作
LatLng desLatLng = converter.convert();

在百度和高德的“Web服务API”中也有相关坐标转换接口:
百度Web服务API转换接口
高德Web服务API转换接口

如何根据经纬度判断国内还是国外

以高德地图举例:
CoordinateConverter类提供的isAMapDataAvailable(double latitude,double longitude)接口可以用来判断指定位置是否在大陆以及港、澳地区。参照地址

CoordinateConverter converter  = new CoordinateConverter(); 
//返回true代表当前位置在大陆、港澳地区,反之不在。
boolean isAMapDataAvailable = converter.isAMapDataAvailable(latitude,longitude);
//第一个参数为纬度,第二个为经度,纬度和经度均为高德坐标系。

方案参考

  1. 高德地图:国内高德可正常显示,国外可用高德添加Google瓦片;
  2. 百度地图、高德地图:国内使用百度地图,国外使用高德添加Google瓦片
  3. 百度地图、高德地图、Google地图:国内使用百度地图,国外 if (可以ping通Google && 手机安装了Google Play Service) {Google地图} else {高德地图结合Google瓦片};

Google地图有两个必要条件:

  1. 手机安装了Google Play Service应用(国产机一般都阉割了吧)
  2. 可以访Google。

什么是瓦片?见下图,图1该区域高德无法展示具体地面信息,图2添加Google瓦片后:

基于Android平台的全球地图方案_第1张图片
高德地图无法显示国外详细路面信息.png
基于Android平台的全球地图方案_第2张图片
添加Google瓦片后可以展示路面信息 .png

之前一直在某博客,最近接触到,今天第一次尝试,如果下次还高兴来的话,就写一下高德地图百度地图的具体用法。

备注

百度地图开放平台地址
高德地图开放平台地址
Google地图开发者地址

推荐:

Android开发视频教程(Java版 | 2017年最新录制)

基于Android平台的全球地图方案_第3张图片
关注我的公众号,惊喜更多

你可能感兴趣的:(基于Android平台的全球地图方案)