OBV 3dTiles服务二次开发文档

1. 3dTiles服务概述

OBV平台打造了与3dTiles相兼容的流式数据格式及相应的数据转换服务,为拓宽数据的应用范围,推出3dTiles服务以提供流式数据与第三方平台互通的能 力。用户将文件上传OBV平台进行流式转换之后,可以使用3dTiles服务直接查询模型的3dTiles数据及其附加属性数据,而无需下载对应文件。

本教程主要分为模型数据查询和属性数据查询两部分:

1、模型数据通过数据url链接接入第三方平台,第三方平台可以直接通过该链接访问、渲染3dTiles数据,教程将展示url生成方法;

2、属性数据通过BIMS服务进行查询,教程将展示通过调用BIMS服务接口的方式获取构件的属性信息的方法。

注:需要数据首先进行了流式转换才能进行数据查询(jobType以“-lod”结尾),具体二次开发流程参照:开发指南

2. 查询准备

数据的查询需要提供以下三个字段
字段 类型(Type) 必填(Required) 描述(Description)
clientId String ClientID
token String 访问令牌
urn String 模型数据标识

3. 3dTiles模型数据查询

3.1. 模型url生成

模型url = 固定部分+ resultkey + 3dtiles数据相对路径

模型url示例:https://api.cloud.pkpm.cn/bimserver/viewing/v3/datas/402I1y2H6rEL37iJ5s4MpNMJ/变电站(换流站)工程/manifest.json

参数 含义 说明
固定部分 包含urn的协议、域名和流式数据固定存放位置三部分 https://{host}/bimserver/viewing/v3/datas/
resultkey 用于区分不同任务的key值。如:3g0BfW1etbqP2lOSyqPrf0e resultkey值记录在流式转换的元数据文件的urn字段中,取urn字段末尾路径为resultkey值
数据相对路径 指示3dtiles数据入口文件所在相对位置。如:/变电站(换流站)工程/manifest.json 同样可以从元数据文件中查询到,在代表3dtiles视图的resource层级下存在urn字段指示该相对路径,取$files$后续路径为该相对路径。

3.1.1. 获通过obv接口获取模型元数据文件

function getAccessToken(callBack) {
callBack('{your_token}', 302400)
}

// 创建实例需要传入的参数,部署环境serviceConfig 和 用户有效期getAccessToken
let applicationOptions = {
// 配置 OBV 服务端(BIMServer)API 服务的 origin,这个适合于私有部署的用户使用
getAccessToken: getAccessToken,
refreshAccessToken: getAccessToken,
serviceConfig: {
origin: 'https://api.cloud.pkpm.cn',
apiContextPath: '/bimserver/viewing/v3',
},
};

// 实例化 Builder,用于模型加载
const builder = new OBV.Api.ObvBuilder();
// 创建 Application 对象
const application = await builder.buildApplication(applicationOptions);
// 创建 document 管理视图,加载完成后可以调用接口
const obvDocument = await builder.loadDocument(application, urn, {jobType}); //jobType为流式转换任务的任务类型
// 获取元数据文件
var manifest = obvDocument._manifest;

3.1.2. 获取关键字段拼接生成模型url

//获取resultkey
var manifestUrn = manifest.urn;
var pos = manifestUrn.lastIndexOf("/");
var resultkey = manifestUrn.substr(pos);
let rePath;
for(let i = 0; i < manifest.children[0].children.length; i++) {
    if(manifest.children[0].children[i].type === 'geometry') {
        if(manifest.children[0].children[i].children[0].role === 'graphics') {
            // 获取数据相对路径
            var viewUrn = manifest.children[0].children[i].children[0].urn; //以元数据文件中描述的第一个三维视图为例
            pos = viewUrn.indexOf("/");
            rePath = viewUrn.substr(pos);
            break;
        }
    }
}
// 字段拼接生成模型url
var urlHead = host +"/bimserver/viewing/v3/datas";
var modelUrl = urlHead + resultkey + rePath;

3.2. 使用模型url加载tileset对象(Cesium平台为例)

由于资源访问需要认证,因此不能直接使用url访问数据,需要添加认证token,使用Cesium.Resource传递url和token字段:

Cesium V1.107之前版本创建调用接口如下:

// 获取带bearer头的Token字段
var headersToken = applicationOptions.serviceConfig.headers.Authorization;

// 使用Cesium.Resource传递url和token字段
const resource = new Cesium.Resource({
    url: modelUrl,
    headers: {
       "Authorization":headersToken
      },
   }); 

// 生成tileset对象
let tileset = new Cesium.Cesium3DTileset({
    url: resource
});

tileset.readyPromise.then(function(tileset)
{
    viewer.scene.primitives.add(tileset);
    viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.5, -0.2,
    tileset.boundingSphere.radius * 10.0));
});

Cesium V1.107之后版本创建调用接口如下:

// 获取带bearer头的Token字段
var headersToken = applicationOptions.serviceConfig.headers.Authorization;

// 使用Cesium.Resource传递url和token字段
const resource = new Cesium.Resource({
    url: modelUrl,
    headers: {
       "Authorization":headersToken
      },
   }); 

// 生成tileset对象
let tileset;
try {
      tileset = await Cesium.Cesium3DTileset.fromUrl(resource);
      viewer.scene.primitives.add(tileset);
      viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.5, -0.2,
      tileset.boundingSphere.radius * 10.0));
      );
    } catch (error) {
      console.log(`Error loading tileset: ${error}`);
    }

4. 属性数据查询

属性数据查询需要调用BIMS接口,点击查看Bims API 文档

5. 示例代码

加载3dTiles数据