使用HTML5 canvas做地图(2)瓦片以及如何计算的
上一篇也说到瓦片,我们为什么使用瓦片?这一篇主要是关于如何拼接地图?
下面的一张图,可以一眼明了,地图是如何切割以及拼接的。

|
瓦片信息 |
瓦片信息包括切图原点,瓦片大小,格式,分辨率以及分辨率级别等。
切图原点,一般是整个坐标系的最左上角,比如说,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)瓦片以及如何计算的的更多相关文章
- 使用HTML5 canvas做地图(1)基础知识
之前一直想使用HTML5技术全新做一套地图API,可是苦于时间和精力,迟迟未有行动.后来下定决心,利用下班和周末做出一个大体框架出来,现在和网友分享一下自己的整体的一个思路和想法.欢迎大家提出宝贵建议 ...
- 使用HTML5 canvas做地图(3)图片加载平移放大缩小
终于开始可以写代码了,手都开始痒了.这里的代码仅仅是在chrome检测过,我可以肯定的是IE10以下浏览器是行不通,我一直在考虑,是不是使用IE禁止看我的篇博客,就是这群使用IE的人,给我加了很多工作 ...
- html5 canvas做的图表插件
用highchart的时候发现它是用svg来画图的,那么用canvas来做怎么样的. 以前做AS图表插件的时候,绘制图画主要用容器的Graphics对象来绘制,而canvas的context和Grap ...
- 用HTML5 Canvas 做擦除及扩散效果
2013年的时候曾经使用canvas实现了一个擦除效果的需求,即模拟用户在模糊的玻璃上擦除水雾看到清晰景色的交互效果.好在2012年的时候学习HTML5的时候研究过canvas了,所以在比较短的时间内 ...
- 用HTML5 Canvas做一个画图板
使用HTML5可以非常简单地在canvas上实现画图应用,用支持html5的浏览器便可在下面的区域进行绘画,要看到演示效果,请确保你的浏览器支持HTML5: 功能很简单,原理其实和拖放是类似的,主要是 ...
- 用HTML5 CANVAS做自定义路径的动态效果图片!
最近对HTML5开始感兴趣了,实现的效果如下图,大家可以从代码里换掉图片 我用的是canvas里面的2d绘图,其中上图的路径是网上在线绘制的,我太懒了,哈哈 下面是网址: http://www.vic ...
- 【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不 ...
- 一起用HTML5 canvas做一个简单又骚气的粒子引擎
前言 好吧,说是"粒子引擎"还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看demo 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单 ...
- 使用HTML5 Canvas做些什么
百分比圆环进度条 // ----------------------------------------------------------- 柱状排行榜统计图 // ------------ ...
随机推荐
- Ubuntu上使用systemd创建服务文件来启动和监视底层网络应用程序实现守护进程
在Linux上使用Nginx设置ASP.NET Core的托管环境,并部署到它 创建服务文件 创建服务定义文件: sudo vim /etc/systemd/system/kestrel-basic. ...
- 用qt creator创建可继承ui类
https://jingyan.baidu.com/article/5d368d1efa2dd73f60c05786.html 用qt creator创建可继承ui类 听语音 | 浏览:1657 | ...
- Qt 学习之路 2(70):进程间通信
Qt 学习之路 2(70):进程间通信 豆子 2013年11月12日 Qt 学习之路 2 16条评论 上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的 ...
- CSS column 布局总结
有时候 第一列 底部会跑到顶部那里一部分.这时候应该这样. 在 每个 div前加上 display:inline-block
- windows 下 redis 安装
百度下载 windows 版本 的 redis... 解压 安装为windows服务 安装命令: redis-server.exe --service-install redis.windows.co ...
- POJ_1456 Supermarket 【并查集/贪心】
一.题面 POJ1456 二.分析 1.贪心策略:先保证从利润最大的开始判断,然后开一个标记时间是否能访问的数组,时间尽量从最大的时间开始选择,这样能够保证后面时间小的还能够卖. 2.并查集:并查集直 ...
- 【贪心】洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle 题解
不是很容易写出正解的贪心问题. 题目描述 Although Farmer John has no problems walking around the fair to collect pri ...
- P4890 Never·island
传送门 考虑把总区间长度减去最多能减少的区间长度 把所有区间离散化,对每一小段计算贡献 分类讨论一波,对于边界 $i,i+1$ ,设它们之间距离 $d$,$i$ 属于 $x$ 考察队的边界,$i+1$ ...
- Week 3: Structured Types 5. Tuples and Lists Exercise: odd tuples
Exercise: odd tuples 5/5 points (graded) ESTIMATED TIME TO COMPLETE: 5 minutes Write a procedure cal ...
- zoj4062 Plants vs. Zombies 二分+模拟(贪心的思维)
题目传送门 题目大意:有n个植物排成一排,标号为1-n,每株植物有自己的生长速度ai,每对植物浇一次水,该株植物就长高ai,现在机器人从第0个格子出发,每次走一步,不能停留,每一步浇一次水,总共可以走 ...



