部分答案:
從我所收集的trtqtqss
長字符串表示,在本質上,該位置的二進制搜索。它大致翻譯如下:
- 以字母
t
開頭。這給你的「sholw世界」
- 查找地圖上的點。如果它位於左上象限中,請添加一個
q
。如果右上角,請添加r
。在右下角添加s
。在左下角添加t
。
- 放大新象限。重複。
每當你添加一個字母,你減半瓦片的大小,並找到一個新的左下角。如果我們將世界地圖視爲寬度和高度爲1的矩形,我們可以爲每個添加的角色找到一個新的角落。這是您在評論中鏈接的算法的本質。因此,加上已知字符串到衛星圖像翻譯的「Rosetta stone」(再次從你的鏈接),我給你下面的代碼。這將根據您的字符串爲您提供一個點的經度/緯度。編譯它,然後把這個字符串作爲參數傳遞給可執行文件:
#include <stdio.h>
#include <string.h>
#include <math.h>
double NormalToMercator(double y) {
double pi;
pi = 2 * asin(1);
y -= 0.5;
y *= 2 * pi;
y = exp(2 * y);
y = (y - 1)/(y + 1);
y = -asin(y);
return -y * 180/pi;
}
int main(int argc, char* argv[]) {
double x=0, y=0, scale=1;
char buf[100]={' '};
int ii;
buf[0]=argv[1][0];
for(ii = 1; ii < strlen(argv[1]); ii++) {
buf[ii-1]=argv[1][ii];
scale *= 0.5;
switch (tolower(argv[1][ii])) {
case 'q':
y+=scale;
break;
case 'r':
y+=scale;
x+=scale;
break;
case 's':
x+=scale;
break;
case 't':
break;
default:
break;
}
printf("the string %s gets you to (x,y): %.9lf, %.9lf\n", \
buf, x, y);
}
printf("the final lat/long is %.5lf, %.5lf\n", 360.0 * (x - 0.5), NormalToMercator(y));
}
中間printf
語句是那裏告訴你如何算法是慢慢做它的方式到正確的位置。我用你評論(tsrrtrsqsqqqrqrtsst
)中鏈接的字符串測試了這個,並且得到了座標153.39935ºE 28.32372ºS
(注意 - 經度的負數表示「W」,緯度的負數表示「S」,我得到了153.39935, - 28.32372)。當我在谷歌地圖上輸入這些信息時,我得到了進入link from blog post時所獲得的醫院圖片。
請問http://www.codeproject.com/Articles/14793/How-Google-Map-Works上的信息對您有幫助嗎? – Floris