有没有办法将“QRST代码”转换为经度/纬度?

时间:2013-07-22 19:05:17

标签: google-maps

我为这个话题做了很多研究 - 但似乎还不够,所以我在这里寻求帮助:-) Google地图可以使用QRST代码来指定位置。我有这样一句话:

trtqtqsss... 

等等。在其他一些论坛中,我发现GM曾经在URL语法中使用过它。但现在它似乎不再起作用 - 或者至少我不知道如何。

以下是不再适用的链接示例:

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

在此网址中,象限是使用t=之后的字符串指定的。

是否有转换器或类似的东西?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

部分答案:

从我收集的内容来看,长trtqtqss字符串本质上表示对该位置的二进制搜索。它粗略地翻译成这样:

  1. 以字母t开头。这给了你“sholw world”
  2. 在地图上查找您的观点。如果它位于左上象限,请添加q。如果在右上角,请添加r。在右下角,添加s。左下角,添加t
  3. 放大新象限。重复。
  4. 每次添加一个字母时,您都会将图块的大小减半,并找到一个新的左下角。如果我们将世界地图视为宽度和高度= 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时获得的医院照片。