“Zed, you are so excellent.”

为什么要写这句英文?容我卖个关子稍后再解释。

相信大多数人都体验过Google Earth(简称GE),我对GE最初的印象是在大学宿舍,当时Google刚刚推出GE时,舍友们喜欢在上面找自己的家,惊讶于它的精细程度,并担心是否对中国有一定的安全隐患。

坦白说,当时我对GE上找家没一点兴趣,但不能否认写到这时,我停下笔,打开了GE,花了很长时间找到了我在成都和泰安的家。我想中国80后的一代对家的概念或多或少有一定的困扰吧。比如我,生在泰山脚下,十八岁那年离开故乡,在北京学习工作了九年,莫名其妙的在成都安家,掐指一算四年有余。这让我不禁纳闷,尽管国家的全部土地都归公民所有,貌似没有任何一寸土地属于我个人,何处是我的家?故土还是户口?如那久未谋面的故人还是隔窗对望的路人。好了,带上耳机听上一曲《鹿港小镇》,我们还是进入正题。

GoogleEarth的影像确实可以说是全球最佳影像数据,数据完整,更新及时,无IP限制,最重要的一点,没有偏移。这么宝贵的影像数据能这么大方的开放给大家,Google自然对自己的加密算法自信慢慢。可惜,就算是巨人般的Google,也会在程序员面前露出破绽。好戏开始了。

类似上一篇解析百词斩的过程,首先我们先要想办法能获取这些数据,然后才能解析它。Google的技术自然毋庸置疑,直接放弃人肉搜索,一点技术含量都没有。这里我用的是HttpDebugger软件,可以查看本地应用程序的请求。这里打开GE随意浏览,你就可以捕获到如下的请求队列:

数据请求的url终于得到了,如鱼在哽的感觉。这url到底是什么规范,行列号在哪里?flatfile又是什么东东?这些-i,-t,-q又是干什么用的?下面的数字685又是什么意思?光归纳问题就得花不少时间来消化,仿佛一拳被KO的节奏。

我想这个时候,你应该和我一样,默默的把url下载下来,尝试看一下里面的内容,或许这是唯一能做的事情了吧。于是乎,我切切的,怯怯的下载下来,以16进制打开该文件,瞬间泪崩的既视感:

无从下手啊。明明是一部不错的岛国爱情动作片,非要全屏马赛克,急死宝宝了。于是我Google了很久,作为一名程序员,FQ技术就不普及了。找了半天都没任何进展,真的是将近一整天没有一丝想法。不小心的找到一个俄文网站,里面提到了影像数据的解析算法,编码解析后,发现果然可以。这里要说明一下,应该是白俄罗斯的网站,顿时对战斗民族的破解技术有了新的认识。

总算有了一点头绪,原来该数据进行了一次加密,所以需要解密。密钥一共是1024个字节,如下的一串没道理的数字:

而这时候,你需要的是对下载下来的影像数据的所有字节依次解码,代码如下:

如上,解码的过程就是对读取的每一个字节和密钥做一次异或。解码后就可以得到原始的jpg影像。当然,如果你在GE中选择压缩,则获取的影像是DXT格式。但我个人测试发现,在我本机无论选不选压缩,都是jpg格式的,这个就不追究了。

影像的解析搞定后,这只是有了一点点曙光,离胜利还有很远。为什么这么说呢?第一Google提供历史影像,而url的规范又是如何,这段密钥是怎么获取到的,真的是才下眉头又上心头啊。

比如这样一个url:https://khmdb.google.com/flatfile?db=tm&f1-02000123-i.19-f859f,我们怎么获取里面的信息,或者我想下载某一个瓦片,其对应的url又是如何?首先解释一下02000123这串数字的意思,截取Zed博客的图片,最直观明了:

原来这串数字就是一个四叉树的信息,依次递归可以找到对应的瓦片位置,每一位都是0~3之间的一个数字,代表在该级别下对应的四叉树的索引。对此我实现了如何根据这串数字获取对应的经纬度:

后面的f859f需要转为二进制,如下: fa99b == 11111010100110011011== 11111010100 | 11001 | 1011== 2004 | 25 | 11不难看出来,这表示该历史影像的拍摄日期。

另外对应的-i.**对应的是其版本号信息。这个版本号又是如何获取?原来GE中每一个瓦片对应一个q2-xxx-q.yyy这样的qtree文件,里面会存储这些tile的时间和版本信息,包括历史数据等内容。

这样就有了两个问题:第一,qtree文件也是有版本号的,这个是如何获取?第二,qtree文件该如何解析?

原来在GE启动时,会更新一个dbRoot.v5文件,把该文件下载下来,16进制打开后你会发现,第七个字节和第八个字节分别是0XF4和0XBD,这时用0XBDF4和0x4200做一次异或,对应的结果就是qtree的版本号,这样你就可以请求每一个瓦片对应的qtree文件了。同时,上面所说的密钥,也保存在该文件中,而且从来都没有变过。       

这趟GE数据解析之旅,和我平时的工作相关性不大,所以收获很多,大开眼界,偷窥了一点点GE这种级别的数据处理方式。当然,竟然有人能够破解这种复杂度的数据,我非常非常的钦佩。上面所说的所有内容,都是我在Zed的指点下了解的,或者简介通过他的博客。我并没有问他地形数据如何解析,因为我知道他基本不会告诉我,但他跟我说里面是三角形。

