Cesium Terrain / Cesium 地形生成方案
在成功渲染出Cesium三维视图之后,接下来必不可少的一步就是加载三维地形。根据官方GitHub仓库的Cesium Terrain的定义如下
A terrain tileset in quantized-mesh-1.0 format is a simple multi-resolution quadtree pyramid of meshes. All tiles have the extension .terrain
详细技术规格和实现原理可以参考 github.com/CesiumGS/qu…
一、Cesium Terrain 生成方案
1) Cesium Lib
网络上找到最多的生成 Cesium 地形的方法就是下载 CesiumLab,我之前参与过的项目合作方也是使用CesiumLab,如果可以免费的话会是一个很方便的选择。
2)Cesium-Terrain-Builder
我找到了2个版本的 Cesium-Terrain-Builder
1. cesium-terrain-builder
我直接直接装在机器上可以运行对应的命令来切片的,参考GitHub下的文档成功等到了terrian tiles。然后这个功能却未能生成 layer.json。在 issues 里面看到说推荐使用dokcer版本的 cesium-terrain-builder
2. cesium-terrain-builder-docker
Docker 版本的工具安装也很难简单,使用文档中的方法确实也等到terrain tiles,使用 Docker 版本至少以下三个优点:
- docker 版本安装简单,且不受本地系统环境的干扰
- docker 版本镜像中集成了GDAL,可以直接使用。我也是经过很多次尝试才发现,GDAL版本影响docker版本 cesium-terrain-builder 的运行结果,比如无法读取gdal dataset
- docker 版本支持
.vrt
,相对.tif
的DEM数据,体积要小了很多。
我想使用 docker 比较熟悉的话应该 dem到terrain的数据生成与数据发布可以做成流水线的功能实现自动化。下面的实现步骤是基于 ‣ 的解决方案,
二、地形文件生成
1)环境与数据
- 环境只要能安装Docker并正常运行就行了
- 数据方面,就是DTM,DEM,DSM都行,我自己测试的时候用的DTM
2)操作步骤
1. 安装好Docker后拉取CTB的镜像, 镜像地址:tumgis/ctb-quantized-mesh
docker pull tumgis/ctb-quantized-mesh
2. 运行镜像
# 第一运行容器,成功后会进到容器里面
docker run --name ctb -t -i tumgis/ctb-quantized-mesh:latest /bin/bash
# 如果退出了之后,再次进入容器里面可以用下面的命令
# 如果容器运行需要先启动容器
docker start ctb
# 进入到容器
docker exec -it ctb bash
3. 拷贝数据到容器
数据就是上面提到的DTM,数据格式可以是.tif
或者.vrt
,我测试的时候两个都试过都能成功生产地形数据。
坐标最好是WGS84-EPSG:4326,这个是Cesium支持的坐标系,如果数据是其他坐标需要统一到这个。
⚠️ 特别注意,如果需要做数据处理,如格式转换,坐标系转换等操作最好都用这个镜像里面已经有的 GDAL
来做,否则在后面生成地形数时,CTB工具会报错说不认识这GDAL数据集。
docker cp /$PATH_TO_YOUR/dtm.tif ctb:/data
确认数据格式与坐标系
4. 生成地形文件
数据准备好了之后,下一步就是生成地形文件,过程可能需要几分钟,由数据量和机器性能大小决定的。
ctb-tile -f Mesh -C -N -o terrain dtm/dtm.tif
上一步生成完了之后可以看到.terrain文件都有了,但实际使用时需要还需要一个layer.json
文件
ctb-tile -f Mesh -C -N -l -o terrain dtm/dtm.tif
三、地形数据发布
地形文件发布最简单的方法就是找个WebServer把数据发出去就是了,我自己就是用的Nginx。上面数据生成之后也很容易就能用Nginx发布,但是前端调用的时候却报错。
经过一波猛烈的Google之后,最后定位到问题,也找到了解决方案。上面步骤是没有问题的,问题是在nginx的配置。
因为CTB生成的地形文件是gzip
压缩文件,所以WebServer里面也需要添加想要的gzip
配置保证数据能在前端被正确解析。下面就是我测试用的nginx配置
# 文件路径:/etc/nginx/nginx.conf
user root;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
# 文件路径: /etc/nginx/conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /root/;
index index.html;
}
# !!!!!!!
# !!!!!!!
# 重点就下吗的配置,处理跨域和gzip
location /terrain {
alias /root/terrain;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
location ~* .terrain$ {
add_header Content-Disposition 'attachment;filename=$arg_filename';
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Content-Encoding "gzip";
add_header Content-Type "application/octet-stream";
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
综上,生产地形就实现了,大家可以按照步骤实际操作一次,如果有问题可以留言。下面是我解决问题用到的问题,感觉兴趣可以进去看看。后面会陆续出更多,关于CesiumJS的分享。
四、参考文档
1. https://github.com/geo-data/cesium-terrain-builder/blob/master/docker/README.md
2. https://blog.csdn.net/dongdong9223/article/details/71425077
3. https://registry.hub.docker.com/r/homme/cesium-terrain-builder
4. https://help.hcltechsw.com/commerce/9.0.0/developer/tasks/tigentercontainer.html
5. https://github.com/geo-data/cesium-terrain-builder
6. *https://github.com/tum-gis/cesium-terrain-builder-docker
7. https://github.com/geo-data/cesium-terrain-builder/issues/96
五、一些注意事项
宿主机将tif文件拷贝至容器内
docker cp D:/xg.tif ctb:/data
进入容器 执行以下代码切片
ctb-tile -f Mesh -C -N -o terrain xg.tif
构建 layer.json
ctb-tile -f Mesh -C -N -l -o terrain xg.tif
将切好的数据拷贝至宿主机
docker cp ctb:/data/terrain .
本站文章除注明转载外,均为原创文章。转载请注明:文章转载自:
葱爆GIS—刘博方GIS博客(
https://liubf.com )
近期文章
文章归档
- 2024年9月 (3)
- 2024年6月 (1)
- 2023年12月 (2)
- 2023年7月 (2)
- 2023年6月 (1)
- 2023年5月 (2)
- 2023年4月 (1)
- 2023年3月 (1)
- 2022年11月 (1)
- 2022年10月 (2)
- 2022年9月 (1)
- 2022年8月 (1)
- 2022年3月 (1)
- 2022年2月 (1)
- 2022年1月 (1)
- 2021年11月 (1)
- 2021年9月 (1)
- 2021年7月 (1)
- 2021年6月 (5)
- 2021年5月 (2)
- 2021年4月 (5)
- 2021年2月 (3)
- 2021年1月 (2)
- 2020年12月 (7)
- 2020年11月 (1)
- 2020年9月 (6)
- 2020年4月 (2)
- 2020年3月 (2)
- 2020年2月 (1)
- 2020年1月 (3)
- 2019年12月 (9)
- 2019年11月 (7)
- 2019年10月 (1)
- 2019年8月 (4)
- 2019年7月 (1)
- 2019年5月 (2)
- 2019年4月 (3)
- 2019年3月 (4)
- 2019年2月 (4)
- 2019年1月 (4)
- 2018年12月 (3)
- 2018年11月 (8)
- 2018年10月 (3)
- 2018年9月 (9)
- 2018年8月 (12)
- 2018年7月 (10)
- 2018年6月 (6)
- 2018年5月 (24)
- 2018年4月 (15)
- 2018年3月 (23)
标签
apache (1)
Arcgis (8)
ArcgisServer (2)
cesium (19)
css (4)
ES6 (2)
ftp (1)
geoserver (15)
geowebcache (3)
gis (30)
git (2)
github (2)
html (1)
iis (1)
javascript (15)
jwt (1)
koa2 (1)
leaflet (1)
mongoDB (2)
Nginx (3)
nodejs (1)
npm (1)
php (2)
PostGIS (8)
PostgreSQL (8)
postsql (1)
readme (1)
sass (2)
Skyline (4)
sublime (1)
SVN (3)
terrain (1)
uDig (2)
Vue (18)
webpack (5)
wordpress (1)
作品演示 (5)
反向代理 (2)
排序算法 (1)
理论思维 (3)
系统架构 (2)
跨域 (1)