3dtiles测试数据下载
3DTiles协议设计用于流式处理和渲染大量3D地理空间内容。本文主要研究如何下载Cesium官方提供的测试数据,以便更好的研究3dtiles格式。
总述
本文通过nodejs代码实现了从CesiumIcon下载测试3dtiles数据。下载的数据来源如下网址:
https://sandcastle.cesium.com/?src=3D%20Tiles%20Feature%20Picking.html
下载数据保存内容如下:
实现
涉及到的相关类库
名称 | 作用 |
reques |
用于http的请求 |
zlib |
对压缩数据的解压 |
fs |
写文件 |
path |
获取文件的路径 |
调用流程:
首先获取tileset.json文件,然后解析所有children对象,获取所有content的uri。即下面红色的地址,保存到一个队列。tileset的格式可以参考官方文档:https://github.com/CesiumGS/3d-tiles/tree/master/specification#tileset-json
大概格式如下图所示:
然后再通过http请求把所有url的数据请求下来并保存成文件。如果遇到url的格式是json,那么重新进入开头的流程。
主要实现
1、获取tileset的所有content的uri
这里采用的一个递归函数来实现。首先遍历当前children的所有对象,如果是content就把url保存起来,如果又是一个children那么就递归调用,最后将所有的uri保存到一个数组里面。伪代码如下:
function getChildrenUrl(children: any) {for (let i = 0; i < length; i++) {const _child = children[i]if (_child.hasOwnProperty('content')) {stack.push(_child.content.uri)}if (_child.hasOwnProperty('children')) {stack = stack.concat(getChildrenUrl(_child.children))}}return stack
}
2、同时发起N个http的请求下载tile
正常的逻辑遍历uri的队列,一个下载完之后再去下载接下来的一个数据。伪代码如下:
while (totalUrl.length > 0) {let tileUrl: string = totalUrl.pop()await downloadTile(tileUrl)}
但是由于我们数据量比较大,一个一个下载太耗费时间,所以我们需要设计成可以支持同时指定路数的并发下载。再看下面的代码
while (totalUrl.length > 0) {let tileUrl: string = totalUrl.pop()downloadTile(tileUrl)}
这段代码和开始代码最大的区别就是去掉了await。这样带来的后果就是会把http请求一次性全部发送数据。不过这肯定无法接受,因为无论是网络带宽还是后台服务都扛不住。不过我们可以改造一下这段代码,增加一个标志位,比如如果当前的http并发请求超过5路,我们就让while循环睡眠50毫秒,接下来再检查当前的并发路数,如果小于5路了,就可以再次发起请求了。伪代码如下:其中maxDownload为全局参数,用来设置http的并发路数。
while (totalUrl.length > 0) {if (taskNumber.currentTask > maxDownload) {await sleep(50)continue}let tileUrl: string = totalUrl.pop()downloadTile(tileUrl, taskNumber)}
这里说一下sleep函数,这个函数在nodejs中并不存在,不过我们可以通过
setTimeout来进行模拟,伪代码如下:
//模拟线程的休眠
function sleep(ms: number) {return new Promise((resolve) => setTimeout(() => resolve(0), ms))
}
3、cesiumIcon下载数据
我们代码编写好之后,还需要知道去哪里下载数据。这里讲述了如何通过浏览器网络调试获取cesiumIcon的3dtiles的url地址以及如何通过权限校验。看下图:
url的地址如下:
https://assets.cesium.com/75343/tileset.json?v=1
鉴权如下
Authorization:
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjM2E5NjM1ZS03MzMxLTRlNTQtYTk0Yi01NDU0MjkyMzE5NGUiLCJpZCI6MjU5LCJhc3NldHMiOnsiNzUzNDMiOnsidHlwZSI6IjNEVElMRVMifX0sInNyYyI6ImRlZmE0YTY1LTQ0MTUtNDEzZi1hMTBhLWU5MWVjM2Y4MDJjNiIsImlhdCI6MTYxNzU0MDEyNiwiZXhwIjoxNjE3NTQzNzI2fQ.SaNdWVx_-zBuKzSXBPJ-iPut48W3Iwlz2eTegbQf450
有了上述两个数据,我们就可以通过本工具去下载3dtiles数据了。
写在最后:
可以关注本人公众号:
迷途小书童爱读书
或者扫描如下二维码:
回复3dtiles下载
即可获得已经下载好的一份官方3dtiles测试数据以及nodejs的代码。
3dtiles测试数据下载相关推荐
- 【CCF】CSP-J/S 2019第二轮认证测试数据下载
CSP-J/S 2019第二轮认证测试数据 点击免费下载
- php 获取文件给用户下载,php 下载文件/直接下载数据内容
思路步骤 * 定义参数 * 魔术方法 * 执行下载 * 获取设置属性函数 * 获取设置文件mime 类型 * 获取设置下载文件名 * 设置header * 下载函数 实现代码 class DownFi ...
- 本地Android源代码库下载源码
1. 安装repo 新建放置repo的bin目录 $ mkdir ~/bin $ echo "export PATH=~/bin:\$PATH" >> ~/.bashr ...
- BIGEMAP下载等高线(高程)使用教程
BIGEMAP下载等高线(高程)使用教程 发布时间:2018-01-17 版权: 同步视频教程:http://www.bigemap.com/video/play2018020643.html 专题 ...
- 矢量数据下载【道路路网(公路、铁路)、水系、建筑物轮廓、地名等等】
矢量数据.数据珍贵.谨慎下载 同步视频教程:http://www.bigemap.com/video/play2018020621.html 专题地图制作视频教程:http://www.bigemap ...
- BIGEMAP矢量数据下载【道路路网(公路、铁路)、水系、建筑物轮廓、地名等等】
矢量数据.数据珍贵.谨慎下载 同步视频教程:http://www.bigemap.com/video/play2018020621.html 专题地图制作视频教程:http://www.bigemap ...
- 如何下载并生成等高线
同步视频教程:http://www.bigemap.com/video/play2018020643.html 专题地图制作视频教程:http://www.bigemap.com/video/pl ...
- JCVI安装以及数据下载(用于共线性分析)
JCVI安装以及数据下载(MCScan) 安装 最简单的方法是通过PyPI安装它: pip install jcvi#或者安装开发版本 pip install git+git://github.com ...
- ALOS全国12.5米精度数字高程DEM测试用数据下载地址
在日常工作中会经常使用到数字高程数据,目前免费开放的大多数均是90m.30m精度的数据,最近12.5m精度的数据在网上广为流传,但是出于种种原因,很难获取,现就此数据做个简单介绍. ALOS是日本的对 ...
最新文章
- 数人云轻量级PaaS将弹性做到极致
- 教你如何创建类似QQ的android弹出菜单
- Mybatis系列(三):Mybatis实现关联表查询
- LINUX防火墙打开与关闭
- JavaScript 事件机制
- PHP连接sql seaver数据库
- Delphi---TServerSocket和TClientSocket发送和接收大数据包
- diy 扫地机器人 滚刷_扫地机器人无法完成的使命,莱克吉米W7智能洗地机帮你完成...
- __proto__VS。 JavaScript原型
- Python Numpy模块函数np.c_和np.r_学习使用
- 博弈论分析题_最新博弈论复习题及答案分析
- linux中rar文件包的解压方式
- 非线性控制1.0——模糊控制理论基础
- 【渝粤题库】陕西师范大学201901 中国古代文学(二) 作业(高起专)
- 高效技巧篇:化繁为简、高效使用金蝶K3WISE(金蝶K3WISE-主控台编辑)
- 计算机硬盘是输出还是输入,输入输出
- 安卓手机上通过termux安装ubuntu
- 基于Android的理财app开发,基于Android的个人理财系统的设计与实现.doc
- jzoj3461. 小麦亩产一千八 斐波拉契数列
- 程序员之间的鄙视链,冥冥之中好像有那么一丝道理
热门文章
- 转 Linux查看文件编码格式及文件编码转换
- Android使用adb命令
- javascript小技巧(转自DooIT)http://www.cnblogs.com/ttyp/archive/2004/11/15/63900.html
- Vue学习笔记之11-slot插槽
- 火柴人小程序linux,火柴人手绘小程序
- python idle连接失败_不能通过IDLE从Explorer运行Python [2013] - IDLE的子进程没有连接...
- jdk8 HashMap初始化和扩容机制
- 关于delphi中多线程采用定时器的做法
- CSS3 transform-style 属性
- BZOJ 1833 数位DP