《ArcGIS Runtime SDK for Android学习笔记》-11、自定义扩展图层加载Google地图/高德地图并缓存

wshunli
2017-03-03 / 5 评论 / 1,403 阅读 / 正在检测是否收录...

本文主要介绍自定义扩展图层加载高德/百度/腾讯等切片底图并缓存

概述

上篇文章介绍了自定义扩展图层加载天地图并缓存,由于众所周知的原因,天地图并不一定能满足所有项目需要,并不一定符合实际国情。

所以这篇文章介绍自定义扩展图层加载 Google地图/高德地图,因为 Google 地图/ 高德地图的坐标系比较符合 “中国特色坐标系” 。事实上加载 Google 地图/高德地图和加载天地图类似,甚至前者还要更简单。

阅读本文前建议先阅读 https://www.wshunli.com/posts/eeb67a5.html

本文源码:https://github.com/wshunli/arcgis-android-moremap

依赖添加及使用

1、搭建 ArcGIS for Android 环境

这部分内容在前面有详细的介绍 https://www.wshunli.com/posts/29ec97b7.html

2、添加 arcgis-android-moremap 依赖

arcgis-android-moremap 已经发布至 jcenter ,确定项目已配置 jcenter 仓库即可。

repositories {
    jcenter()
}
    // 添加 arcgis-android-moremap 依赖
dependencies {
    implementation 'com.wshunli.map:arcgis-android-moremap:1.0.1'
}

3、快速入门

MapView mMapView = (MapView) findViewById(R.id.map);
mMapView.addLayer(new MoreMapLayer(MoreMapLayerTypes.AMAP_VECTOR));

缓存切片图层,指定缓存路径即可缓存切片:

MapView mMapView = (MapView) findViewById(R.id.map);
String cachePath = Environment.getExternalStorageDirectory().getAbsoluteFile() + "/MoreMapCache";
MoreMapLayer vec_c = new MoreMapLayer(MoreMapLayerTypes.AMAP_VECTOR, cachePath);
mMapView.addLayer(vec_c);

4、支持图层,指定 MoreMapLayerTypes 即可。

高德地图

  • AMAP_VECTOR、高德矢量图层(含路网,含注记)
  • AMAP_IMAGE、高德影像图层(不含路网,不含注记)
  • AMAP_ROAD、高德路网图层(含路网,含注记)
  • AMAP_TRAFFIC、高德实时交通图层

百度地图

  • BAIDU_MAP_VECTOR、百度矢量图层(含路网,含注记)
  • BAIDU_MAP_IMAGE、百度影像图层(不含路网,不含注记)
  • BAIDU_MAP_ROAD、百度路网图层(含路网,含注记)
  • BAIDU_MAP_TRAFFIC、百度实时交通图层

腾讯地图

  • TENCENT_MAP_VECTOR、腾讯矢量图层(含路网,含注记)
  • TENCENT_MAP_VECTOR_NIGHT、腾讯矢量图层(夜间,含路网,含注记)
  • TENCENT_MAP_IMAGE、腾讯影像图层(不含路网,不含注记)
  • TENCENT_MAP_TERRAIN、腾讯地形图层(不含路网,不含注记)
  • TENCENT_MAP_ROAD 、腾讯路网图层(含路网,含注记)

谷歌地图

  • GOOGLE_MAP_VECTOR、谷歌矢量地图服务
  • GOOGLE_MAP_IMAGE、谷歌影像地图服务
  • GOOGLE_MAP_TERRAIN、谷歌地形地图服务

源码分析

谷歌底图

瓦片地址:

http://mt2.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&x=420&y=193&z=9

核心代码如下:

@Override
protected byte[] getTile(int level, int col, int row) throws Exception {

    if (level > layerInfo.getMaxZoomLevel() || level < layerInfo.getMinZoomLevel()) {
        return new byte[0];
    }

    byte[] bytes = null;
    if (cachePath != null)
        bytes = getOfflineCacheFile(cachePath, level, col, row);
    if (bytes == null) {
        String url = "http://mt" + (col % 4) + ".google.cn/vt/lyrs="
                + layerInfo.getLayerName() + "&hl=zh-CN&gl=cn&"
                + "x=" + col + "&" + "y=" + row + "&" + "z=" + level;

        Log.d("GoogleMapLayer", "getTile: " + url);
        Map<String, String> map = null;
        bytes = com.esri.core.internal.io.handler.a.a(url, map);
        if (cachePath != null)
            AddOfflineCacheFile(cachePath, level, col, row, bytes);
    }


    return bytes;

}

