部分答案:
根据我的收集,长字符串trtqtqss
本质上表示对位置的二进制搜索。大致翻译成这样:
- 从字母开始
t
。这给了你“浅世界”
- 在地图上寻找你的点。如果它位于左上象限,请添加
q
. 如果右上角,添加r
. 右下角,加s
。左下角,添加t
。
- 放大新象限。重复。
每次您添加一个字母时,您都会将图块的大小减半,并找到一个新的左下角。如果我们把世界地图想象成一个宽高 = 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, %.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
( . 当我在谷歌地图中输入这些时,我得到了你在博客文章中输入链接时得到的医院图片。