美文网首页
高德地图如何接入谷歌碎片实现显示国外地址

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

作者: 贺文轩 | 来源:发表于2017-06-23 14:36 被阅读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地址,获取图片绘制到地图控件的指定位置。

    相关文章

      网友评论

          本文标题:高德地图如何接入谷歌碎片实现显示国外地址

          本文链接:https://www.haomeiwen.com/subject/swyiyttx.html