客户端地图拼图算法解析

概述:主要是阐述如何将瓦片地图图片拼接成完整地图的一些概念以及相关算法。

基本概念:

      

      现在就是要将一张张这类的地图瓦片,在客户端拼接成一幅完整的地图。

      瓦片大小为:256x256。

      url中关键参数解析:

参数 描述
mt2.google.cn Google瓦片服务服务器,可以尝试mt1.google.cn依然有效。Google提供多台瓦片服务器,减轻服务器负载,提高网络访问效率。
x 瓦片的横向索引,起始位置为最左边,数值为0,向右+1递增。
y 瓦片的纵向索引,起始位置为最上面,数值为0,向下+1递增。
z 地图的级别,以Google为例,最上一级为0,向下依次递增。
  • 地图投影:Web墨卡托——互联网地图通用的地图投影方式,将椭圆形地图投影成平面上的正文形,欲了解详情请baidu之,如无特殊说明本文所指均为Web墨卡托投影下。
  • Bounds(地图范围):[ -20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892],单位为米,20037508.3427892表示地图周长的一半,以地图中心点做为(0,0)坐标。
  • Levels:地图的级别,例如:0……22。
  • Resolutions:分辨率数组,与级别相对应,即一个级别对应一个分辨率,分辨率表示当前级别下单个像素代表的地理长度。
  • Resolutions[n] = 20037508.3427892 * 2 / 256 / (2^n)
    • Center:地图显示中心点。
    • Level:地图显示级别。
    • viewSize:地图控件窗口的大小。

      根据已知地图中心点、显示级别可以将地图显示范围计算出来:

  • viewBounds = [Center.x - Resolutions[l]*viewSize.width/2, Center.y - Resolutions[l]*viewSize.height/2, Center.x + Resolutions[l].viewSize.width/w, Center.y + Resolutions[l].viewSize.height/h]

    地图切图方式:

        一幅地图由4^n个256的正方形组成,n为级别

        例如:第0级为4^0个,即世界地图由一个256图片表示。

        第1级世界地图应由4^1(4)个256图片组成,也就是将世界地图(上一级的单个图片)等分成4块256图片。

        往下每一级依此类推……

    拼图算法剖析:

     1、计算瓦片url

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

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

        已知:l(缩放级别)、bounds(地图范围——[ -20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892])、viewBounds(地图控件可视范围)、分辨率(Resolutions[l])、瓦片像素宽高(256)。

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

        求解:

  • startX = floor(((viewBounds.leftBottom.x - bounds.leftBottom.x) / Resolutions[l]) / 256);
    startY = floor(((viewBounds.leftBottom.y - bounds.leftBottom.y) / Resolutions[l]) / 256);
    endX = floor(((viewBounds.rightTop.x - bounds.rightTop.x) / Resolutions[l]) / 256);
    endY = floor(((viewBounds.rightTop.y - bounds.rightTop.y) / Resolutions[l]) / 256);

    firstTileUrl(起始瓦片Url) = http://**********?x=startX&y=startY&z=l;

        endTileUrl(末尾瓦片Url) = http://**********?x=endX&y=startY&z=l;

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

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

     2、计算瓦片放在地图控件上的位置

      先分析一下:其实只要将起始位置的瓦片像素位置算出来就可以了,由于瓦片像素大小为256,后面的各瓦片位置也就明了了。

      所以这里只探讨一下起始瓦片的像素位置。

        已知:startX(视图起始瓦片X方向索引)、startY(视图起始瓦片Y方向索引)、分辨率(Resolutions[l])、瓦片像素宽高(256)、bounds(地图范围——[ -20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892])、viewBounds(地图控件可视范围)。

        未知:startTileX(起始瓦片左上角X方向地理坐标)、startTileY(起始瓦片左上角Y方向地理坐标)、distanceX(瓦片左边与地图控件左边相距的像素距离)、distanceY(瓦片上边与地图控件上边相距的像素距离)。

        求解:

  • startTileX = bounds.leftBottom.x + (startX * 256 * Resolutions[l]);
    startTileY = bounds.rightTop.y - (startY * 256 * Resolutions[l]);
    distanceX = (viewBounds.leftBottom.x - startTileX) / Resolutions[l];
    distanceY = (startTileY - viewBounds.rightTop.y) / Resolutions[l]

    公式不是最简,以方便理解,相信看官此时已经知道起始瓦片在地图控件中的摆放位置了——设地图控件起始像素位置为(0,0),那么此瓦片的像素的位置就是(-distanceX、-distanceY)。其它瓦片依据256像素宽高的关系依次而出。

    到此已经算出了各瓦片的url以及它们应该摆放的位置,准备工作已完成,直接帖图即可完成出图工作。

    算法可应用于Google、Baidu、Yahoo、Bing等web墨卡托投影的地图瓦片。

原文链接:客户端地图拼图算法解析

原文地址:https://www.cnblogs.com/rainbow70626/p/8654651.html

时间: 2024-10-12 16:44:05

客户端地图拼图算法解析的相关文章

地理围栏算法解析(Geo-fencing)

