2013-07-22 75 views
2

我爲這個主題做了大量的研究 - 但似乎還不夠,所以我在這裏尋求幫助:-) 谷歌地圖可以使用QRST代碼來指定一個位置。我有這樣一條線:有沒有辦法將「QRST-code」轉換爲經度/緯度?

trtqtqsss... 

等等。在其他一些論壇中,我發現GM曾經在URL-Syntax中使用過。但現在看來它不再起作用 - 或者至少我不知道如何。

這裏是不會工作了鏈接的例子:

kh0.google.com/kh?n=404&v=8&t=tq 
kh1.google.com/kh?n=404&v=8&t=tr 

在這個URL,象限與t=後的字符串指定。

是否有轉換器或類似的東西?

預先感謝您!

+0

請問http://www.codeproject.com/Articles/14793/How-Google-Map-Works上的信息對您有幫助嗎? – Floris

回答

1

部分答案:

從我所收集的trtqtqss長字符串表示,在本質上,該位置的二進制搜索。它大致翻譯如下:

  1. 以字母t開頭。這給你的「sholw世界」
  2. 查找地圖上的點。如果它位於左上象限中,請添加一個q。如果右上角,請添加r。在右下角添加s。在左下角添加t
  3. 放大新象限。重複。

每當你添加一個字母,你減半瓦片的大小,並找到一個新的左下角。如果我們將世界地圖視爲寬度和高度爲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時所獲得的醫院圖片。

+0

謝謝!我已經測試過但不幸的結果是不正確的。我想知道每個案件都有相同的公式。每個案件可能有不同的形式?我在另一個論壇上發現了類似的東西(僞代碼,我猜想它是關於轉換爲XY座標的): case'0': break; case'1': tileX | = mask; 休息; case'2': tileY | = mask; 休息;案例'3': tileX | =掩碼; tileY | = mask; 休息; (對不起,不知道如何正確格式化以獲得更好的閱讀效果) – Dani

+0

你有一個「已知位置的已知字符串」嗎?這對調試會有很大的幫助,如果你確實... – Floris

+0

也許這個鏈接幫助:http://intepid.com/posts/484 (非常感謝你的工作!) – Dani