本文主要介绍自定义扩展图层加载高德/百度/腾讯等切片底图并缓存
概述
上篇文章介绍了自定义扩展图层加载天地图并缓存,由于众所周知的原因,天地图并不一定能满足所有项目需要,并不一定符合实际国情。
所以这篇文章介绍自定义扩展图层加载 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
为啥谷歌地图加载出来是上下错位的?
现在ArcGis for Android 的 SDK 更新到 100.3.0版本了,arcgis-android-moremap库应该怎么过渡到这个版本?
可以参考我的上篇文章 https://www.wshunli.com/posts/eeb67a5.html ,这里还没有来得及修改
没明白,使用场景呢?
主要是用于 ArcGIS for Android 开发,拿它们做底图用呢