简介

苦逼外业实验需要用到无人机采集数据,遂利用高德地图SDK和DJI Mobile SDK开发了一款无人机航线规划软件。当地也不算偏僻,然而高德卫星地图缩放等级约为16,无法满足作业需求。调查了其他图源,如腾讯地图、百度地图、Bing地图和谷歌地图等,发现Bing和谷歌卫星地图分辨率基本能够满足全国各地的作业需求,而在这两者之中,Bing地图图源较老,最终决定将谷歌卫星地图作为航线规划APP底图之一。

技术路线

查询了安卓加载谷歌地图的相关资料,主要有两种思路:

  1. 直接调用Google Map SDK。由于众所周知的原因,大部分时间都浪费在爬梯子和安装Google play service 上。脑儿疼。调用高程服务还得有次数限制,或是要收费。个人用途APP经费不足,不再考虑该路线。

  2. 使用 osmdroid(open street map)。开源的地图框架,截至2019年8月17日,已经更新到6.1.0版本,而网上的教程多发布于一两年前甚至三四年前,版本号大多在6.0之前,一些接口已经发生变化。考虑到从高德地图移植到osmdroid需要耗费较大精力,且本菜鸡历经多次尝试仍未走通的情况下(瓦片地址没问题,osmdroid加载瓦片没走通),姑且放弃该路线。若有兴趣,请移步至以下博客自行探索。如果实现,欢迎交流! 2020.10.24更新该方案已实现。使用谷歌卫星地图+天地图道路标注,地图缩放层级最高达到22级,无需进行WGS84和GCJ02坐标系之间的转换。POI需自己实现(利用其他平台的逆地理编码工具);某些瓦片会出现未及时刷新或是未及时清理的问题,需自行处理。有空再完善该方案。

      osmdroid 在线加载谷歌瓦片(谷歌地图瓦片地址解释)   https://blog.csdn.net/qq_16064871/article/details/78869326   osmdroid 6.0.1基础测试   https://blog.csdn.net/qq_16064871/article/details/79667834    osmdroid 6.0.1加载天地图在线矢量和影像数据    https://www.2cto.com/kf/201803/728507.html
    
  3. 使用高德地图Android 地图SDK及其中的Tile Overlays类加载谷歌瓦片。参考了谷歌地图官方示例的TileOverlayDemoActivity和osmdroid路线中在线加载谷歌瓦片的方法,发现高德地图SDK中恰巧也有类似的方法,很快走通。本文最终采用了该方法。

实现步骤

  1. 显示高德地图
    参见https://lbs.amap.com/api/android-sdk/guide/create-map/show-map高德地图官方文档。教程十分详细,不再赘述。
  2. 设定地图加载完成的监听,并重写回调函数。关键代码如下:
//谷歌地图瓦片地址格式
String GOOGLE_SATELLITE_URL_FORMAT = "http://mt0.google.cn/vt/lyrs=y@126&hl=zh-CN&gl=cn&x=%d&y=%d&z=%d&s=Galil";
aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() {@Overridepublic void onMapLoaded() {TileProvider tileProvider = new UrlTileProvider(256, 256) {@Overridepublic synchronized URL getTileUrl(int x, int y, int zoom) {String s = String.format(Locale.US, GOOGLE_SATELLITE_URL_FORMAT, x, y, zoom);URL url = null;try {url = new URL(s);} catch (MalformedURLException e) {throw new AssertionError(e);}return url;}};TileOverlay tileOverlay = aMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));}

结果

最终加载结果见图。初步调查显示,地图标注基本正确,同名地物点与高德地图叠置完美、无偏移。国界线基本没有问题,不是最近频繁被点名的问题地图,可放心使用。外业基地位于北纬31.6133437322度,东经119.1605687141度附近,加载了谷歌地图瓦片后完全能够满足作业需求,且只需在高德地图中添加不到20行代码,十分方便。
附:谷歌地图瓦片地址解释

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

1)mt2.google.cn :Google瓦片服务服务器。
Google提供多台瓦片服务器,减轻服务器负载,提高网络访问效率。可以选服务器:
mt0.google.cn mt1.google.cn
mt2.google.cn mt3.google.cn

