当前位置:网站首页 > 数据科学与大数据 > 正文

3dtiles文件下载(3dtiles数据下载)



要想找到属性信息,首先要把需要的属性保存到3dtiles文件里。另外fbx本身没有属性,需要外挂属性

3dtiles直译过来就是三维瓦片的意思,是用来存储倾斜摄影数据的一种开发标准格式。

我们通常看到的本地3dtiles数据,不是一个文件,而是一个文件夹,内部会有很多文件。

其中tileset.json几乎是标配,它是索引文件,类似于网页的index.htm。偶尔也有一些软件生成的3dtiles数据没有tileset.json文件,但是无论如何都会有一个xxx.json文件。

除了tileset.json文件以外,内部还会有xxx.b3dm、xxx.i3dm等等文件。

一般情况下看到文件夹中有tileset.json或者xxx.b3dm或者xxx.i3dm,则表示它大概率是一个3dtiles数据。

本地离线3dtiles数据可以用这个工具来查看:My3dtiles

My3dtiles的介绍看这里:wolai.com/earthsdk/s5ZX

json是后缀,即文件的扩展名,如果您在本地电脑看不到后缀,建议文件管理器的查看中配置显示后缀。

玩转3D数据标准——3D Tiles - 知乎 (zhihu.com)

Cesium官方对3dtiles的介绍:cesium.com/why-cesium/3

github上的3dtiles标准协议:github.com/CesiumGS/3d-

1、文本通过python3.x版本实现下载完整3DTiles模型;

2、支持gzip压缩的文件自动解压;

3、脚本下载以cesium官网示例包含的3dtiles文件为例实现,如遇到其他无法下载情况欢迎私信、留言;

4、展示直接引用 js文件,使用的在线cesium 1.116 版本cdn;

5、登录、授权信息通过添加固定的Header信息实现;

在线访问地址:stone.fren.ink/demo/ces

最终效果图

1、通过浏览器访问3D TilesCesium在线效果;并获取tileset.json文件地址

访问系统地址,获取3DTiles文件路径

2、获取授权信息,不过不添加授权信息,会提示HTTP Error 401: InvalidCredentials

授权信息通过请求头查看,不同的网站请求头不一样,需要根据下载的3Dtileset授权方式调整

授权请求头信息

3、通过python脚本解析tileset.json内容并进行递归下载b3dm文件

脚本未引用第三方package包,http、https请求通过python内置的urllib.request实现。模型文件下载到脚本同级目录data文件夹下。

文件下载后效果

脚本引用的模块

#coding:utf8 import urllib.request #json解析库 import json #本地文件操作 import os import io #https import ssl #日志打印 import traceback

2、定义下载3d模型地址,及请求的授权信息,就是通过浏览器探到的地址及token信息

#模型文件地址(不带tileset.json后缀) url="https://assets.ion.cesium.com/ap-northeast-1/40866/" # 解决需要token验证问题,可添加对应的头信息 header={ "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/ Firefox/34.0", # "Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkMjhjNDhmNS0zYzY1LTRjY2ItYTlmMC1lMTk0NjhlOWRmOWIiLCJpZCI6MjU5LCJhc3NldElkIjo0MDg2NiwiYXNzZXRzIjp7IjQwODY2Ijp7InR5cGUiOiIzRFRJTEVTIn19LCJzcmMiOiI3ODZkMDQzOS03ZGJjLTQzZWUtYjlmYy04ZmM5Y2UwNzNhMmYiLCJpYXQiOjE3MTMzNTkwOTIsImV4cCI6MTcxMzM2MjY5Mn0._vVLWGA97rb5aaEZVa5sLUfac6kn_VFWWPv2ibHGlOo" }

2、下载json文件

#下载titleset索引文件 def downloadJson(url,fileName): request = urllib.request.Request(url + fileName, headers=header) response = urllib.request.urlopen(request) # 取出json文件里的内容 tilesetData = response.read() # 判断是否经过了gzip压缩 contentEncoding = response.info().get('Content-Encoding') if contentEncoding is not None and contentEncoding.index("gzip") != -1: tilesetData = ungzip(tilesetData) if not os.path.exists("data"): # 创建新目录 os.makedirs("data") # 把结果写入到tileset.json文件中 with open("data/" + fileName, "w") as f: f.write(tilesetData.decode("utf-8")) return tilesetData

