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 ...
随机推荐
- WeMall微信商城签到插件Sign的主要源码
WeMall微信商城源码签到插件Sign,用于商城的签到系统,分享了部分比较重要的代码,供技术员学习参考 AdminController.class.php <?php namespace Ad ...
- 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富
1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 498 Sol ...
- Android中的WebView实战详解(二)
四.如何用WebView下载软件? 四.如何用WebView下载软件? public class MainActivity extends AppCompatActivity { private We ...
- Protobuf 在Ubuntu 14上的编译与使用
前言 一直知道Google开源的一个与语言无关的数据交换协议:protobuf.只知道是一种不同于json和XML的格式,还有就是性能特别的好(这在Java和C++的实现确实是!) 最近闲下来看了下G ...
- Vuex给我们的.vue文件结构带来了这些变化
使用vuex前后的对比 使用vuex前 //BookRecommend.vue <script> import * as API from '../api/index' export de ...
- Caused by: java.lang.RuntimeException: java.io.IOException: invalid constant type: 18
工程启动的时候有报下面这个错误的,更新下工程的jar包依赖,然后在工程的pom文件里加上下面的jar包 Caused by: java.lang.RuntimeException: java.io.I ...
- [译]Selenium Python文档:一、安装
1.1.简介 Selenium Python为使用Selenium WebDriver来编写功能/验证测试提供了一个简单的API接口.通过Selenium Python API,你可以以一种非常直观的 ...
- iOS开发之左右抖动效果
CAKeyframeAnimation *shakeAnim = [CAKeyframeAnimation animation]; shakeAnim.keyPath = @"transfo ...
- 快乐Node码农的十个习惯 转
从问世到现在将近20年,JavaScript一直缺乏其它有吸引力的编程语言,比如Python和Ruby,的很多优点:命令行界面,REPL,包管理器,以及组织良好的开源社区.感谢Node.js和npm, ...
- JDBC与ArrayList和hashmao
JDBC帮助类 package work; import java.beans.Statement;import java.sql.Connection;import java.sql.DriverM ...