上一篇也说到瓦片,我们为什么使用瓦片?这一篇主要是关于如何拼接地图?

下面的一张图,可以一眼明了,地图是如何切割以及拼接的。

瓦片信息

瓦片信息包括切图原点,瓦片大小,格式,分辨率以及分辨率级别等。

切图原点,一般是整个坐标系的最左上角,比如说,web墨卡托是[-20037508.3427892, 20037508.3427892]。切图原点右侧列数是正数,左侧的列数是负数,下侧行数是正数,上侧行数是负数。

瓦片的宽度、高度,目前互联网最常见的瓦片宽度和高度都是256像素。

瓦片格式,可能是png,jpg等。

分辨率,这里不是指电脑的分辨率。而这里意思是一像素代表多少米,类似于比例尺。

分辨率级别,含有若干级别的分辨率,不同的分辨率下面,显示不同的要素信息。例如,低分辨率下面,显示洲名称和海洋名称。中分辨率下面,显示省名。高分辨率下面,就显示POI信息。互联网企业当中分辨率级别数在20上下。

地图范围,切图的范围,只在这个范围下面才切图,其他的区域都没有相应的瓦片。如果把所有的分辨率都切完的话,是非常耗时间的。仅仅是中国区域,一台8核的机器,也得需要一个月才能切完,更何况全世界了。

Google为例

谷歌使用的web墨卡托投影,分辨率级别一共22级,他的每一级分辨率大小20037508.3427892*2/(256*(2^i))。20037508.3427892*2代表整个的X轴范围,256代表图片的像素大小,2代表是0级时有两列(有的地图0级只有1列,这个时候就是2^(i-1)),i代表级别。

这个时候,分辨率集合就是[78271.51696402031, 39135.758482010155, 19567.879241005077, 9783.939620502539, 4891.969810251269, 2445.9849051256347, 1222.9924525628173, 611.4962262814087, 305.74811314070433, 152.87405657035217, 76.43702828517608, 38.21851414258804, 19.10925707129402, 9.55462853564701, 4.777314267823505, 2.3886571339117526, 1.1943285669558763, 0.5971642834779382, 0.2985821417389691, 0.14929107086948454, 0.07464553543474227, 0.037322767717371134]。

我们现在需要计算两个东东,一个是当前分辨率下面最大的行和列数,第二个某一个坐标在第几行几列。下面会列出好几个公式,一定要理解为什么这么计算,否则移植到其他的切图服务不会自己列出相应的公式了。

最大行数和列数

计算公式,20037508.3427892*2/(256*scale),20037508.3427892*2代表X轴和Y轴范围,256代表图片的像素大小,scale代表分辨率大小。

通过这个计算公式,我们知道最大的行数和列数,是[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304],注意的是行列值是从0开始的。

比如说,1级下面,有两行和两列。这四张图片的地址如下:

我们把这四张图片合在一起的话,就变成如下的图,这就是一个世界的地图了。

计算行,列位置

计算行位置公式:Math.floor((x-(-20037508.3427892))/256/scale))。x-(-20037508.3427892)是最左侧的距离,scale分辨率,256代表宽度。Math.floor小于或等于指定数字的最大整数,这样值是从0开始的。

计算列位置公式:Math.floor((20037508.3427892-y)/256/scale))。20037508.3427892-y是到最上侧的距离,scale分辨率,256代表宽度。Math.floor小于或等于指定数字的最大整数,这样值是从0开始的。

左上角是X值最小,Y值最大。屏幕是X和Y值都是最小的。这一点转换关系需要明白,否则Y轴的方向都反了。

如果切图不是从左上角开始的,就得计算每一个分辨率下面的左上角和右下角所处的行和列,就可以知道行和列的范围。同理,可计算当前可视区域的行和列。

我们如果知道行列以及分辨率等级,就很容易知道这个瓦片的地址。http://mt2.google.cn/vt/x=0&y=0&z=1,这里的x代表参数行数,y代表列数,z代表分辨率等级。

Google这种图片地址属于非常好计算,幸好也是非常普遍的。比较难的,算是微软的,行列以及分辨率等级计算都差不多,难的是想x,y,z参数不知道怎么计算的。

例如,http://ak.dynamic.t2.tiles.virtualearth.net/comp/ch/1232?mkt=en-us&it=G,VE,BX,L,LA&shading=hill&og=31&n=z,这个图片地址,这个1232不知道怎么来的。不过幸好找到一个论文才弄明白,《利用BingMaps地图切片实现网络地图服务》,地址http://wenku.baidu.com/link?url=7Mh7h8Vn94V2ha8LJLIy3WF2ONjLwcEaRCywujCR-fk4Pa-PGKrmcKL1zBaOmUK5eDmaIrXbO6SyAPdMHCOAXTn6PnhqBsL6yPsenWdMkfK