当然,这里只是介绍了一个头,qtree文件如何解析?这个坦白说,我也只是一知半解,只是知道大概方法,但还没有彻底搞清楚。因为时间精力的原因,需要话一些时间,成本超过了我的兴趣程度,所以作罢。

这些工作都是两年前做的,今天整理一下,也算对这个小小的遗憾做一次整理,和Zed聊了两三个小时,受益匪浅,于是也就有了文章开头的那句话。今后不再研究GE的数据解析部分了,毕竟术业有专攻。这部分我不专业,希望如果你知道的话,请悄悄的告诉我。      

最后,作为一名GIS行业的码农,作为一名三维技术人员,我非常尊重Google Earth。

Google Earth影像数据破解之旅的更多相关文章

  1. Google earth爬取卫星影像数据并进行标注路网的方法

    一.下载goole earth 和GetScreen: 试了很多,找了可以使用的上传到百度网盘,链接如下所示: 链接:https://pan.baidu.com/s/1fp-W8u68iRsJ0xcu ...

  2. Google Earth数据存储、管理、表现及开发机制

    Google Earth数据存储.管理.表现及开发机制 一.    Google Earth(Map)介绍 1.1    Google Earth介绍 在众多的地理信息服务提供商中,Google是较早 ...

  3. Google Earth Engine 中的位运算

    Google Earth Engine中的位运算 按位运算是编程中一个难点,同时也是在我们后续处理影像数据,尤其要使用影像自带的波段比如QA波段经常会用到的一个东西.通过按位运算我们可以筛选出我们想要 ...

  4. 看到shape文件可以加载到GOOGLE EARTH上的方法,有空可以试试

    引用 Shape文件转为KMZ并在Google Earth中显示 (1)在ArcGIS中加载一个Shape文件,笔者加载的是某个地区的道路(双线道路)图层 (2)在ArcToolbox中,依次展开Co ...

  5. Google earth

    装了Google earth之后,需要联网,才能放缩看不同精细程度的场景,除非你之前看过,在你自己的缓存中有存储. Google earth有自己的server,我们交互化的时候,server传数据给 ...

  6. Google map实现类似Google earth的图标展开功能

    前言 在Google map的开发时,如果有多个图标重叠在一起,这时下面的图标就点击不到.而在Google Earth中,鼠标一移到上面就会自动弹开,这对于用户而言是十分人性化的一个功能.如下是在Go ...

  7. 基于google earth engine 云计算平台的全国水体变化研究

    第一个博客密码忘记了,今天才来开通第二个博客,时间已经过去两年了,三年的硕士生涯,真的是感慨良多,最有收获的一段时光,莫过于在实验室一个人敲着代码了,研三来得到中科院深圳先进院,在这里开始了新的研究生 ...

  8. 将ROS中的/sensor_msgs/NavSatFix数据导入google earth显示轨迹

    将ros中的gps_msg数据导入google earth显示轨迹 [TOC] 1. 获取GPS数据 将ros中发布的gps topic输出到文本中 rostopic echo -p /gpsData ...

  9. Chrome即将封杀Google Earth、Google Talk等插件

    昨日,Chrome安全工程师Justin Schuh在官方博客中写道,到明年一月份,谷歌将封杀一系列基于NPAPI框架标准的浏览器插件.其中包括谷歌地球(Google Earth).Google Ta ...

随机推荐

  1. WeMall微信商城签到插件Sign的主要源码

    WeMall微信商城源码签到插件Sign,用于商城的签到系统,分享了部分比较重要的代码,供技术员学习参考 AdminController.class.php <?php namespace Ad ...

  2. 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富

    1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 498  Sol ...

  3. Android中的WebView实战详解(二)

    四.如何用WebView下载软件? 四.如何用WebView下载软件? public class MainActivity extends AppCompatActivity { private We ...

  4. Protobuf 在Ubuntu 14上的编译与使用

    前言 一直知道Google开源的一个与语言无关的数据交换协议:protobuf.只知道是一种不同于json和XML的格式,还有就是性能特别的好(这在Java和C++的实现确实是!) 最近闲下来看了下G ...

  5. Vuex给我们的.vue文件结构带来了这些变化

    使用vuex前后的对比 使用vuex前 //BookRecommend.vue <script> import * as API from '../api/index' export de ...

  6. Caused by: java.lang.RuntimeException: java.io.IOException: invalid constant type: 18

    工程启动的时候有报下面这个错误的,更新下工程的jar包依赖,然后在工程的pom文件里加上下面的jar包 Caused by: java.lang.RuntimeException: java.io.I ...

  7. [译]Selenium Python文档:一、安装

    1.1.简介 Selenium Python为使用Selenium WebDriver来编写功能/验证测试提供了一个简单的API接口.通过Selenium Python API,你可以以一种非常直观的 ...

  8. iOS开发之左右抖动效果

    CAKeyframeAnimation *shakeAnim = [CAKeyframeAnimation animation]; shakeAnim.keyPath = @"transfo ...

  9. 快乐Node码农的十个习惯 转

    从问世到现在将近20年,JavaScript一直缺乏其它有吸引力的编程语言,比如Python和Ruby,的很多优点:命令行界面,REPL,包管理器,以及组织良好的开源社区.感谢Node.js和npm, ...

  10. JDBC与ArrayList和hashmao

    JDBC帮助类 package work; import java.beans.Statement;import java.sql.Connection;import java.sql.DriverM ...