Google Earth影像数据破解之旅
“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影像数据破解之旅的更多相关文章
- Google earth爬取卫星影像数据并进行标注路网的方法
一.下载goole earth 和GetScreen: 试了很多,找了可以使用的上传到百度网盘,链接如下所示: 链接:https://pan.baidu.com/s/1fp-W8u68iRsJ0xcu ...
- Google Earth数据存储、管理、表现及开发机制
Google Earth数据存储.管理.表现及开发机制 一. Google Earth(Map)介绍 1.1 Google Earth介绍 在众多的地理信息服务提供商中,Google是较早 ...
- Google Earth Engine 中的位运算
Google Earth Engine中的位运算 按位运算是编程中一个难点,同时也是在我们后续处理影像数据,尤其要使用影像自带的波段比如QA波段经常会用到的一个东西.通过按位运算我们可以筛选出我们想要 ...
- 看到shape文件可以加载到GOOGLE EARTH上的方法,有空可以试试
引用 Shape文件转为KMZ并在Google Earth中显示 (1)在ArcGIS中加载一个Shape文件,笔者加载的是某个地区的道路(双线道路)图层 (2)在ArcToolbox中,依次展开Co ...
- Google earth
装了Google earth之后,需要联网,才能放缩看不同精细程度的场景,除非你之前看过,在你自己的缓存中有存储. Google earth有自己的server,我们交互化的时候,server传数据给 ...
- Google map实现类似Google earth的图标展开功能
前言 在Google map的开发时,如果有多个图标重叠在一起,这时下面的图标就点击不到.而在Google Earth中,鼠标一移到上面就会自动弹开,这对于用户而言是十分人性化的一个功能.如下是在Go ...
- 基于google earth engine 云计算平台的全国水体变化研究
第一个博客密码忘记了,今天才来开通第二个博客,时间已经过去两年了,三年的硕士生涯,真的是感慨良多,最有收获的一段时光,莫过于在实验室一个人敲着代码了,研三来得到中科院深圳先进院,在这里开始了新的研究生 ...
- 将ROS中的/sensor_msgs/NavSatFix数据导入google earth显示轨迹
将ros中的gps_msg数据导入google earth显示轨迹 [TOC] 1. 获取GPS数据 将ros中发布的gps topic输出到文本中 rostopic echo -p /gpsData ...
- Chrome即将封杀Google Earth、Google Talk等插件
昨日,Chrome安全工程师Justin Schuh在官方博客中写道,到明年一月份,谷歌将封杀一系列基于NPAPI框架标准的浏览器插件.其中包括谷歌地球(Google Earth).Google Ta ...
随机推荐
- Ajax页面的加载数据与删除
1.数据库找一张表: 颜色表2.主页面主页面的代码用到tbody:TBODY作用是:可以控制表格分行下载,从而提高下载速度.(网页的打开是先表格的的内容全部下载完毕后,才显示出来,分行下载可以先显示部 ...
- 网络信息安全攻防学习平台 上传,解密通关writeup
上传关 [1]查看源代码,发现JS代码.提交时onclick进行过验证.ctrl+shift+i 打开开发者工具,将conclick修改为 return True,即可以上传上传php文件,拿到KEY ...
- Android Handler消息机制不完全解析
1.Handler的作用 Android开发中,我们经常使用Handler进行页面的更新.例如我们需要在一个下载任务完成后,去更新我们的UI效果,因为AndroidUI操作不是线程安全的,也就意味着我 ...
- php文件基本操作与文件管理功能
文件的基本操作 先来看一下PHP文件基础操作,请看强大注释 <body> <?php var_dump(filetype("./img/11.png")); // ...
- 第一章Python起步
1.1搭建编程环境 编程环境的正确搭建很重要,一定要参考先搭配好环境变量,不然用着会很麻烦,在这里推荐使用工具pycharm,亿图图示画流程图,一定要正确安装,搭配好环境变量,后面要添加很多模块,前期 ...
- 基于原生js的返回顶部组件,兼容主流浏览器
基于原生js的返回顶部插件,兼容IE8及以上.FF.chrome等主流浏览器. js文件中封装了getScrollTop()和changeScrollTop()函数分别用于获取滚动条滚动的高度和修改滚 ...
- 《Django By Example》第十一章 中文 翻译 (个人学习,渣翻)
第十一章 缓存内容 (译者 @ucag 注:这是倒数第二章,最后一个项目即将完成. @夜夜月 将会接过翻译的最后一棒.这本书的翻译即将完成.这也是我翻译的最后一章,作为英语专业的学生,我对于翻译有了更 ...
- iOS打包后收不到推送信息
今天遇到的一个特别神奇的问题: 应用在测试环境下打的包收不到推送了,打包之后都没有推送,但是我真机测试又是可以收到推送消息的.经过好久才找到原因,感觉很坑.这里记录一下问题: 1.由于我的推送第三方使 ...
- shell 处理 文件名本身带星号的情况
获取到的所有文件名放到数组中时必须加上引号,不然 for 循环时会被解析成通配符,或者使用 shell 字典,同样也需要引号. shell 字典示例 #!/bin/bash echo "sh ...
- 读书笔记 effective c++ Item 41 理解隐式接口和编译期多态
1. 显示接口和运行时多态 面向对象编程的世界围绕着显式接口和运行时多态.举个例子,考虑下面的类(无意义的类), class Widget { public: Widget(); virtual ~W ...