我下面列出相关计算代码。

function getBingMapsImageNumber(x,y,z){
//10进制转化为2进制,前面补充0
_f=function(n,m){
var t= n.toString(2)+"";
for(; t.length<m;){
t="0"+t;
}
return t;
}
var _if=_f(x,z);
var _jf=_f(y,z);
var r="";
for(var k=0;k!=z;++k){
r+=_jf[k]+_if[k];
}
r=parseInt(r,2).toString(4);
return _f(r,z);
}

  

使用HTML5 canvas做地图(2)瓦片以及如何计算的的更多相关文章

  1. 使用HTML5 canvas做地图(1)基础知识

    之前一直想使用HTML5技术全新做一套地图API,可是苦于时间和精力,迟迟未有行动.后来下定决心,利用下班和周末做出一个大体框架出来,现在和网友分享一下自己的整体的一个思路和想法.欢迎大家提出宝贵建议 ...

  2. 使用HTML5 canvas做地图(3)图片加载平移放大缩小

    终于开始可以写代码了,手都开始痒了.这里的代码仅仅是在chrome检测过,我可以肯定的是IE10以下浏览器是行不通,我一直在考虑,是不是使用IE禁止看我的篇博客,就是这群使用IE的人,给我加了很多工作 ...

  3. html5 canvas做的图表插件

    用highchart的时候发现它是用svg来画图的,那么用canvas来做怎么样的. 以前做AS图表插件的时候,绘制图画主要用容器的Graphics对象来绘制,而canvas的context和Grap ...

  4. 用HTML5 Canvas 做擦除及扩散效果

    2013年的时候曾经使用canvas实现了一个擦除效果的需求,即模拟用户在模糊的玻璃上擦除水雾看到清晰景色的交互效果.好在2012年的时候学习HTML5的时候研究过canvas了,所以在比较短的时间内 ...

  5. 用HTML5 Canvas做一个画图板

    使用HTML5可以非常简单地在canvas上实现画图应用,用支持html5的浏览器便可在下面的区域进行绘画,要看到演示效果,请确保你的浏览器支持HTML5: 功能很简单,原理其实和拖放是类似的,主要是 ...

  6. 用HTML5 CANVAS做自定义路径的动态效果图片!

    最近对HTML5开始感兴趣了,实现的效果如下图,大家可以从代码里换掉图片 我用的是canvas里面的2d绘图,其中上图的路径是网上在线绘制的,我太懒了,哈哈 下面是网址: http://www.vic ...

  7. 【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不 ...

  8. 一起用HTML5 canvas做一个简单又骚气的粒子引擎

    前言 好吧,说是"粒子引擎"还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看demo 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单 ...

  9. 使用HTML5 Canvas做些什么

    百分比圆环进度条   // ----------------------------------------------------------- 柱状排行榜统计图   // ------------ ...

随机推荐

  1. SpringCloud文章

    ZUUL路由服务遇到的坑:https://www.jianshu.com/p/2af5171fa2f3 springcloud----Zuul动态路由:https://blog.csdn.net/u0 ...

  2. JS 方法注入 attachEvent

    写法1: <html> <head> <title></title> <script language="javascript" ...

  3. 5A - Matrix

    #include <iostream> using namespace std; int n, m, q; struct node { int v; // 节点权值 int r; // 右 ...

  4. nginx关闭默认站点/空主机头(禁止IP直接访问、防止域名恶意解析)

    监控时做了负载均衡,所以只能让nginx指定域名访问,那我们就可以防止因为域名不对跳到默认的页面去. curl  -I   -H  “host:域名”   --include   https://19 ...

  5. c#Udp分包组包方法

    udp通信协议,相信大家都知道这个.由于是无连接的协议,所有udp的传输效率比tcp高.但是udp协议传输较大的数据文件得分包 最近写了个分包组包的方法,拿来和大家分享,如果有什么不妥的地方,欢迎点评 ...

  6. JUnit学习之hamcrest、testSuite介绍及测试原则

    [转自] http://huihai.iteye.com/blog/1994270 上一节说了junit的一些基本概念,主要使用assert做一些基本的判断.但很多时候使用assert做判断,并不方便 ...

  7. hdu-1702-栈和队列

    ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  8. windos下redis服务的后台启动

    1. 进入 DOS窗口 2. 在进入Redis的安装目录 3. 输入:redis-server --service-install redis.windows.conf --loglevel verb ...

  9. TCP协议三次握手、四次挥手过程

    本文通过图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图1所示,给出了TCP通信过程的示意图. 上图主要包括三部分:建立连接.传输数 ...

  10. Python归纳 | 爬虫基础知识

    1. urllib模块库 Urllib是python内置的HTTP请求库,urllib标准库一共包含以下子包: urllib.error 由urllib.request引发的异常类 urllib.pa ...