地理围栏算法解析 http://www.cnblogs.com/LBSer/p/4471742.html 地理围栏(Geo-fencing)是LBS的一种应用,就是用一个虚拟的栅栏围出一个虚拟地理边界,当手机进入.离开某个特定地理区域,或在该区域内活动时,手机可以接收自动通知和警告.如下图所示,假设地图上有三个商场,当用户进入某个商场的时候,手机自动收到相应商场发送的优惠券push消息.地理围栏应用非常广泛,当今移动互联网主要app如美团.大众.手淘等都可看到其应用身影. 图1 地理围栏示意图

区块链~Merkle Tree(默克尔树)算法解析~转载

转载~Merkle Tree(默克尔树)算法解析 /*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所以查了些资料,学习了Merkle Tree的知识,因为接触时间不长,对Merkle Tree的理解也不是很深入,如果有不对的地方,希望各位大神指正*/ Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶节点是

[转]SURF算法解析

SURF算法解析 一.积分图像    积分图像的概念是由Viola和Jones提出的.积分图像中任意一点(i,j)的值为原图像左上角到任意点(i,j)相应的对焦区域的灰度值的总和,其数学公式如图1所示: 那么,当我们想要计算图片一个区域的积分,就只需计算这个区域的四个顶点在积分图像里的值,便可以通过2步加法和2步减法计算得出,其数学公式如下: 二.Hession矩阵探测器1.斑点检测    斑点:与周围有着颜色和灰度差别的区域.    在一个一维信号中,让它和高斯二阶导数进行卷积,也就是拉普拉斯

KMP串匹配算法解析与优化

朴素串匹配算法说明 串匹配算法最常用的情形是从一篇文档中查找指定文本.需要查找的文本叫做模式串,需要从中查找模式串的串暂且叫做查找串吧. 为了更好理解KMP算法,我们先这样看待一下朴素匹配算法吧.朴素串匹配算法是这样的,当模式串的某一位置失配时将失配位置的上一位置与查找串的该位置对齐再从头开始比较模式串的每一个位置.如下图所示. KMP串匹配算法解析 KMP串匹配算法是Knuth-Morris-Pratt算法的简称,KMP算法的思想就是当模式串的某一位置失配时,能不能将更前面的位置与查找串的该位

Android中锁屏密码算法解析以及破解方案

一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机恶意样本.现在的锁机样本原理强制性太过于复杂,没意义.所以本文就先来介绍一下android中的锁屏密码算法原理. 二.锁屏密码方式 我们知道Android中现结单支持的锁屏密码主要有两种: 一种是手势密码,也就是我们常见的九宫格密码图 一种是输入密码,这个也分为PIN密码和复杂字符密码,而PIN密码

Mmseg中文分词算法解析

@author linjiexing 开发中文搜索和中文词库语义自己主动识别的时候,我採用都是基于mmseg中文分词算法开发的Jcseg开源project.使用场景涉及搜索索引创建时的中文分词.新词发现的中文分词.语义词向量空间构建过程的中文分词和文章特征向量提取前的中文分词等,整体使用下来,感觉jcseg是一个非常优秀的开源中文分词工具,并且可配置和开源的情况下,能够满足非常多场景的中文分词逻辑.本文先把jcseg使用到最主要的mmseg算法解析一下. 1. 中文分词算法之争 在分析mmseg

mwc飞控PID算法解析

0.说明 基于mwc2.3的pid算法解析,2.3中增加了一种新的pid算法,在此分别解析. P:比例 I:积分 D:微分 1.老版PID代码 代码大概在MultiWii.cpp的1350行上下. 1 if ( f.HORIZON_MODE ) prop = min(max(abs(rcCommand[PITCH]),abs(rcCommand[ROLL])),512); 2 3 // PITCH & ROLL 4 for(axis = 0; axis < 2; axis++) { 5 rc

装配线调度问题的算法解析和验证

lienhua342014-10-06 1 问题描述 某个汽车工厂共有两条装配线,每条有 n 个装配站.装配线 i 的第 j个装配站表示为 Si,j ,在该站的装配时间为 ai,j .一个汽车底盘进入工厂,然后进入装配线 i(i 为 1 或 2),花费时间为 ei .在通过一条线的第 j 个装配站后,这个底盘来到任一条装配线的第(j+1)个装配站.如果它留在相同的装配线,则没有移动开销.但是,如果它移动到另一条线上,则花费时间为 ti,j .在离开一条装配线的第 n 个装配站后,完成的汽车底盘花

无意中发现了谷歌、腾讯、高德地图纠偏算法

大家知道,天朝的地图都是加偏的,也就是GPS设备接收到的坐标和电子地图坐标是不一样的,有一定的偏移,如果直接把GPS坐标显示到电子地图上,有几百米的误差,必须把GPS坐标加上一定的偏移再显示到电子地图上,才和实际相符,理论上,每种地图偏移量不一样的,且都不是线性的,供应商提供在线的接口,把GPS坐标转换成地图坐标,但算法是保密的,我们可以自己创建纠偏库(参见百度谷歌等地图纠偏库),但部分地方不使用数据库,也不适合网上调用,最合适的办法就是通过算法直接计算,我在网上无意看到了用java写的谷歌地图