无痕客

落花无情,流水无痕……

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
Virtual Earth Tile Image URI 参数解析
2008年11月17日 星期一 17:40
9月写过一篇关于Google地图和微软VE瓦片的URL解析,当时语焉不详,而且Google变化还挺快,部分URL地址已经失效,先不理他。参考微软的MSDN等文章,详细介绍下Virtual Earth Tile Image URI 参数。

微软虚拟地球目前缩放级别(level of detail)从1到23共计23级。最小一级2*2共四幅图,宽高512*512。确定level,可得到地图的宽度和高度:map width = map height = 256<<level,也即2的level次方乘以256。也可得到总行数和总列数:max column = max row = 1<<level,也即2的level次方,一般从0起标记。由相应的像素坐标计算像素所在Tile的行列号:tileX = floor(pixelX / 256);tileY = floor(pixelY / 256)



Level 1的四幅图按照左上、右上、左下、右下的顺序分别标识为0123,随着level的增加依次递归,如图所示,非常清晰。为了优化存取和显示图片的性能,用四叉树进行存储索引而没有暴力的使用简单行列号来标记每个Tile,把行列号组合成一维的字符串,称之为quadtree keys,简写为“quadkeys”。每一个quadkey对应具体某一level的一张tile,可用作普通数据库的B-Tree索引。

组合方法:在给定level下,把行号tileY和列号tileX转换为2进制,然后行列交叉存储,再转换为4进制,即得到了相应的quadkey。譬如Level 3的第6行第4列的Tile计算:tileY = 5 = 101 ,tileX = 3 = 011;quadkey = 100111 = 213(4进制) = “213”。相应的C#算法如下(算法过程介绍)。
public static string TileXYToQuadKey(int tileX, int tileY, int levelOfDetail)
{
StringBuilder quadKey = new StringBuilder();
for (int i = levelOfDetail; i > 0; i--)
{
char digit = '0';
int mask = 1 << (i - 1);
if ((tileX & mask) != 0)
{
digit++;
}
if ((tileY & mask) != 0)
{
digit++;
digit++;
}
quadKey.Append(digit);
}
return quadKey.ToString();
}

Microsoft Virtual Earth提供三种地图:卫星地图(a=aerial),普通地图(r=road)和混合地图(h=hybrid),提供两种图片格式:png和jpeg(jpg)。每个Tile的统一URL格式为: http://{0}{1}.ortho.tiles.virtualearth.net/tiles/{0}{2}.{3}?g={4}
参数{0}取值范围为(a,r,h),取决于你想要的地图形式;
参数{1}取值范围为{0,1,2,3},搞了四个服务器均衡负载,随机数即可。
参数{2}即quadkey,参考上述算法;
参数{3}取值范围(png, jpeg, jpg);
参数{4}是版本号,诸如(50,100,159),好像差别不大。
此外,当是普通地图({0}==r)的时候在URL最后还加上&shading=hill增加阴影效果。
实例:http://a1.ortho.tiles.virtualearth.net/tiles/a02123003022020320.png?g=50

Google Maps道理是相同的,编码用的是QRST,ArcGIS Server 9.3生成缓存时给每个Tile的命名也跑不出这个圈圈。
转载自:http://hi.baidu.com/liongg/blog/item/5a311f3063ea919ea9018ebb.html
posted on 2009-12-25 11:24  无痕客  阅读(1419)  评论(0编辑  收藏  举报