其中

String url = "http://mt" + (col % 4) + ".google.cn/vt/lyrs="
                    + layerInfo.getLayerName() + "&hl=zh-CN&gl=cn&"
                    + "x=" + col + "&" + "y=" + row + "&" + "z=" + level;

可以更改为

String url = "https://mt" + (col % 4) + ".google.com/vt/lyrs="
                    + layerInfo.getLayerName() + "&hl=zh-CN&gl=cn&"
                    + "x=" + col + "&" + "y=" + row + "&" + "z=" + level;

但是这个 URL 不太符合目前的中国的国情,会出现网络问题。

高德地图

瓦片地址:

http://webst01.is.autonavi.com/appmaptile?style=6&x=13417&y=6499&z=14

核心代码如下:

@Override
protected byte[] getTile(int level, int col, int row) throws Exception {
    if (level > layerInfo.getMaxZoomLevel() || level < layerInfo.getMinZoomLevel()) {
        return new byte[0];
    }

    byte[] bytes = null;
    if (cachePath != null)
        bytes = getOfflineCacheFile(cachePath, level, col, row);
    if (bytes == null) {

        String url = "http://webst0" + ((col + row) % 4 + 1) + ".is.autonavi.com/appmaptile?style="
                + layerInfo.getLayerName()
                + "&x=" + col + "&y=" + row + "&z=" + level;
        Map<String, String> map = null;
        bytes = com.esri.core.internal.io.handler.a.a(url, map);
        if (cachePath != null)
            AddOfflineCacheFile(cachePath, level, col, row, bytes);
    }


    return bytes;
}

高德地图还可以获取路况信息:

http://history.traffic.amap.com/traffic?type=2&day=7&hh=11&mm=0&x=13417&y=6499&z=14

道理是一样的。

最后欢迎 star 或者提交 PR 到本仓库。

https://github.com/wshunli/arcgis-android-moremap

参考资料
1、ArcGIS For Android 使用谷歌地图服务 - 牧羊的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/u014014578/article/details/21476395
2、客户端地图拼图算法解析 - 九毫 - 博客园
http://www.cnblogs.com/ninemilli/archive/2011/12/26/2289285.html
3、OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS) - 可可西 - 博客园
http://www.cnblogs.com/kekec/p/3159970.html
4、国内主要地图瓦片坐标系定义及计算原理 | CntChen Blog
http://cntchen.github.io/2016/05/09/国内主要地图瓦片坐标系定义及计算原理/
5、Arcgis for js加载百度地图 - LZUGIS - 博客频道 - CSDN.NET
http://blog.csdn.net/gisshixisheng/article/details/44853709
6、jxsapp/ArcGis_moka: arcgis Android 加载 Google 地图 相关工具包
https://github.com/jxsapp/ArcGis_moka
7、ArcGIS Javascript API 加载高德在线地图扩展 - ThinkGIS
http://www.thinkgis.cn/topic/55bed4f76edd0d1a1d9f44cf

0

评论 (5)

取消
  1. 头像
    Anonymous
    Windows 10 · Google Chrome

    为啥谷歌地图加载出来是上下错位的?

    回复
  2. 头像
    Anonymous
    Windows 10 · QQ Browser

    现在ArcGis for Android 的 SDK 更新到 100.3.0版本了,arcgis-android-moremap库应该怎么过渡到这个版本?

    回复
    1. 头像
      wshunli 作者
      Windows 10 · Google Chrome
      @ Anonymous

      可以参考我的上篇文章 https://www.wshunli.com/posts/eeb67a5.html ,这里还没有来得及修改

      回复
  3. 头像
    Anonymous
    Windows 7 · Google Chrome

    没明白,使用场景呢?

    回复
    1. 头像
      wshunli 作者
      Windows 10 · Google Chrome
      @ Anonymous

      主要是用于 ArcGIS for Android 开发,拿它们做底图用呢

      回复