一.先上代码,网上我查了很多,有两种方法,如下
1.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。
详细介绍下上面写法
地图瓦片地址:http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=420&y=193&z=9&s=Galil
详细解释下
mt2.google.cn :Google瓦片服务服务器,可以尝试mt1.google.cn依然有效。Google提供多台瓦片服务器,减轻服务器负载,提高网络访问效率。
x瓦片的横向索引,起始位置为最左边,数值为0,向右+1递增。
y瓦片的纵向索引,起始位置为最上面,数值为0,向下+1递增。
z地图的级别Zoom,最上一级为0,向下依次递增。(0~22)
s (3*x + y)%8 = s
x , y , z 组合后与 8 求余即可得到 s 的值。
其它几个参数的含义
1)mt ( 0—3)
Google 地图使用了四个服务地址,即 http://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
Resolution = 20037508.3427892 * 2 / 256 / (Math.Pow(2,zoom));
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地址,获取图片绘制到地图控件的指定位置。