Google卫星地图的URL计算

    技术2022-05-11  76

    写的重名了,Pany的原文:http://panyee.cnblogs.com/archive/2006/04/27/386914.html只是用了下觉得算法不太对。后来又找了下以前收集的在南京大学小百合BBS上的资料,找到了些有用的东西,摘录一些有用的文字:Google卫星地图是由256x256大小的jpeg图片拼接而成,每块图片的URL格式为“http://kh.google.com/kh?v=2&t=trstrqqstsrqttsttq”样。参数v与图片关系不大,主要是参数t起作用,它是“qrst”4个字符排列而成的字符串。为获取某经纬度的URL,就需要把经纬度转化为“qrst”字符串。 Google卫星地图在zoom=1时,全球就为一个256x256的图片,它的中心经纬度为(0,0),URL为“http://kh.google.com/kh?v=2&t=t”。zoom=2时裂化为4块,每块的编号为:左上”t=tq”,右上”t=tr”,右下“t=ts”,左下”t=tt”。依此类推,每放大一倍,每一小块都裂分为四,从左上到右下顺时针按qrst编号,裂分后的编码为裂分前的编号上小块的编号。摘录一个网页:http://intepid.com/stuff/gmkh/,在这个网页上输入一个坐标和缩放级别就可以显示地图,并显示从世界图到详细图的逐层计算。摘录两个代码,一个是上面这个网页中的JS代码,一个是小百合论坛上说的另一中Delphi的算法。

    原文连接:I was born at TSRRTRSQSQQQRQRTSS有人知道google earth吗-小百合论坛延伸:通过这样的算法可以看出Google切图的索引方式,那么能否推算出地图切割算法呢?两个代码如下

    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 projectionvar x = (180.0 + parseFloat(long)) / 360.0;var y = -parseFloat(lat) * PI / 180// convert to radians= 0.5 * Math.log((1+Math.sin(y)) / (1 - Math.sin(y)));y *= 1.0/(2 * PI); // scale factor from radians to normalized+= 0.5// and make y range from 0 - 1var quad = "t"// google addresses start with tvar lookup = "qrts"// tl tr bl brwhile (digits–){// make sure we only look at fractional part-= 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*= 2;y *= 2;}return quad;} function getSatURL(zoom: integer; X, Y: double): string;var  wx, wy, cx, cy: double;  tid: string;  i: integer;begin  cx := 0;  cy := 0;  wx := 180;  wy := 180;  tid := 't';  for i := 1 to zoom-1 do  begin    if (x >= cx) and (y >= cy) then    begin      tid := tid + 'r';      cx := cx + wx / 2;      cy := cy + wy / 2;    end    else if (x >= cx) and (y < cy) then    begin      tid := tid + 's';      cx := cx + wx / 2;      cy := cy - wy / 2;    end    else if (x < cx) and (y < cy) then    begin      tid := tid + 't';      cx := cx - wx / 2;      cy := cy - wy / 2;    end    else    begin      tid := tid + 'q';      cx := cx - wx / 2;      cy := cy + wy / 2;    end;    wx := wx / 2;    wy := wy / 2;  end;  result := 'http://kh.google.com/kh?v=2&t=' + tid;end;  

    最新回复(0)