也说Google卫星地图的URL地址的qrts编码算法2011-08-24 博客园 hai今天看到有人已经在讨论如何获取google卫星图片,见 http://www.cnblogs.com/tangf/archive/2006/07/23/457902.html? login=1&CommentID=1507040#Post的一篇博客,里面抄了JavaScript和delphi的代码过来,我在此 再重抄一遍免得大家找来找去。算法思想如下:Google卫星图片服务器,由不同层次的256x256大小的jpeg图片无缝拼接而成,其编 码方式是按照qrst编码方法进行索引:zoom=1时,全球只有一个256x256的图片,它的中心经纬度为(0,0),其URL为 “http://kh.google.com/kh?v=3&t=t”(大家可以把改URL复制到浏览器看下),其范围是地球按等 角纵切圆柱投影后,左右为从西径180度到东径180度,上下范围为从南180度到北180度(这里并不是完 全按地球南北只有90度进行划分),中点为赤道与中央子午线的交点,其编码为t。当zoom=2时进行第二级编码,即从中点开始上下左右从中分成相等的四等份,从左上开始按顺时针方 向分别编为左上q,右上r,右下s,左下t,每一块的编码就为:tq,tr,ts,tt。依此类推,每增大一级编码,就放大一倍,每一块都从中分为四块进行下一级编码,编码在前组编码 的基础上再分别加上q,r,s,t。即一级编码由一个字母组成,二级编码由两个字母组成,三级由三个字母 组成,其它级依次类推,不同地区提供下载的图层级数不尽相同,最多可分到21级。对于全球全部卫片的管理来讲,这种编码方法是最好的,是典型的金字塔索引编码方法,采用这种编 码要得到某一个图块编号时,看似要对编号进行字串生成计算,其实不然,这种编码方法对于编号是可 以用数值加或减就能直接计算,然后做一个数值与字符的转换即可。这对于查找、平移、定位等操作非 常快速方便。JavaScript代码如下:1function GetQuadtreeURL_(lon, lat) 2{ 3 var PI = 3.1415926535897; 4 var digits = 18; // how many digits precision 5 // now convert to normalized square coordinates 6 // use standard equations to map into mercator projection 7 var x = (180.0 + parseFloat(lon)) / 360.0; 8 var y = -parseFloat(lat) * PI / 180; // convert to radians 9 10 y = 0.5 * Math.log((1+Math.sin(y)) / (1 - Math.sin(y))); 11 12 y *= 1.0/(2 * PI); // scale factor from radians to normalized 13 y += 0.5; // and make y range from 0 - 1 14 15 var quad = "t"; // google addresses start with t 16 var lookup = "qrts"; // tl tr bl br 17 18 while (digits–) { 19 // make sure we only look at fractional part 20 x -= Math.floor(x); 21 y -= Math.floor(y); 22 quad = quad + lookup.substr((x >= 0.5 ? 1 : 0) + (y >= 0.5 ? 2 : 0), 1); 23 // now descend into that square 24 x *= 2; 25 y *= 2; 26 } 27 return quad; 28}