3、解析json根据内容下载b3dm文件

#下载数据,递归循环,判断uri有值创建对应的文件夹,下载相应文件 def downloadFile(node): #判断有没有b3dm,有则下载文件 if node is not None and 'content' in node and "uri" in node["content"]: filePath = node['content']['uri'] # 根据路径解析,除最最后一级为具体文件,其他为文件夹名称,根据名称及层次创建对应的文件夹 parentPath = filePath[0:filePath.rfind("/")] fileName = filePath[filePath.rfind("/") + 1:] # 多级目录替换成系统的路径分隔符 parentPath = "data" + os.sep + parentPath.replace("/", os.sep) savePath = parentPath + os.sep + fileName #创建父级文件夹 if not os.path.exists(parentPath): os.makedirs(parentPath) if(os.path.exists(savePath)): print(savePath+"文件已经存在") else: try: opener = urllib.request.build_opener() opener.addheaders = list(header.items()) urllib.request.install_opener(opener) a, b = urllib.request.urlretrieve(url + filePath, savePath) keyMap = dict(b) if 'Content-Encoding' in keyMap and keyMap['Content-Encoding'] == 'gzip': # 以读写模式打开 objectFile = open(savePath, 'rb+') data = objectFile.read() data = gzdecode(data) objectFile.seek(0, 0) objectFile.write(data) objectFile.close() print(url + filePath) except Exception: print('下载流文件异常:' + url + filePath) trace_err = traceback.format_exc() print(trace_err) #有下级数据,继续递归 if node is not None and 'children' in node and node['children'] is not None: for item in node['children']: downloadFile(item)

4、有些网站会对文件进行gzip压缩提高网络请求效率,这种情况需要对接收后的文件进行gzip解压

# 部分网站数据进行了gzip 压缩,需要进行解压处理 def ungzip(data): try: data=gzip.decompress(data) except: pass return data #解压网络gzip流文件 def gzdecode(data): compressedStream = io.BytesIO(data) gziper = gzip.GzipFile(fileobj=compressedStream) data2 = gziper.read() # 读取解压缩后数据 return data2

5、下载过程中会打印下载日志,如果发现本地已经存在同名的文件则会跳过下载。

模型文件下载日志

1、引入cesium组件,此处只是演示加载本地的3dtiles效果,直接通过引用在线的cesiumjs实现

<script src="https://cesium.com/downloads/cesiumjs/releases/1.116/Build/Cesium/Cesium.js"></script> <link href="https://cesium.com/downloads/cesiumjs/releases/1.116/Build/Cesium/Widgets/widgets.css" rel="stylesheet">

2、定义Cesium展示容器

<div id="cesium_container" style="height:100%;width:100%;margin:auto;"> </div>

3、加载3dTiles模型

//Cesium Token Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI2ODU5MWU4Ni0xMmUxLTRkNWUtOTcwYS05NTRhYzNkMTVmOGYiLCJpZCI6MTE2NDIsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1NTk1Mjg2MzZ9.6Nd7SV1Cn1TS4qmdRYlfMk_VKjPyFyKAZmPe-UtcyvI'; const viewer = new Cesium.Viewer("cesium_container", { terrain: Cesium.Terrain.fromWorldTerrain(), }); //异步加载3D tiles async function load3Dtiles(tilesetUrl){ tileset = await Cesium.Cesium3DTileset.fromUrl(tilesetUrl); viewer.scene.primitives.add(tileset); //加载完成后缩放到模型位置  viewer.zoomTo(tileset); } load3Dtiles('data/tileset.json'); 

完成3dTiles模型本地访问

本地访问3dtiles效果

My3dtiles一旦启动,它本身就是一个静态文件服务器,可以当做静态文件服务器来使用。但是这个服务器只能在本机使用,其他机器仍然不可访问。

使用方法很简单。启动My3dtiles。然后选择工具 → 本地文件url

在弹出的窗口中填写一个本地文件路径。我这里填写的是D:\test\my3dtiles.png,务必保证此文件真实存在。然后点击确定。


http://localhost:9189/f/D:/test/my3dtiles.png


对于png文件,也许没有使用浏览器打开的必要。但是对于html文件就不一样了,可以省去在本地再开启http服务器的繁琐操作。

对于html文件来说,直接把html文件拖拽到My3dtiles,就会直接用My3dtiles内置浏览器打开这个网页了。

