`
gstarwd
  • 浏览: 1488393 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

必应地图图片系统(Tile System)之二

 
阅读更多
【坐标系和地图图片编码】

为了优化地图系统性能,提高地图下载和显示速度,所有地图都被分割成256 x 256像素大小的正方形小块。由于在每个放大级别下的像素数量都不一样,因此地图图片(Tile)的数量也不一样:

map width = map height = 2^ level tiles

每个tile都有一个XY坐标值,从左上角的(0, 0)至右下角的(2^level –1, 2^level –1)。例如在3级放大级别下,所有tile的坐标值范围为(0, 0)至(7, 7),如下图:

Bb259689.209e5af1-34c1-45f6-ba24-41df3e1a1b10(en-us,MSDN.10).jpg

已知一个像素的XY坐标值时,我们很容易得到这个像素所在的Tile的XY坐标值:

tileX = floor(pixelX / 256)

tileY = floor(pixelY / 256)

为了简化索引和存储地图图片,每个tile的二维XY值被转换成一维字串,即四叉树键值(quardtree key,简称quadkey)。每个quadkey独立对应某个放大级别下的一个tile,并且它可以被用作数据库中B-tree索引值。为了将坐标值转 换成quadkey,需要将Y和X坐标二进制值交错组合,并转换成4进制值及对应的字符串。例如,假设在放大级别为3时,tile的XY坐标值为 (3,5),quadkey计算如下:

tileX = 3 = 011(二进制)

tileY = 5 = 101(二进制)

quadkey = 100111(二进制) = 213(四进制) = “213”

Quadkey还有其他一些有意思的特性。第一,quadkey的长度等于该tile所对应的放大级别;第二,每个tile的 quadkey的前几位和其父tile(上一放大级别所对应的tile)的quadkey相同;下图中,tile 2是tile 20至23的父tile,tile 13是tile 130至133的父tile:Bb259689.5cff54de-5133-4369-8680-52d2723eb756(en-us,MSDN.10).jpg

最后,quadkey提供的一维索引值通常显示了两个tile在XY坐标系中的相似性。换句话说,两个相邻的tile对应的quadkey非常接 近。这对于优化数据库的性能非常重要,因为相邻的tile通常被同时请求显示,因此可以将这些tile存放在相同的磁盘区域中,以减少磁盘的读取次数。

实战应用一下,如果大家用过httpWatch的话,可以发现获取必应地图tile的URL如下:

http://r3.tiles.ditu.live.com/tiles/r13023.png?g=47

关于这个URL的详细解释我在以后的博客中加以阐述,我们看到其中r13023.png,r表示道路图片,13023就是tile所对应的quadkey。显然这个tile所在的地图放大级别为5,其祖父tile为上图黑框中130。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics