http://www.cnblogs.com/junyuz/archive/2011/04/19/2021035.html

瓦片地图坐标相关计算

在给定level下,把行号tileY和列号tileX转换为2进制,然后行列交叉存储,再转换为4进制,即得到了相应的quadkey。譬如Level 3的第6行第4列的Tile计算:tileY = 5 = 101 ,tileX = 3 = 011;quadkey = 100111 = 213(4进制) = “213”。
那么,下面我们给出C#的代码实现
/// <summary> /// Converts tile XY coordinates into a QuadKey at a specified level of detail. /// </summary> /// <param name="tileX">Tile X coordinate.</param> /// <param name="tileY">Tile Y coordinate.</param> /// <param name="levelOfDetail">Level of detail, from 1 (lowest detail) /// to 23 (highest detail).</param> /// <returns>A string containing the QuadKey.</returns> 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(); }

接下来是反算代码
/// <summary> /// Converts a QuadKey into tile XY coordinates. /// </summary> /// <param name="quadKey">QuadKey of the tile.</param> /// <param name="tileX">Output parameter receiving the tile X coordinate.</param> /// <param name="tileY">Output parameter receiving the tile Y coordinate.</param> /// <param name="levelOfDetail">Output parameter receiving the level of detail.</param> public static void QuadKeyToTileXY(string quadKey, out int tileX, out int tileY, out int levelOfDetail) { tileX = tileY = 0; levelOfDetail = quadKey.Length; for (int i = levelOfDetail; i > 0; i--) { int mask = 1 << (i - 1); switch (quadKey[levelOfDetail - i]) { case '0': break; case '1': tileX |= mask; break; case '2': tileY |= mask; break; case '3': tileX |= mask; tileY |= mask; break; default: throw new ArgumentException("Invalid QuadKey digit sequence."); } } }

上面所讲到的是针对bingmap的情况,googleearth采用QRTS编码,即Q、R、T、S分别代表0、1、2、3,运算方法类似,代码如下
?
        /// <summary>
        /// 由tileX、tileY和level求解quadkey
        /// </summary>
        /// <param name="tileX"></param>
        /// <param name="tileY"></param>
        /// <param name="levelOfDetail"></param>
        /// <returns></returns>
        private static string TileXYToQuadKey(int tileX, int tileY, int levelOfDetail)
        {
            var quadKey = new StringBuilder();
            for (int i = levelOfDetail; i > 0; i--)
            {
                char digit = '0';
  
                //掩码,最高位设为1,其他位设为0
                int mask = 1 << (i - 1);
  
                //与运算取得tileX的最高位,若为1,则加1
                if ((tileX & mask) != 0)
                {
                    digit++;
                }
  
                //与运算取得tileY的最高位,若为1,则加2
                if ((tileY & mask) != 0)
                {
                    digit++;
                    digit++;
                }
  
                //也即2*y+x
                quadKey.Append(digit);
            }
            return quadKey.ToString();
        }
 protected static string QuadKeyNumberToAlpha(string base4)
        {
            return base4.Replace('0', 'q').Replace('1', 'r').Replace('2', 't').Replace('3', 's');
        }
private static string QuadKeyNumberToAlphaUrl(string url, int tilePositionX, int tilePositionY, int zoom)
        {
            string quadKey = TileXYToQuadKey(tilePositionX, tilePositionY, zoom);
            //获取最后一位,选择4个服务器中的一台
            string str3 = quadKey.Substring(quadKey.Length - 1, 1);
            string str4 = QuadKeyNumberToAlpha(quadKey);
  
            url = string.Format(url, str4, str3);
            return url;
        }

Google卫星地图是由256x256大小的jpg图片拼接而成,每块图片的URL格式为“http://kh.google.com/kh?v=3&t=trstrq”样。参数v选择4台服务器中的一台,起到均衡负载的作用,参数t是“qrst”4个字符排列而成的字符串。为获取某经纬度的URL,就需要把经纬度转化为“qrst”字符串。 Google卫星地图在zoom=1时,全球就为一个256x256的图片,它的中心经纬度为(0,0),URL为“http://kh.google.com/kh?v=3&t=t”。zoom=2时裂化为4块,每块的编号为:左上”t=tq”,右上”t=tr”,右下“t=ts”,左下”t=tt”。依此类推,每放大一倍,每一小块都裂分为四,从左上到右下顺时针按qrst编号,裂分后的编码为裂分前的编号上小块的编号。
代码如下:
?
function GetQuadtreeAddress(long, lat)
{
var PI = 3.1415926535897;
var digits = 18; // how many digits precision
// now convert to normalized square coordinates
// use standard equations to map into mercator projection
var x = (180.0 + parseFloat(long)) / 360.0;
var y = -parseFloat(lat) * PI / 180; // convert to radians
y = 0.5 * Math.log((1+Math.sin(y)) / (1 - Math.sin(y)));
y *= 1.0/(2 * PI); // scale factor from radians to normalized
y += 0.5; // and make y range from 0 - 1
var quad = "t"; // google addresses start with t
var lookup = "qrts"; // tl tr bl br
while (digits–)
{
// make sure we only look at fractional part
x -= Math.floor(x);
y -= Math.floor(y);
quad = quad + lookup.substr((x >= 0.5 ? 1 : 0) + (y >= 0.5 ? 2 : 0), 1);
// now descend into that square
x *= 2;
y *= 2;
}
return quad;
}

瓦片地图坐标相关计算相关推荐

  1. 关于45°角度地图坐标的计算原理 - LVin_A

    首先贴出代码,下面的代码是将屏幕点击的坐标转换成45°角度地图中的坐标. -(CGPoint) tilePosFromLocation:(CGPoint)location tileMap:(CCTMX ...

  2. 瓦片地图坐标与经纬度换算公式python实现

    经纬度和瓦片地图坐标对应关系本质上是由墨卡托投影实现 地图是显示在平面上的,因此需要将球面坐标转换为平面坐标,这个转换过程称为投影.最常见的投影是墨卡托(Mercator)投影,它具有等角性质,即球体 ...

  3. SLAM无人车计算地图坐标,ros中计算地图坐标,rosweb计算画布对应的坐标(含代码,含公式,超详细),开发跨系统地图导航必备算法【可实现qt,android,c#,mfc,html等地图开发】

    ros中计算地图坐标,rosweb计算画布对应的坐标 视频讲解: SLAM无人车计算地图坐标,图片像素坐标公式推导 1.订阅话题 /map nav_msgs::OccupancyGrid 这个消息中可 ...

  4. 瓦片地图面面观之缩放级别

    缩放级别 我们知道瓦片地图基于瓦片,而瓦片本身是栅格数据,无法再保证不损失图元数据的情况下对其连续缩放.因此瓦片地图一般通过定义缩放级别的方式来实现瓦片地图的层级缩放. 一般瓦片地图定义缩放级别在1~ ...

  5. 国内主要地图瓦片坐标系定义及计算原理

    国内主要地图瓦片坐标系定义及计算原理 作者 CntChen 关注 2016.05.10 20:05* 字数 3144 阅读 1571评论 0喜欢 9 本文将介绍瓦片坐标相关知识,并提供高德地图.百度地 ...

  6. php百度地图接口两点测距,百度地图Api 根据两个坐标点计算距离

    百度地图Android Sdk的Api里面,没有现成的直接获取两个坐标点之间距离的方法,但是,在jsapi里面,有直接计算距离的方法. class Point: pass def max(a,b): ...

  7. 瓦片地图服务参数与计算

    转载自:http://www.cnblogs.com/kekec/p/3159970.html 开源与成熟商业的瓦片地图服务(TMS  2  WMTS),都有如下共同的特性,基本成为了标准: (1) ...

  8. WebGIS 瓦片地图引擎实现之——地图瓦片加载计算原理介绍

    1. 背景 1.1 地图瓦片之前 在地图瓦片技术使用之前,用户使用在线地图,一般都是客户端把将要显示的地理范围传送到服务端,服务器端将地理范围内的地理数据都查询出来,然后在服务端按照预先定义的专题地图 ...

  9. 坐标范围计算显示缩放级别zoom自适应显示地图

    坐标范围计算显示缩放级别zoom自适应显示地图 1.数据: //数据准备 var points = [`在这里插入代码片`{"lng":116,"lat":40 ...

最新文章

  1. 综合技术 --myBatis理解
  2. WINDOWS下的各类HOOK
  3. 涨姿势了,raise...from... 是个什么操作?
  4. Spark API 详解(转)
  5. 获取页面可见区域,屏幕区域的尺寸
  6. 计算机网络——码元,波特,速率和带宽
  7. Android:解决魅族5在Logcat下不输出Log.v()日志
  8. python学习之网络编程
  9. 运动目标跟踪(十)--CSK跟踪
  10. 温州大学c语言作业布置的网站,2016年温州大学物理与电子信息工程学院综合卷之C语言程序设计复试笔试仿真模拟题...
  11. 十进制转36进制(10进制转任意进制的方法)
  12. Locust (二)接口压力测试
  13. 黑白简约个人网页制作 大学生个人网页设计模板 学生个人博客网页成品 简单个人网站作品下载 静态HTML CSS个人网页作业源代码
  14. 无法复制到远程计算机,远程桌面无法复制粘贴【解答思路】
  15. Android图片轮播控件——Banner
  16. 微软 Win10 更新再出 bug
  17. 靶机18 driftingblues1
  18. 嵌入式Linux--驱动ST7789驱动芯片的TFT屏(一)
  19. Linux(U盘挂载,玩客云armbian详细挂载U盘扩容)
  20. c语言多线程示例windows

热门文章

  1. 骁龙778G相当于天玑多少?对比天玑900、天玑1100,结论很清晰
  2. 客制化键盘之GH60折腾
  3. 分屏工具——spacedesk安装及使用
  4. PSCP和SCP区别和用法
  5. Ant Design of Vue 中 日期时间控件 禁止选中的(日期——)设置
  6. 电脑组装需要准备的配件清单,仅供参考
  7. 可穿戴式设备之智能手环
  8. KYOCERA Programming Contest 2021 (AtCoder Beginner Contest 200) A~E 题解
  9. 应用之星教你制作电子书(包括图文电子书),与技术无关
  10. libjpeg用法linux压缩,使用libjpeg对图像进行压缩