2005年谷歌地球横空出世,将地球以三维可视化方式展现在每一个电脑屏幕前的用户,掀起了数字地球热潮,而随着三维倾斜摄影模型数据的加入,将谷歌地球对全球的三维可视化效果表达,提升到了更高的层次。作为全球三维倾斜摄影覆盖面积最广的三维数字地球平台,谷歌地球为大家提供了全球各地的城市、森林、火山等各种地理要素的三维可视化表达,同时结合当今VR、AR平台创建游戏等真实场景,数据可视化更加立体和真实。Cesium作为开源的三维数字地球平台,将重点放在地理信息数据的接入与可视化,用户只需要关注上层业务开发,同时扩展“端”的表现形式,将Cesium与JavaScript前端、以及Unity、Unreal等游戏引擎结合,形成了当今开发者使用最广泛的开源三维数字地球平台。Cesium与谷歌地球的结合,源于2023年5月,谷歌官方将google倾斜摄影模型数据转换成Cesium能够接入的3DTiles格式,并在Google Map Platforms平台发布,用户可以通过GEE平台,生成数据调用API。2023年10月,两者的结合更进一步,谷歌倾斜摄影3DTiles数据集成到Cesium ion中,开发者只需要通过Cesium ion便可以访问谷歌全部共计49个国家2500多个城市的数据,大大方便了开发者对数据的使用。
但是对国内开发者来说,由于网络问题,开发者想访问这份数据是比较困难的,加上国内使用Cesium的场景大部分都是离线环境下,这份数据离国内开发者还比较遥远,国内开发者为了获取这份数据,付出了不少努力。
谷歌倾斜摄影模型数据使用二进制进行编码,想要逆向转换,难度极大,但是国人的智慧是无穷的,主要技术路线如下:
1.既然无法逆向转换,那直接使用谷歌官方的程序解析文件,用帧缓存渲染工具保存成模型文件,再通过模型工具进行模型合并,这样就能获取一份面积很大的数据,再通过obj转3dtiles工具进行3DTiles数据生成。这种技术原理在CSDN上有开发者已经实现,大家可以搜索相关文章查看,具体原理大致如下:使用专门下载工具下载文件,并且结合图形开发调试神器RenderDoc以及Blender模型建模软件,直接将当前相机视景中的瓦片文件合并导出成一个obj或者fbx文件,再通过Blender进行模型合并成一个大的模型文件,最后使用obj生成3DTiles瓦片数据。这种技术路线直接,但是很繁琐,因为要获取高分辨率数据,需要不停移动场景,再通过工具生成模型,获取一屏数据还好,如果是获取整个大范围,每一屏都需要人工干预,非常耗费人工,而且要按照谷歌建立22层级LOD,很困难。这不禁让人想起之前获取谷歌影像数据的方法,当时也是按照IP限流,下载到指定数量后,IP就被谷歌官方封禁了,有人想出了奇招,获取当前窗口像素宽高和地理范围大小,再通过自动平移地图,对当前窗口进行截屏,这样就获取了当前窗口屏幕地理范围大小范围的影像,再进行瓦片切分,生成影像瓦片数据。
2.既然谷歌已经生成3DTiles数据,那直接把这份数据爬下来不就行了,很可惜,这份数据是按访问次数收费的,想全部爬下来,花的钱也不少,但是Cesium ion已经集成了这份数据,可以通过这个平台进行爬取,这种方式好处很直接能够下载直接用,坏处是谷歌地球倾斜模型数据一年至少更新6、7次,数据更新时,无法及时获得最新的3DTiles数据。。
2.有没有可能不借助RenderDoc,Blender等人工工具干预,直接解析谷歌最新原始瓦片数据,生成3DTiles数据呢,谷歌数据虽然是二进制数据,但是解析后也是Mesh格式,很多格式都通用的,那就逐瓦片解析,直接生成3DTiles的b3dm数据,我通过长时间不懈努力,证明这路线是可行的,能够完全生成谷歌1~最高级瓦片数据,与谷歌官方生产的3DTiles数据相比,显示性能和显示效率更好。
谷歌倾斜模型转换工具已经升级到V1.1版本,能够在一键设置且无人值守的情况下,6小时完成香港地区500多平方公里共计520GB的3DTiles数据生产,共计1~22级,10小时完成台湾地区台北、台中、桃园共计900多平方公里共计1TB的1-22级3DTiles数据生产,生产效率相当高。
目前生产出了澳门、香港以及台湾台北、桃园和台中地区的样例数据。澳门地区大约有50多平方公里面积,香港地区有500多平方公里,台湾地区共计900平方公里,覆盖了谷歌地球上香港、澳门和台湾地区的倾斜模型覆盖区域。视频效果可以看看下面的视频
台湾3DTiles数据一镜到底
从视频中可以看出,在Cesium上只加载了arcgis影像地图的情况下加载转换后的台湾3DTiles数据,场景缩放、平移、旋转时,1-22级3DTiles数据加载相当丝滑,毫无卡顿迟滞感!
生产出来的3DTiles数据包括json文件和b3dm文件,和卫星影像数据一样,都是静态数据,使用Nginx即可发布,发布方法可以参考我之前的文章(中国34个省份12.5m分辨率高程地形瓦片数据), 前端Cesium接入示例代码如下:
let tileset = await Cesium.Cesium3DTileset.fromUrl(
"http://localhost:8802/tileset.json");
viewer.scene.primitives.add(tileset);
viewer.scene.globe.depthTestAgainstTerrain = false;
需要注意的是,使用3dtiles数据,需要关闭depthTestAgainstTerrain,否则会有地形高程遮挡显示问题。
谷歌倾斜模型转换工具成果实现了对谷歌倾斜摄影数据的逆向解析以及转换成3DTiles格式数据,相比较使用RenderDoc、Blender等工具,耗费人工工时大大减少,在建立数据LOD及显示效率上大大增强,同时将谷歌最新的全球倾斜模型数据转换生成3DTiles数据,成为可能!