博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SuperMap iClient3D for WebGL之BIM模型爆炸
阅读量:4163 次
发布时间:2019-05-26

本文共 2887 字,大约阅读时间需要 9 分钟。

作者:nannan

       IT技术的飞速迅猛发展,深刻而长远地影响了BIM与GIS两个领域。SuperMap基于HTML5WebGL技术,推出了轻量级三维客户端,这样无须安装软件、无须安装插件、无须下载数据,就可以在浏览器上高效浏览三维服务,并通过开源的S3M规范支持实用的三维空间查询、量算以及空间分析等功能。其中BIM模型爆炸是BIM+GIS应用的迫切需求,它可以清晰的分辨出内部BIM模型构件。今天,它来了。请先看炫酷的效果图:

在这里插入图片描述

一、接口介绍

(1)S3MTilesLayer.setObjsTranslate(ids,translate),输入要偏移的对象id数组,和指定偏移量。

在这里插入图片描述

(2)S3MTilesLayer.removeObjsTranslate(ids),移除指定ids对象的偏移。

在这里插入图片描述

(3)S3MTilesLayer.removeAllObjsTranslate(),移除所有对象的偏移。

在这里插入图片描述

二、数据准备

将BIM模型通过插件导入supermap idesktop,生成多个模型数据集,进行批量生成模型缓存操作生成一个.scp配置文件。在iserver上发布数据服务和三维服务。(注意:如果想每个构件设置不同的方向爆炸,需要在属性表里新建字段进行记录,方便前端查询获取)本篇博客使用的是范例数据url=“http://www.supermapol.com/realspace/services/3D-BIMbuilding/rest/realspace”

在这里插入图片描述

三、代码实现

(1)加载含BIM模型的场景,获取BIM的s3m图层。

var promise = scene.open(URL_CONFIG.SCENE_BIMBUILDING);					Cesium.when(promise, function(layers) {
//设置相机位置、方向,定位至模型 scene.camera.setView({
destination: new Cesium.Cartesian3(-2180753.065987198, 4379023.266141494, 4092583.575045952), orientation: {
heading: 4.0392222751147955, pitch: 0.010279641987852584, roll: 1.240962888005015e-11 } }); var layer = scene.layers.find('BIMbuilding'); });

(2)连接数据服务,获取图元ID数组,可以得到每个构件的起始ID和终止ID。

小编这里为了让每个构件同时偏移的量不一样,所以随着for循环的运行,每个ID数组对应的偏移量也不一样。

layer.setQueryParameter({
url: "http://www.supermapol.com/realspace/services/data-BIMbuilding/rest/data", dataSourceName: "BIMBuilding", isMerge: true }); datainfo(layer); function datainfo(layer) {
layer.datasetInfo().then(function(result) {
list = result; console.log(list); if(list.length > 0) {
for(var i = 0; i < list.length; i++) {
ids[i] = range(list[i].startID, list[i].endID); translate[i] = new Cesium.Cartesian3((2 * i), (5 * i), (10 * i)); } } }); }

在这里插入图片描述

(3)滑动条左右滑动来控制偏移量

Cesium.knockout.getObservable(viewModel, 'offsetX').subscribe(function(newValue) {
for(var i = 0; i < list.length; i++) {
layer.setObjsTranslate(ids[i], new Cesium.Cartesian3(viewModel.offsetX * i, viewModel.offsetY, viewModel.offsetZ)); } });

X方向偏移:

在这里插入图片描述
Y方向偏移:

Cesium.knockout.getObservable(viewModel, 'offsetY').subscribe(function(newValue) {
for(var i = 0; i < list.length; i++) {
layer.setObjsTranslate(ids[i], new Cesium.Cartesian3(viewModel.offsetX, viewModel.offsetY * i, viewModel.offsetZ)); } });

在这里插入图片描述

Z方向偏移:

Cesium.knockout.getObservable(viewModel, 'offsetZ').subscribe(function(newValue) {
for(var i = 0; i < list.length; i++) {
layer.setObjsTranslate(ids[i], new Cesium.Cartesian3(viewModel.offsetX, viewModel.offsetY, viewModel.offsetZ * i)); } });

在这里插入图片描述

(4)移除所有偏移

$("#huifu").click(function() {
layer.removeAllObjsTranslate(); });

在这里插入图片描述

完整代码请参见:
链接:https://pan.baidu.com/s/1_yGJAHL_pKTb1XfSCM9ZkA
提取码:f691

转载地址:http://mipxi.baihongyu.com/

你可能感兴趣的文章
【Python基础2】python字符串方法及格式设置
查看>>
【Python】random生成随机数
查看>>
【Python基础3】数字类型与常用运算
查看>>
【Python基础4】for循环、while循环与if分支
查看>>
【Python基础6】格式化字符串
查看>>
【Python基础7】字典
查看>>
【Python基础8】函数参数
查看>>
【Python基础9】浅谈深浅拷贝及变量赋值
查看>>
Jenkins定制一个具有筛选功能的列表视图
查看>>
【Python基础10】探索模块
查看>>
【Python】将txt文件转换为html
查看>>
[Linux]Shell脚本实现按照模块信息拆分文件内容
查看>>
idea添加gradle模块报错The project is already registered
查看>>
在C++中如何实现模板函数的外部调用
查看>>
在C++中,关键字explicit有什么作用
查看>>
C++中异常的处理方法以及使用了哪些关键字
查看>>
内存分配的形式有哪些? C++
查看>>
什么是内存泄露,如何避免内存泄露 C++
查看>>
什么是缓冲区溢出 C++
查看>>
sizeof C++
查看>>