有没有办法将"QRST-code"转换为经度/纬度?



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

trtqtqsss... 

等等。在其他一些论坛上,我发现GM曾经在URL语法中使用过这个。但现在它似乎已经不起作用了——或者至少我不知道怎么做。

下面是一个不再工作的链接示例:

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

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

有转换器或类似的东西吗?

提前谢谢!

部分答案:

据我所知,trtqtqss的长字符串本质上表示对位置的二进制搜索。大致翻译如下:

  1. 以字母t开头。这给了你"时尚世界"
  2. 在地图上找你的点。如果它位于左上象限,请添加一个q。如果在右上角,则添加r。右下角,添加s。左下角,添加t
  3. 放大新象限。重复

每次添加一个字母时,都会将瓷砖的大小减半,然后找到一个新的左下角。如果我们把世界地图想象成一个宽度和高度=1的矩形,我们可以为添加的每个字符找到一个新的角。这就是你在评论中链接的算法的本质。

有了这个,再加上"罗塞塔石碑"(再次从你的链接)的一个已知字符串到卫星图像的翻译,我给你以下代码。这将根据字符串为您提供一个点的经度/纬度。编译它,然后将字符串作为参数传递给可执行文件:

#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, %.9lfn", 
      buf, x, y);
    }
  printf("the final lat/long is %.5lf, %.5lfn", 360.0 * (x - 0.5), NormalToMercator(y));
}

中间的printf语句向您展示了算法是如何缓慢地到达正确的位置的。我用你评论中的链接(tsrrtrsqsqqqrqrtsst)中的字符串进行了测试,得到了坐标153.39935ºE 28.32372ºS(注意,经度的负数表示"W",纬度的负值表示"S"。我得到了153.39935,-28.32372)。当我在谷歌地图中输入这些时,我得到了你在博客文章中输入链接时得到的医院的照片。

最新更新