2)lyrs=… 表示的是图层类型。 m:路线图 t:地形图 ​p:带标签的地形图 ​s:卫星图 y:带标签的卫星图
​h:标签层(路名、地名等,貌似是旅游地图标注)

3)&x=… &y=… &z=… x瓦片的横向索引,起始位置为最左边,数值为0,向右+1递增。
y瓦片的纵向索引,起始位置为最上面,数值为0,向下+1递增。 z地图的级别Zoom,最上一级为0,向下依次递增。(0~22)

4)&s=… 不明,url有无此后缀都不影响瓦片地址的访问。

2020年6月1日

使用高德地图加载谷歌瓦片 targetSdkVersion 需小于等于 26,似乎是http的问题,由于已改用哦OSMdroid,不再深入探究。 有兴趣可尝试将http协议改为https协议,或者在application中设置android:usesCleartextTraffic="true" // 此项设置影响安全

2021年1月12日

新增openStreetMap图源如下:


import com.test.BuildConfig;import org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.tileprovider.tilesource.XYTileSource;
import org.osmdroid.util.MapTileIndex;public class CustomTileSource extends TileSourceFactory {private static final String[] tianDiTuServer = {"https://t0.tianditu.gov.cn","https://t1.tianditu.gov.cn","https://t2.tianditu.gov.cn","https://t3.tianditu.gov.cn","https://t4.tianditu.gov.cn","https://t5.tianditu.gov.cn","https://t6.tianditu.gov.cn","https://t7.tianditu.gov.cn"};private static final String[] googleServer = {"http://mt0.google.cn","http://mt1.google.cn","http://mt2.google.cn","http://mt3.google.cn"};/*** 天地图 影像底图*/public static final OnlineTileSourceBase tianDiTuSatellite = new XYTileSource("tianDiTuSatellite", 1, 18, 256, ".png", tianDiTuServer) {@Overridepublic String getTileURLString(final long pMapTileIndex) {return getBaseUrl() + "/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL=" + MapTileIndex.getX(pMapTileIndex) + "&TILEROW=" + MapTileIndex.getY(pMapTileIndex) + "&TILEMATRIX=" + MapTileIndex.getZoom(pMapTileIndex) + "&tk=" + BuildConfig.tianDiTuToken;}};/*** 天地图 影像注记*/public static final OnlineTileSourceBase tianDiTuSatelliteLabel = new OnlineTileSourceBase("tianDiTuSatelliteLabel", 1, 18, 256, "PNG", tianDiTuServer) {@Overridepublic String getTileURLString(long pMapTileIndex) {return getBaseUrl() + "/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL=" + MapTileIndex.getX(pMapTileIndex) + "&TILEROW=" + MapTileIndex.getY(pMapTileIndex) + "&TILEMATRIX=" + MapTileIndex.getZoom(pMapTileIndex) + "&tk=" + BuildConfig.tianDiTuToken;}};/*** 天地图 矢量底图*/public static final OnlineTileSourceBase tianDiTuVector = new XYTileSource("tianDiTuVector", 1, 18, 256, ".png", tianDiTuServer) {@Overridepublic String getTileURLString(final long pMapTileIndex) {return getBaseUrl() + "/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL=" + MapTileIndex.getX(pMapTileIndex) + "&TILEROW=" + MapTileIndex.getY(pMapTileIndex) + "&TILEMATRIX=" + MapTileIndex.getZoom(pMapTileIndex) + "&tk=" + BuildConfig.tianDiTuToken;}};/*** 天地图 矢量注记*/public static final OnlineTileSourceBase tianDiTuVectorLabel = new OnlineTileSourceBase("tianDiTuVectorLabel", 1, 18, 256, "PNG", tianDiTuServer) {@Overridepublic String getTileURLString(long pMapTileIndex) {return getBaseUrl() + "/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL=" + MapTileIndex.getX(pMapTileIndex) + "&TILEROW=" + MapTileIndex.getY(pMapTileIndex) + "&TILEMATRIX=" + MapTileIndex.getZoom(pMapTileIndex) + "&tk=" + BuildConfig.tianDiTuToken;}};/*** 天地图 地形晕渲*/public static final OnlineTileSourceBase tianDiTuTerrain = new XYTileSource("tianDiTuTerrain", 1, 14, 256, ".png", tianDiTuServer) {@Overridepublic String getTileURLString(final long pMapTileIndex) {return getBaseUrl() + "/ter_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL=" + MapTileIndex.getX(pMapTileIndex) + "&TILEROW=" + MapTileIndex.getY(pMapTileIndex) + "&TILEMATRIX=" + MapTileIndex.getZoom(pMapTileIndex) + "&tk=" + BuildConfig.tianDiTuToken;}};/*** 天地图 地形注记*/public static final OnlineTileSourceBase tianDiTuTerrainLabel = new OnlineTileSourceBase("tianDiTuTerrainLabel", 1, 14, 256, "PNG", tianDiTuServer) {@Overridepublic String getTileURLString(long pMapTileIndex) {return getBaseUrl() + "/cta_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cta&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL=" + MapTileIndex.getX(pMapTileIndex) + "&TILEROW=" + MapTileIndex.getY(pMapTileIndex) + "&TILEMATRIX=" + MapTileIndex.getZoom(pMapTileIndex) + "&tk=" + BuildConfig.tianDiTuToken;}};/*** 天地图 全球境界*/public static final OnlineTileSourceBase tianDiTuBoundary = new OnlineTileSourceBase("tianDiTuBoundary", 1, 18, 256, "PNG", tianDiTuServer) {@Overridepublic String getTileURLString(long pMapTileIndex) {return getBaseUrl() + "/ibo_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ibo&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL=" + MapTileIndex.getX(pMapTileIndex) + "&TILEROW=" + MapTileIndex.getY(pMapTileIndex) + "&TILEMATRIX=" + MapTileIndex.getZoom(pMapTileIndex) + "&tk=" + BuildConfig.tianDiTuToken;}};/*** 谷歌卫星地图 影像底图*/public static final OnlineTileSourceBase GoogleSatellite = new XYTileSource("GoogleSatellite", 0, 20, 256, ".png", googleServer) {@Overridepublic String getTileURLString(long pMapTileIndex) {return getBaseUrl() + "/vt/lyrs=s&scale=2&x=" + MapTileIndex.getX(pMapTileIndex) + "&y=" + MapTileIndex.getY(pMapTileIndex) + "&z=" + MapTileIndex.getZoom(pMapTileIndex);}};/*** 谷歌地形带标注*/public static final OnlineTileSourceBase GoogleTerrainHybrid = new XYTileSource("Google-Terrain-Hybrid", 0, 20, 512, ".png", googleServer) {@Overridepublic String getTileURLString(long pMapTileIndex) {return getBaseUrl() + "/vt/lyrs=p&scale=2&hl=zh-CN&gl=CN&src=app&x=" + MapTileIndex.getX(pMapTileIndex) + "&y=" + MapTileIndex.getY(pMapTileIndex) + "&z=" + MapTileIndex.getZoom(pMapTileIndex);}};}