直接打开一个内置浏览器,查看网页。

也可以复制地址栏中的网址,在本地安装的其他浏览器中打开。

My3dtiles自带的压平面只能压出一个矩形区域,但是和CzmTexture配合,就可以压平成任意形状。


我使用的图片在这里


My3dtiles中使用本地资源时,需要使用环境变量${LF}。

为何不能直接填写路径地址,因为路径需要同时支持网络图片资源和本地图片资源。网络图片资源可以直接填写http地址,而本地图片资源需要使用${LF}来区分一下。

假定一个本地文件路径的地址是:

C:\Users\vtxf\Downloads\smile-fill.png

那么实际使用时需要这样:

${LF}C:\Users\vtxf\Downloads\smile-fill.png

即使用${LF} + 本地文件路径 的方式。

  1. 假定我们有一张图片smile-fill.png,它的路径是
C:\Users\vtxf\Downloads\smile-fill.png ![](https://secure2.wostatic.cn/static/cjcr1kx9JwFPVtD2wYrSCk/image.png?auth_key=-bkTPPXXHXvnJ9nS1Pe4pRk-0-ba7aade1d24b2125a0f6772c9d)
  1. 打开My3dtiles,新建一个图片模型


图片模型初始创建会显示一个默认的图片。图片url属性的默认值是


${xe2-assets-script-dir}/xe2-assets/scene-manager/images/location.png ![](https://secure2.wostatic.cn/static/wQeSiJCvZ2FqnFqJTbjNq4/image.png?auth_key=-rxpyg8xCPjVSudZQoy62Q-0-d9c4cb60faab2c230a51ecd9a0c90f84)
  1. 此时可以修改图片url的路径为本地文件的路径
${LF}C:\Users\vtxf\Downloads\smile-fill.png ![](https://secure2.wostatic.cn/static/fxPVJRQDEnXUrfxNdZ76WZ/image.png?auth_key=-dVBrLVeC7ALTe1ZpBm1Ece-0-92c9b359a0c99d48b07f0)
  1. 此时就发现图片模型的图片修改成一个笑脸啦

  1. 保存场景文件后,这个地址也是会保存进去的。下次打开场景文件也可以看到同样的效果。

上面的例子中,虽然保存的场景可以在本地直接打开并使用。但是如果要分享给他人时,就会出现问题。

在另外一台机器上打开会是这个样子。

因为别人在自己机器上打开场景文件时,就找不到这个图片文件。除非把图片文件也拷贝给客户,同时还要保证该文件的路径,和场景文件中存储的文件路径一致!这个要求就有一点高了!

如何解决此问题,请看这里:My3dtiles使用本地文件后无法分享怎么办

click button [ Add / Remove Unit ]: left click to add unit on grid right click to remove unit from grid
  • choose unit in unit list menu, get unit data from selected unit
  • mouse hovered on grid, update hovered tile index
  • mouse left clicked on grid, call AddUnit in BP_CombatSystem
  • AddUnit:
    • check if tile type is valid for unit, for example, some units cannot walk on flying type tiles
    • if there existed unit on tile before, destroy it and reset tile data
    • spawn actor from unit data
    • update index stored in Unit
    • update unit ref stored in tile data
    • set actor location to tile location if tile is valid
    • call onNewUnitSpawned, signify BP_PlayerActions to set current selected unit to unit spawned, set current selected tile to tile unit spawned on
  • mouse right click on tile, if unit on tile is valid, destroy unit, set unit on tile none
Click button [ Move Unit On Grid]: left click to select unit on tile and generate reachables right click to set target and find path for unit, on path found, move it to target
  • mouse hovered on grid, update hovered tile index
  • mouse left clicked on tile or unit, signify BP_PlayerActions to update selected tile and unit
  • BP_Action_SelectTileAndUnit_GenerateReachables is child of BP_Action_SelectTileAndUnit
  • signify BP_PlayerActions to update selected tile and unit
  • generate reachables for selected unit, target set to [-999,-999], other params are from unit data on selected unit
  • bind event to on unit start and finish walking
  • on start walking, clear reachables, de-select tile and unit
  • on finish walking, re-generate and display reachables
Click button [ Move Unit On Grid]: left click to select unit on tile and generate reachables right click to set target and find path for unit, on path found, move it to target
  • on mouse right clicked on grid, set clicked tile to path target
  • do path finding from unit located tile to right clicked tile, set selected unit to current unit (在寻路期间可能会选择其他的unit)
  • on path finding completed,pass path list to current unit and notify it to move
  • in BP_Unit, move event
  • copy and set path data
  • if path len > 0, start moving: set anim state to walking, lerp from current location to next path item location
  • on one tile movement finished, update index in unit and unit on tile
  • 只有玩家的鼠标左键点选操作会改变当前的selected unit,select完成时,Unit已经有高亮的效果,此后只要玩家没有更换角色,角色高亮效果一直存在,直到新的角色被选中
  • 但是Unit移动的过程中,位置一直在发生变化,又没有新的操作,选中的tile就一直是起点的tile,为了让selected tile与角色的移动同步,每当角色离开一个tile,通知player actions de-select那个tile,每当角色到达一个新的tile,通知player actions select那个tile (select包括数据的更新和视觉状态的更新)
  • if you do not select another unit when this unit is moving, selected unit is the same, but selected tile does not change too, so selected tile display will not change, but it should be updated on unit reached a new tile
  • if you select another unit when this unit is moving, selected unit and tile will be updated in select action
在菜单中选择要添加的角色
将角色添加到选中的网格上,更新unit index and tile data, 同时将该网格和其上的角色高亮为选中状态
选择其他角色并添加,每次添加都update unit index and tile data
将操作切换为选择并移动角色,左键选择角色并生成该角色的可移动范围
右键选择终点的tile,生成寻路结果并移动角色,当角色离开上一个tile,取消上一个tile的选中效果;当角色开始移动,隐藏角色的可达到范围
当角色到达新的tile,选中该tile;当角色到达终点时,重新生成该角色的可到达范围并展示
一个角色移动的过程中,可以选择另一个角色进行移动
寻路的范围根据角色数据(max path len, valid tile types)生成,每个角色可到达的范围都不同
在网格上添加和移动角色https://www.zhihu.com/video/

创建用于管理施法范围和起止点的数据结构 创建用于生成并返回组成施法范围图案的tile index列表 创建用于debug和展示施法范围的按钮和action bp 更新【select / cast spell】按钮左键绑定的事件,绑定为新创建的展示施法范围的action bp - 选择法术类型,更新action bp中的spell data - 左键选中某个tile时,生成并展示以该tile为中心的施法范围图案 - 右键在tile上移动时,如果hover的tile在施法范围内,spawn spell animation
点击【展示施法范围】按钮并设置相关参数
以selected tile为中心显示施法范围
切换其他range pattern
六边形tile的效果
操作切换为select/cast spell, range pattern square
仅在range范围内spawn animation
限定施法范围https://www.zhihu.com/video/

create new data structure to maintain spell cast range pattern and MinMax

设置施法范围的图案类型和起止点

add it to spell data structure

add new tile state for spell range

create child bp of 'BP_SelectTileAndUnit', inherit its select logic and add spell range display logic

clear former spell range, get new spell range indexes for selected tile and add state 'spell range' for them

清除旧的施法范围,根据选中的tile和施法类型获取新的范围并显示

generate spell pattern indexes in base of grid shape and selected origin

for example, you want to display the pattern of line, the line consists of tiles where the spells can reach

展示施法范围,比如该范围是直线型的,组成直线图案的每一个tile就是法术可以到达的位置

  • create a func to generate and return the indexes 创建一个生成tile组成的直线型图案的方法,图案的中心点默认是【0,0】,返回组成该图案的tile位置列表
  • 循环返回的位置列表,给每一个tile的位置加上相对于起点位置的偏移,新的图案就会以选中的tile为中心
  • 具体的生成每一种图案的方法参考教程给出的蓝图链接

展示施法范围

生成图案的方法返回一组组成该图案的tile ind,变量该tile index arr, 改变tile的颜色即可将图案显示出来

set button [Select / Cast Spell] left click to select tile and show spell range , and update spell data in action bp on spell type changed

on selection changed, update cast data in left click action and spell type in right click action

check if target tile index is in spell range before spawn spell, so that spell will only be spawned in spell range

如果想一次性在范围内生成spell animation,可以直接传入spell range作为spawn spell animation的参数

在生成施法范围时添加是否开启视线检测的判断,如果开启视线检测,在返回target inds时移除实现范围外的tile

1. cast data struct 新增用于视线检测debug的变量 包括:是否开启视线检测、视线检测起点高度、起点偏移等 2. 视线检测逻辑,根据传入的origin ind和target ind 做Line trace by channel 检测的对象为collision presets设置为block [LineOfSight] channel的actor 起点为origin tile location, 可以根据需求加上x或y方向的偏移,终点为target tile location 如果tile上有Unit,说明该Unit的是施法对象或发起者,ignore its collision 3. 对上一节中生成的spell range列表逐个进行视线检测,如果经检测origin tile和target tile中间有阻挡的,将之移出spell range
https://www.zhihu.com/video/

add new var to decide use sight tracing or not

add new channel for sight tracing

modify collision preset of grid mesh and modifier mesh, set channel 【LineOfSight】 to block, when tracing line from origin location to target tile location hit the mesh with 【LineOfSight】 set to block, that target tile is not in spell range

for loop target index in spell range, do line trace from origin tile to target tile for them,

  • if hit something, which means no line of sight 不在视线内
  • if hit nothing, which means in line of sight 视线无阻隔,在视线内
remove tiles not in sight from spell range

expand line tracing range by adding offset on start location

起始点修改为tile上的四个点,只要某个点视线能通过就认为检测通过,如果四个点都被阻碍,则认为该tile上的视线被阻碍

Add collision mesh to unit as sight tracing objects

  • use grid shape mesh as unit sight trace collision mesh
  • update its collision mesh on spawned based of grid shape
  • update its collision on reach a new tile( when grid shape is triangle, tile orientation will change on index changed)
  • set collision mesh invisible
碰撞仅用于视线检测
初始化unit时,根据grid类型设置碰撞形状,根据tile尺寸更新碰撞尺寸
设置新的tile index时顺便更新碰撞的朝向

add new float vars in cast structure to set unit height and line tracing start offset , and new bool to trigger debug line display

pass cast when calling func to do sight tracing, use data from cast

add UI to modify params for sight tracing, update cast data on debug params changed

origin unit and target themselves should not block the sight

Line of sight

目前有很多OSGB数据处理软件可以做到倾斜数据的合并。做的好的可以支持不同块大小,不同原点,甚至不同生成软件生成的倾斜数据。

但是在应用端,很多时候是转为3dtiles,在基于Cesium的应用平台上加载倾斜模型。如果涉及到数据合并与更新,那要从原始的OSGB数据开始重新处理一遍,耗时耗力。而且用户希望减少中间环节,要求能在应用程序里就可以更新数据。

这里推荐一款软件ModelSer,与CesiumLab出于同一家公司,包含了CesiumLab中倾斜数据的所有功能,在数据更新方面更进一步,

支持在现有3dtiles服务上追加新的osgb

原始3dtiles
灰色为原始数据,红色为新增数据
合并后的3dtiles

ModelSer是BS架构的,所有功能提供api接口,支持二次开发,也就是说用户可以在自己的应用程序里实现此功能

倾斜模型一般需要修饰才能用,比如水面区域,不加修饰的原始数据如下图。倾斜修改有很多工具,但基本上是桌面端针对原始osgb进行修模。

但有时候需要在业务系统中对数据进行修整,如裁剪,压平等操作,目前都采用前端方法实现,但不能进行多个面的编辑也不能把编辑的结果保存下来。这时就需要使用ModelSer。

原始3dtiles
绘制裁剪包围体
裁剪后的3dtiles

ModelSer支持对3dtiles进行在线编辑修改,修改操作目前支持裁剪内部,裁剪外部,压平等。而且支持二次开发,也就是说用户可以在自己的应用程序里实现此功能

在Cesium中,加载3Dtile模型,需要将模型数据放到服务器上,使用Url地址进行访问,加载方式如下:

但是,有没有一种方法,能将本地3DTile模型文件,在网页上进行浏览查看呢。

首先,本地文件可以通过URL.createObjectURL(blob || file) 静态方法创建一个指向参数对象的URL地址。其次,由Cesium3DTileset源码解析可知,Cesium通过tileset.json文件,解析其中的内容,获取其子瓦片文件的索引位置,再去请求瓦片数据。那么就有了两种思路,一种去替换tileset.json中子瓦片文件的索引位置,另一种则是在请求最后一步前,替换请求的Url地址。

通过type为file的input标签,或者其他前端工具(浏览器全可以使用showDirectoryPicker),获取本地模型文件夹,遍历获取所有文件夹及文件的描述信息。

通过URL.createObjectURL(blob || file)静态方法,得到所有文件的URL地址,在后续需要的地方,替换原本的URL地址。

tileset.json为3DTile模型的入口文件,描述了整个模型的瓦片数据信息。下图中,我们先看看tileset.json的数据内容。

  • l asset: 记录了整个数据集的声明与归属数据,写入了version、tilesetVersion等属性(记住这个tilesetVersion)。
  • l geometricError: 模型数据集的几何误差,用来控制瓦片的LOD渲染加载的。
  • l root: 模型数据集的根瓦片,每个3DTile数据集必须有一个root对象。里面记录了瓦片的元数据,真正瓦片的本体数据在content所引用的二进制文件中,即root -> content -> url。

所以,思路就是替换content中的瓦片索引位置,将子瓦片的相对URL位置替换成步骤1生成的本地临时URL地址。

但需要注意的是:在Cesium升级了版本后,瓦片索引位置在请求时,会被加上指定的查询参数,用于缓存管理、权限验证等,包括时间戳、令牌(token)、版本控制信息(tilesetVersion)等,所以需要提前手动去屏蔽。其次,如果content中的子瓦片为复合瓦片数据,即文件后缀为cmpt文件类型等,当文件路径被替换后,我们也无法解析此文件,也无法获取里面的更细层级的子瓦片数据地址,从而替换相应的文件路径。

所以此方法局限性较大,只适用于简单的3DTile模型数据,例如白模数据。

根据接口Cesium.Cesium3DTileset.fromUrl(),可知url参数既可以为String字符串,也可为Resource资源类。其中,Resource资源类用于加载网络资源,管理着Cesium中的所有请求,例如影像、地形、模型等相关数据的请求等。解析Resource源码,看看Resource资源类是怎么工作的。

首先,实例化一个Resource,可传入参数的类型如下:

  • 资源的网络相对/绝对路径
  • Resource 实例本身
  • base64 字符串(DataUri) / blob 字符串

其次,创建资源对象后,Resource的调用流程如下(以请求JSON为例):

其中在_makeRequest方法中,会调用Resource._Implementations.loadWithXhr方法,传入Url地址,后将请求文件结果返回给Cesium对应的接口对象进行解析,并渲染加载。这是所有请求在经过前面的调用解析后,请求前的最后一步,所以我们只需在loadWithXhr方法前,将瓦片请求地址替换成本地临时URL地址。

此方法不用像思路1中我们自行去解析瓦片文件内容,遇见复合瓦片数据便无可奈何了。而是在关键一步替换了Url请求地址,瓦片文件的内容解析都会交给Cesium原生去解析。这样,我们对Cesium源码进行微操调整,付出最小的代价,但是实现了本地3DTile文件的查看浏览。

首先,将步骤1中遍历获取的Array<File>对象,传入Resource资源类中。

其次,在Resource._Implementations.loadWithXhr方法前判断,传入的地址是否为本地3DTile文件内的地址,然后将本地地址通过URL.createObjectURL()方法给替换掉。

4、 结果示例

https://www.zhihu.com/video/

3DTiles格式的三维模型是web端非常成熟的格式标准,三维倾斜模型、bim、obj、rvt等三维模型都可以转成3DTiles格式的数据。

通过CesiumEarth可以在线浏览3DTiles数据,数据可以放在互联网服务器上,也可以放在本地电脑或局域网,无需上传到CesiumEarth。

CesiumEarth访问地址:Cesium Earth

3DTiles在线浏览地址:3DTiles在线浏览

3DTiles格式的三维模型是web端非常成熟的格式标准,三维倾斜模型、bim、obj、rvt等三维模型都可以转成3DTiles格式的数据。

通过CesiumEarth可以在线浏览3DTiles数据,数据可以放在互联网服务器上,也可以放在本地电脑或局域网,无需上传到CesiumEarth。

CesiumEarth访问地址:cesiumearth.com

3DTiles在线浏览地址:cesiumearth.com/#

在文本框内输入3DTiles的Url地址:earthsdk.com/v/last/App

点击开始浏览,即可在线查看三维倾斜模型数据

此时可以发现倾斜模型的高度是漂浮在影像图之上的,这是因为大雁塔所在位置海拔较高,而三维场景未加载地形数据,默认地形为0海拔,可调整倾斜模型高度,设置offsetHeight=-410即可

除此之外,还可以调整倾斜模型的亮度 brightness=1.5 和精度 maximumScreenSpaceError=1

还可测量大雁塔的坐标和高度

在三维地理信息系统中,数据的格式转换和处理扮演着举足轻重的角色。特别是将复杂的倾斜摄影模型(OSGB格式)转换为更为高效、通用的3DTiles格式,这一过程不仅技术性强,而且往往伴随着大量的数据处理需求。很多小伙伴们找不到实用的一款工具来处理,而GISBox专注于GIS文件格式的一站式转换,能够轻松将OSGB格式的文件转换为3DTiles格式。

多种类型的切片任务

GISBox是面向数字孪生行业的一款完全免费的GIS数据处理与发布工具箱。这意味着,无论是影像处理、地形分析,还是倾斜摄影格式的转换,用户都无需支付任何费用。这种免费模式大大降低了用户的经济负担,使得更多的GIS工作者能够轻松获取和使用这一强大的工具。

GISBox不仅具备强大的格式转换功能,还支持对OSGB文件进行实时编辑。用户可以在转换前对OSGB模型进行必要的调整和优化,如破面修复、河床下压、地形对齐等,以确保转换后的3DTiles文件更符合实际应用需求。这种实时编辑功能大大提高了工作效率,减少了不必要的重复劳动。

GISBox 提供了多种主流 GIS 协议的支持,包括3DTiles。在完成数据转换后,可自动生成服务地址,实现在线数据的快速发布和共享。用户可以将发布的 3DTiles 等类型的服务直接嵌入到山海鲸可视化或其他可视化平台中进行展示和交互,大大简化了数据管理和展示流程。

在山海鲸可视化中导入服务地址

打开GISBox软件,在“切片”栏目中,点击右上方的“新建”按钮创建一个切片任务。

新建切片任务

在弹出的“新建切片任务”窗口中,我们选择切片的类型-倾斜模型切片,然后点击上方的“+ 添加文件”按钮添加我们本地的OSGB文件。

添加倾斜摄影文件

添加 OSGB 文件后,可在“基础参数”中设置切片导出的文件夹路径,“空间参考”“零点坐标”会根据文件夹中的“metadata.xml”文件自动生成。当倾斜三维模型数据量较大时,可以选择开启“重建顶层”功能,能够显著提升加载性能,增强浏览体验。

设置转换的基础参数

“存储类型”中,默认开启“存储 3DTiles1.1”。开启时,OSGB 文件夹中的模型文件导出后为glb格式。关闭时则为b3dm格式。

设置存储类型

如果在切片任务设置中勾选了“同时发布成服务”,那么在切片完成时会自动生成对应的服务,在左侧点击“分发”栏目,然后选择第一个模型服务,就可以看到生成的服务,可以点击复制服务地址,或者点击“查看”按钮在浏览器中进行预览。

查看生成的服务地址

以上就是使用GISBox进行OSGB转3DTiles的优势及流程介绍,在提供丰富而强大功能的基础上,整个转化过程也十分简单、快捷。如果大家有相关需求,欢迎到我们官网下载体验GISBox软件,若是有什么疑问,也可以在评论区留言。

到此这篇3dtiles文件下载(3dtiles数据下载)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 自动驾驶数据集 yolo(自动驾驶数据集2024)2025-06-02 07:00:04
  • spss23.0数据分析教程(spss22数据分析教程)2025-06-02 07:00:04
  • 大数据培训哪些课程(大数据培训哪些课程好)2025-06-02 07:00:04
  • 学术数据库没有购买就不能检索的有(中国学术期刊全文数据库不提供的文献外表特征的途径有)2025-06-02 07:00:04
  • 数据中台建设方案规划(数据中台设计方案)2025-06-02 07:00:04
  • 大数据技术是学什么的以后干什么(大数据技术主要是学什么)2025-06-02 07:00:04
  • 数据库技术基础知识(数据库技术基础思维导图)2025-06-02 07:00:04
  • 电子发票在税控盘怎样打印数据(税控盘中电子发票该如何打印)2025-06-02 07:00:04
  • impdp 命令(impdp命令导入数据库)2025-06-02 07:00:04
  • 英文全文数据库有哪些内容(英文全文数据库有哪些内容组成)2025-06-02 07:00:04
  • 全屏图片