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 ...
随机推荐
- Contains Duplicate leetcode
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- jenkins-Couldn't find any revision to build. Verify the repository and branch configuration for this job
参考解决方法: https://issues.jenkins-ci.org/browse/JENKINS-20502 原因分析:jenkins无法准确识别revision 操作方法: 在 branch ...
- dtree大型树插件
一.dtree简介 dtree是一个由JavaScript编写成的简单的树形菜单组件,目前免费并且开源.同时支持动态从数据库引入数据. 二.使用方法 1.下载dtree.js及dtree.css 下载 ...
- 使用awk截取某时间段的日志
想要取出文件里面时间是9点到12点的数据,文件内容如下: 2012-09-05 01:48:47,150 WARN [WorkManager(3)-72] [service.PhoneRangeMa ...
- 开源的.NET定时任务组件Hangfire解析
项目慢慢就要开工了,很多园友都在问这个事情,看来大伙对这事很上心啊,事情需要一步步的来,尽量写出一个我们都满意的项目.以前每次在博客前面都会扯淡一下,不过很多人都抱怨这样做不好,加上我这人扯淡起来就停 ...
- 给IIS添加网站配置权限
1.新建一个网站,填好名字,路径和主机名端口等等 2.为网站添加一个用户 3.用户隶属于Guests,和IIS_IUSRS 4.把网站的完全控制权限赋给刚才的用户. 在网站右键--编辑权限--安全 或 ...
- impress.js初体验
概述 如果你已经厌烦了使用PowerPoint制作PPT,那么impress.js是一个非常好的选择,用它做的PPT更加直观,效果也非常的不错.装X是需要一定代价的,不过如果你是个前端爱好者那么一切就 ...
- 初步认识Thymeleaf:简单表达式和标签。(二)
本篇文章是对上篇文章中Thymeleaf标签的补充. 1.th:each:循环,<tr th:each="user,userStat:${users}">,userSt ...
- RunTime 给类添加属性
RunTime网上有很多人都不知道Runtime到底是干嘛的?有很多博主都是长篇大论给他们讲这个讲那个,我感觉还不如实例来的实在.很简单的一个例子:我们都知道会有这样的需求,未读消息列表的图片上要有一 ...
- 模拟jquery链式访问
一直写代码写代码,博客都快荒废了,眼看一月要过完,不能不留下点记忆,嘿嘿,刚研究了下jquery的链式访问,这么好用的技能我赶紧get了下,研究后略微修改,模拟一个简单的链式访问,下面这段代码支持修改 ...