一.先上代码,网上我查了很多,有两种方法,如下

MapsInitializer.loadWorldGridMap(true);

这个方法我试了,MapsInitializer类找不到这个方法,对于开发者其实还有更简单的方法(亲测不行)。

2.高德地图支持瓦片显示,所以当我们显示国外地址时,只需要在高德地图上添加Google的瓦片即可,开发者也可以使用已经下载好 的瓦片或者自定义的瓦片。

UrlTileProvider tileProvider = new UrlTileProvider(256, 256) {


@Override
public URL getTileUrl(int x, int y, int zoom) {
try {
Random random = new Random();
            String s = String.format("http://mt"+random.nextInt(3)+".google.cn/vt/lyrs=m@142&hl=zh-CN&gl=cn&x=%d&y=%d&z=%d&s=Galil",x,y,zoom);
            return new URL(s);
           } catch (MalformedURLException e) {
               e.printStackTrace();
           }
return null;
}
     };
mAmap.addTileOverlay(new TileOverlayOptions()
                     .tileProvider(tileProvider)
                     .diskCacheEnabled(true)
                     .diskCacheDir("/storage/emulated/0/demo/cache")
                     .diskCacheSize(100000)
                     .memoryCacheEnabled(true)
                     .memCacheSize(100000));



这样直接调用就ok。



详细介绍下上面写法

详细解释下


mt2.google.cn :Google瓦片服务服务器,可以尝试mt1.google.cn依然有效。Google提供多台瓦片服务器,减轻服务器负载,提高网络访问效率。


瓦片的横向索引,起始位置为最左边,数值为0,向右+1递增。

瓦片的纵向索引,起始位置为最上面,数值为0,向下+1递增。

地图的级别Zoom,最上一级为0,向下依次递增。(0~22)

s             (3*x + y)%8 = s 


其它几个参数的含义

1) mt ( 0—3)

.google.cn/......,都可以用。

地图:http://mt2.google.cn/vt/lyrs=m@&hl=zh-CN&gl=cn&x=...

影像底图:http://mt3.google.cn/vt/lyrs=s@110&hl=zh-CN&gl=cn&x=...

影像的叠加:http://mt1.google.cn/vt/imgtp=png32&lyrs=h&hl=zh-CN&gl=cn&x=...

2)lyrs=...

 表示的是图层类型,即瓦片类型,具体含义如下:

  • m:路线图  
  • t:地形图  
  • p:带标签的地形图  
  • s:卫星图  
  • y:带标签的卫星图
  • h:标签层(路名、地名等)  

3) &s=...

&s=..." 的意义,url有无此后缀都不影响瓦片地址的访问。




计算瓦片URL

要想出图就必须知道地图控件可视范围起始点瓦片索引、末尾瓦片索引,中间区域的瓦片索引循环遍历即可得出。

  下面看看如果计算出起始点、末尾瓦片url索引:

  已知:bounds(地图范围[ -20037508.3427892, 20037508.3427892])、viewBounds(地图控件可视范围)、瓦片像素宽高(256)。

:startX(视图起始瓦片X方向索引)、startY(视图起始瓦片Y方向索引)、endX(视图未尾瓦片x方向索引)、endY(视图未尾瓦片y方向索引)。

  求解:

1.zoom

根据当前地图比例尺可求解地图缩放级别zoom和比例尺

static public void GetWebMapZoomAndMapScale(double realScale, ref int zoom, ref long scale)
         {
             long rescaleLong = Convert.ToInt32(realScale);
             int z = 21;
             double min = 0;
             double max = 0;
             for (int i = 0; i < Scales.Length - 1; i++)
             {
                 if (i == 0)
                     min = 0;
                 else
                     min = Scales[i - 1] + ((Scales[i] - Scales[i - 1]) / 2);
                 max = Scales[i] + ((Scales[i + 1] - Scales[i]) / 2);
                 if (realScale > min && realScale <= max)
                 {
                     scale = Scales[i];
                     zoom = z;
                     return;
                 }
                 z--;
             }
             zoom = 0;
             scale = Scales[Scales.Length - 1];
         }

2.Resolution


3.瓦片索引

startX = Math.Floor((viewBounds.leftBottom_x - bounds.leftBottom_x) / Resolution / 256);
 startY = Math.Floor((viewBounds.leftBottom_y - bounds.leftBottom_y) / Resolution / 256);
 endX = Math.Floor((viewBounds.rightTop_x - bounds.rightTop_x) / Resolution / 256);
 endY = Math.Floor((viewBounds.rightTop_y- bounds.rightTop_y) / Resolution / 256);

4.瓦片URL

 

firstTileUrl(起始瓦片Url) = http://**********?x=startX&y=startY&z=zoom;
 endTileUrl(末尾瓦片Url) = http://**********?x=endX&y=startY&z=zoom;

中间部分的url循环遍历即可得出。

5.拼接瓦片

好啦!组成视图所有瓦片的url都已得出。下面就是要解决将这些瓦片放到哪的问题。

startTilePositionX = bounds.leftBottom_x + (startX * 256 * Resolutions);
 startTilePositionY = bounds.rightTop_y + (endY * 256 * Resolutions);//左上角开始
 distanceX = (map_left - startTilePositionX) / Resolutions;//瓦片左边与地图控件左边相距的像素距离
 distanceY = (map_top - startTilePositionY) / Resolutions;//瓦片上边与地图控件上边相距的像素距离

遍历各url地址,获取图片绘制到地图控件的指定位置。