美文网首页androidAndroidandroid
基于Android平台的全球地图方案

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

作者: 天哥在奔跑 | 来源:发表于2017-03-08 22:07 被阅读2340次

    现状

    百度地图、高德地图在国外无法显示详细地面信息或显示不全面,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瓦片后:

    高德地图无法显示国外详细路面信息.png 添加Google瓦片后可以展示路面信息 .png

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

    备注

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

    推荐:

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

    附一张手机随拍图

    冬日的顾村公园.png

    相关文章

      网友评论

      • Yang_Bob:微软的bing地图适合app做么
      • e6a56e3205c8:谷歌三剑客,有用的。
      • 安浪创想:高德地图怎么加谷歌瓦片?我现在要做一个新西兰旅游地图,除了谷歌都不能显示路面和小地名。但是谷歌又不能被国内用户访问,需要翻墙。bing地图不太精确,而且只有WEB API,没有WEB js+Android+iOS这样全面的开发接口。大神有什么解决方法和意见呢?非常感谢
        Yang_Bob:同问,请问有解决办法么
      • a62888a351af:先留着
      • 空空的行囊:总结的很好~
      • 天哥在奔跑:后面继续讲述更详细的做法:smile:

      本文标题:基于Android平台的全球地图方案

      本文链接:https://www.haomeiwen.com/subject/noqigttx.html