• Virtual Earth Tile Image URI 参数解析(收集,学习VE插件必看)


    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
  • 相关阅读:
    UITabbarItem只显示图标
    [转]translatesAutoresizingMaskIntoConstraints详解
    [转载]podfile语法
    获取数组NSArray元素的className
    HTTP的FormData和Payload的传输格式
    WCDB错误"No matching constructor for initialization of 'WCTColumnBinding'"
    UIStakView的添加与移除
    为什么说Python采用的是基于值的内存管理模式?
    PostgreSQL数据库
    标准库 time
  • 原文地址:https://www.cnblogs.com/wuhenke/p/1631938.html
Copyright © 2020-2023  润新知