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测试数据下载相关推荐

  1. 【CCF】CSP-J/S 2019第二轮认证测试数据下载

    CSP-J/S 2019第二轮认证测试数据 点击免费下载

  2. php 获取文件给用户下载,php 下载文件/直接下载数据内容

    思路步骤 * 定义参数 * 魔术方法 * 执行下载 * 获取设置属性函数 * 获取设置文件mime 类型 * 获取设置下载文件名 * 设置header * 下载函数 实现代码 class DownFi ...

  3. 本地Android源代码库下载源码

    1. 安装repo 新建放置repo的bin目录 $ mkdir ~/bin $ echo "export PATH=~/bin:\$PATH" >> ~/.bashr ...

  4. BIGEMAP下载等高线(高程)使用教程

    BIGEMAP下载等高线(高程)使用教程 发布时间:2018-01-17 版权:  同步视频教程:http://www.bigemap.com/video/play2018020643.html 专题 ...

  5. 矢量数据下载【道路路网(公路、铁路)、水系、建筑物轮廓、地名等等】

    矢量数据.数据珍贵.谨慎下载 同步视频教程:http://www.bigemap.com/video/play2018020621.html 专题地图制作视频教程:http://www.bigemap ...

  6. BIGEMAP矢量数据下载【道路路网(公路、铁路)、水系、建筑物轮廓、地名等等】

    矢量数据.数据珍贵.谨慎下载 同步视频教程:http://www.bigemap.com/video/play2018020621.html 专题地图制作视频教程:http://www.bigemap ...

  7. 如何下载并生成等高线

      同步视频教程:http://www.bigemap.com/video/play2018020643.html 专题地图制作视频教程:http://www.bigemap.com/video/pl ...

  8. JCVI安装以及数据下载(用于共线性分析)

    JCVI安装以及数据下载(MCScan) 安装 最简单的方法是通过PyPI安装它: pip install jcvi#或者安装开发版本 pip install git+git://github.com ...

  9. ALOS全国12.5米精度数字高程DEM测试用数据下载地址

    在日常工作中会经常使用到数字高程数据,目前免费开放的大多数均是90m.30m精度的数据,最近12.5m精度的数据在网上广为流传,但是出于种种原因,很难获取,现就此数据做个简单介绍. ALOS是日本的对 ...

最新文章

  1. 数人云轻量级PaaS将弹性做到极致
  2. 教你如何创建类似QQ的android弹出菜单
  3. Mybatis系列(三):Mybatis实现关联表查询
  4. LINUX防火墙打开与关闭
  5. JavaScript 事件机制
  6. PHP连接sql seaver数据库
  7. Delphi---TServerSocket和TClientSocket发送和接收大数据包
  8. diy 扫地机器人 滚刷_扫地机器人无法完成的使命,莱克吉米W7智能洗地机帮你完成...
  9. __proto__VS。 JavaScript原型
  10. Python Numpy模块函数np.c_和np.r_学习使用
  11. 博弈论分析题_最新博弈论复习题及答案分析
  12. linux中rar文件包的解压方式
  13. 非线性控制1.0——模糊控制理论基础
  14. 【渝粤题库】陕西师范大学201901 中国古代文学(二) 作业(高起专)
  15. 高效技巧篇:化繁为简、高效使用金蝶K3WISE(金蝶K3WISE-主控台编辑)
  16. 计算机硬盘是输出还是输入,输入输出
  17. 安卓手机上通过termux安装ubuntu
  18. 基于Android的理财app开发,基于Android的个人理财系统的设计与实现.doc
  19. jzoj3461. 小麦亩产一千八 斐波拉契数列
  20. 程序员之间的鄙视链,冥冥之中好像有那么一丝道理

热门文章

  1. 转 Linux查看文件编码格式及文件编码转换
  2. Android使用adb命令
  3. javascript小技巧(转自DooIT)http://www.cnblogs.com/ttyp/archive/2004/11/15/63900.html
  4. Vue学习笔记之11-slot插槽
  5. 火柴人小程序linux,火柴人手绘小程序
  6. python idle连接失败_不能通过IDLE从Explorer运行Python [2013] - IDLE的子进程没有连接...
  7. jdk8 HashMap初始化和扩容机制
  8. 关于delphi中多线程采用定时器的做法
  9. CSS3 transform-style 属性
  10. BZOJ 1833 数位DP