台湾一直是国内研究的重点方向,最主要的原因是祖国统一大业尚未完成,加上当前国际局势比较复杂,台湾及周边有众多不稳定因素,美国、日本等国家与台湾地区当局一直保持着紧密关系,成为祖国统一进程的一大阻碍。在国内众多研究台湾的方向中,台湾地理空间环境研究一直是热点方向,这也让我的产品研发方向有一定的侧重点,一方面谷歌等全球级倾斜摄影数据转换成3DTiles和OSGB格式,另一方面,收集转换台湾地区数据,包括地形、建筑模型以及倾斜摄影数据,能够加载到我们常用的GIS或三维可视化平台上来。台湾的地形和建筑模型数据都有介绍,之前发布过台湾10米DEM数据和2024年全台湾建筑模型数据,对于台湾的三维倾斜摄影模型,我发布了3DTiles转换工具 V1.1版以及OSGB V2.0版,除了谷歌地球上台北、台中、桃园这三个地区的数据外,台湾其他地区的倾斜摄影都没有相关介绍。
一、开发背景
之前一直未向大家介绍台湾其他地区的三维倾斜摄影模型数据,主要是谷歌三维倾斜摄影转换成3DTiles和OSGB研发工作比较复杂,产品迭代持续了比较长的时间,针对台湾其他地区三维倾斜摄影模型数据转换工作没有开展。上次发布了谷歌三维倾斜摄影OSGB数据V2.0版本后,便紧锣密鼓开始进行这项工作的预研与研发。台湾的倾斜摄影数据主要都是台湾官方测绘部门进行生产及发布使用的,出于数据保密的需要,官方发布时采用了自定义二进制数据,其显示也并非Cesium等常用三维GIS平台。因此数据既非我们常用的3DTiles、OSGB等格式,也无法在Cesium和OsgEarth上加载使用。我经过两个月的大量预研与研发,在产品研发截止日期前,顺利解决了诸多技术难题,将台湾官方公开的三维倾斜摄影数据转成了我们常用的3DTiles格式,并成功加载到Cesium上显示。
二、数据范围
目前台湾官方公开的三维倾斜摄影数据覆盖地区约有100平方公里,包括新竹、台中、台南、高雄、台东、花莲等县市,比较遗憾,未有覆盖整个县市的数据发布,主要以样例数据为主,覆盖面积大小不等,有的覆盖整个岛屿,比如兰屿岛,做到了全岛覆盖,大约有50平方公里,有的只有2平方公里,总体而言,公开的数据是越来越多,覆盖区域也是越来越大。
三、数据介绍
这次给大家介绍的是台湾高雄青埔车站及周边区域的3DTiles数据。数据分辨率能够达到3cm,比谷歌地球的三维倾斜摄影数据还要高,主要覆盖台湾高雄青埔车站和周边区域,面积有2平方公里,面积虽小,但是数据量高达29.5GB。
四、数据使用
前面文章中已经介绍过,3DTiles数据都是静态文件,使用Nginx直接静态代理即可,无需部署发布程序,这里分享一个nginx.conf里Server的样例,大家可以直接粘贴过去,修改root对应的路径。
server
{
listen 8804;
server_name localhost;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Access-Control-Allow-Origin "$http_origin";
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods 'GET, POST,OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
location / {
autoindex on;
root D:/GXQP-3DTILES/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
同时在前端Cesium上接入也比较容易,创建Cesium3DTileset对象,加入到pirmitives,同时需要注意的是,depthTestAgainstTerrain要设置成false,否则会有地形遮挡显示问题。下面是示例代码:
let tileset = await Cesium.Cesium3DTileset.fromUrl(
"http://localhost:8804/tileset.json");
viewer.scene.primitives.add(tileset);
viewer.scene.globe.depthTestAgainstTerrain = false;
我将数据使用Nginx进行代理发布后,加载到CesiumJS上进行可视化展示,Cesium是1.121.1版本,底图是ESRI卫星影像瓦片,显示效果请看下面截图。
五、结语
受限于官方数据来源,目前数据覆盖区域范围比较小,还没形成比较大的使用价值,象征意义大于使用价值,但是我已经开发好了转换工具,待官方发布新的数据,我会第一时间进行转换,同时也会对转换工具进行更新迭代。