高德地图如何接入谷歌碎片实现显示国外地址

2017-06-23  本文已影响0人  贺文轩

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

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地址,获取图片绘制到地图控件的指定位置。

上一篇下一篇

猜你喜欢

热点阅读