2021年8月18日

高德地图中使用天地图
最简单粗暴的方案:按上述方法加载天地图瓦片,并隐藏或遮盖高德地图图源。根据实际需要进行坐标转换。

2021年8月24日

新方案:使用华为地图SDK+天地图

2022年6月28日

补充地形晕染图地址地形晕染图来源
地形图瓦片地址格式为 https://p1.map.gtimg.com/demTiles/{z}/{x>>4}/{((1<<level)-y)>>4}/{x}_{y}.jpg

高德地图加载谷歌地图瓦片相关推荐

  1. python下载谷歌地图瓦片_openLayers TMS加载谷歌地图瓦片

    openLayers  TMS中加载谷歌瓦片  经纬坐标(LonLat) 和投影坐标系的转换 /** openLayer根据TMS加载谷歌地图瓦片 (1)先去下载加载谷歌地图瓦片,这样的软件有(水经注 ...

  2. Android基于高德地图加载自定义网络瓦片(使用geoserver)

    公司开发项目使用自己的地图瓦片,由于前端前期使用geoserver,调研后发现高德地图有加载自定义网络瓦片的功能. public class MyTileProvider extends UrlTil ...

  3. 2023亲测|奥维互动地图加载谷歌地图等图源及绝美效果展示 带女神去绝美的美景喝杯咖啡吧

    带女神去绝美的美景喝杯咖啡吧,通过奥维跨平台地图浏览器,支持iOS(iPhone.iPad).Android.Windows.macOS.Linux等流行平台. 拥有强大的设计功能与地理信息展现技术, ...

  4. 2022年1月27日亲测|奥维互动地图加载谷歌地图等图源的方法

    图源下载地址:https://wwp.lanzouq.com/iOC0xy7ejji 图源下载好,电脑解压一下,然后拉到电脑奥维里就会提示添加,然后点击添加,自定义里就有了 手机直接发送到手机Q,或者 ...

  5. ios 高德地图加载瓦片地图_OpenLayers加载谷歌地球离线瓦片地图

    本文使用OpenLayers最新版本V5.3.0演示:如何使用OpenLayer加载谷歌地球离线瓦片地图.OpenLayers 5.3.0下载地址为:https://github.com/openla ...

  6. android高德地图瓦片,高德地图加载瓦片分析

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? ##了解瓦片地图 瓦片地图:瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的 ...

  7. osmdroid 在线加载谷歌瓦片(谷歌地图瓦片地址解释)

    osmdroid作为一个开源的项目,在在线地图上还是做的不错,离线地图上也能支持多种格式,例如:zip,sqlite,.mbtiles,gemf,map,gpkg等格式.就是不能直接加载shp文件大为 ...

  8. vue使用高德地图加载kml文件

    在使用 Vue 的项目中使用高德地图加载 kml 文件,你可以这么做: 在高德地图官网上注册开发者账号并申请应用密钥. 在项目中安装高德地图的 JavaScript API,你可以直接在 HTML 文 ...

  9. Openlayers之加载谷歌地图

    1.谷歌地图瓦片构成 我们用浏览器打开谷歌地图,然后按下F12键,查看网络资源中的地图瓦片,可以发现瓦片URL中变化的部分为1i.2i和3i后面的数字,经过分析可以知道1i后面的应该是瓦片的级别,2i ...

最新文章

  1. Application Loader:上传卡在App Store正在通过iTunes Store鉴定
  2. mysql备份和还原数据库
  3. Python学习之路:函数参数及调用
  4. javascript html dom,javascript 操作 HTML DOM
  5. Apache开启Gzip压缩设置(转)
  6. LeetCode 345. Reverse Vowels of a String
  7. MATLAB说文本命令超过,MATLAB基础
  8. django为Form生成的label标签添加class
  9. 【bzoj4897】[Thu Summer Camp2016]成绩单 区间dp
  10. oracle替换字符串replace
  11. 内存的管理方式有哪些
  12. html动态生成tr标签,JS动态添加tr元素
  13. java append函数_请详细说一下java中append()的方法.
  14. 特征偏度和异常值处理
  15. 好书收藏:读书知多少
  16. freeswitch部署及网关调试
  17. 2017全球智慧城市战略指数分析
  18. 握手,交流从掌心开始
  19. Restful风格的URL请求
  20. 核磁共振成像读片指南(二)

热门文章

  1. Sony电视投屏 Android,怎样把手机画面投影到电视上观看 乐播投屏使用方法
  2. QQ互联登录- 前端为 vue.js
  3. 2022最新 wifi大师小程序独立版3.0.8
  4. 鹏哥C语言笔记分享P2
  5. 想入门自学编程,应该怎么开始?
  6. 【备战春招/秋招系列】美团Java面经总结终结篇 (附详解答案)
  7. 数学建模优化和仿真模拟的区别001
  8. bne 1b什么意思
  9. oracle 字符串中数字转中文大写,金额钱数转中文大写
  10. POI导出word文件中表格合并方法(行合并,列合并)