精华内容
下载资源
问答
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> ...script src="../dist/threebox.js" type="text/javascr...
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        
        <script src="../dist/threebox.js" type="text/javascript"></script>
        <!--
        <script src="threebox.js" type="text/javascript"></script>
        -->
        <link rel="stylesheet" href="https://minedata.cn/minemapapi/v1.3/minemap.css">
        <style>
            *{
                margin:0;
                padding:0;
            }
            body,html{
                height:100%;
            }
            #container,#map,#deck-layer{
                height:100%;
            }
            #deck-layer{
                position:absolute;
                top:0;
                left:0;
            }
        </style>
    </head>
    <body>
    <div id="container">
        <div id="map"></div>
        
    </div>
    
     
    <script src="https://minedata.cn/minemapapi/v1.3/minemap.js"></script>
    <script src="jingxihua3.js"></script>
    <script>
    
    minemap.accessToken = '449ba822788c46bea9f90dfba48e5269';
    minemap.solution = '4013';
    
    const map = new minemap.Map({
        container: 'map',
        style: 'http://minedata.cn/service/solu/style/id/4013',
        zoom: 19,
        maxZoom: 23,
        center: [116.244421,40.073263],
        pitch: 60
        //bearing: 140,
       // hash: true
    });
    
    //map.dragRotate.disable();
    //map.touchZoomRotate.disableRotation();
    
     map.on("load", function() {
        map.setLayerZoomRange('96b6f495ae0d4bd78a1617d5afc58d9b','maxzoom',24)    
            window.threebox = new Threebox(map);
            threebox.setupDefaultLights();
    
            var source = {
                type: "FeatureCollection",
                features: [
                {
                    type: "Feature",
                    properties: { model: "new_scene","size":1 },
                    geometry: {
                        type: "Point",
                        coordinates: [116.245263,40.066957,-35]
                    }
                }
                
                ]
            };
    
            var symbols = threebox.addSymbolLayer({
                id:             "scale",
                source:         source, // You can also specify a URL or relative path such as "data/points.geojson",
                modelName:      {property: 'model'},    // will look for an .obj and .mtl file with this name
                modelDirectory: "models/",          // in this directory
                //rotation:       { generator: feature => (new THREE.Euler(Math.PI / 2, Math.PI, 0, "ZXY")) },
                //scale:          { property: 'size' },
                scale:          [1,1,1],
                rotation: { generator: feature => (new THREE.Euler(Math.PI / 2, 0, 90 * Math.PI / 180 + Math.PI / 2, "ZXY")) },
                
                scaleWithMapProjection: true
            });
            
            
            
            
            
            
            map.addLayer({
                id: "arrow", type: 'fill',
                'source': {
                'type': 'geojson',
                'data': jxh.arrow},
                 
                  paint: {
                    'fill-opacity': 1,
                    'fill-color': '#fff',
                  },
                  layout: {}
                
              })
              
              map.addLayer({
                id: "zebracrossing", type: 'fill',
                'source': {
                'type': 'geojson',
                'data': jxh.zebracrossing},
                  paint: {
                    'fill-opacity': 1,
                    'fill-color': '#ccc',
                  },
                  layout: {}
                
              })
              
              map.addLayer(
              {
                id: "baise_xuxian",
                type: 'line',
                source:{
                'type': 'geojson',
                'data': jxh.baise_xuxian
                },
                 paint: {
                    'line-opacity': 1,
                    'line-color': '#dddddd',
                    'line-width': 3,
                    "line-dasharray": [20,20]
                  },
                 layout: {
                    'line-cap': 'round',
                  }
                
              })
              
              map.addLayer(
              {
                id: "baise_shuangshixian",
                type: 'line',
                source:{
                'type': 'geojson',
                'data': jxh.baise_shuangshixian
                },
                 paint: {
                    'line-opacity': 1,
                    'line-color': '#dddddd',
                    'line-width': 2 ,
                    'line-gap-width': 2
                  },
                 layout: {
                    'line-cap': 'round',
                  }
                
              })
              
              
              map.addLayer(
              {
                id: "huangse_xuxian",
                type: 'line',
                source:{
                'type': 'geojson',
                'data': jxh.huangse_xuxian
                },
                 paint: {
                    'line-opacity': 1,
                    'line-color': '#ebb505',
                    'line-width': 3,
                    "line-dasharray": [20,20]
                  },
                 layout: {
                    'line-cap': 'round',
                  }
                
              })
              
              
              
               map.addLayer(
              {
                id: "huangse_shuangshixian",
                type: 'line',
                source:{
                'type': 'geojson',
                'data': jxh.huangse_shuangshixian
                },
                 paint: {
                    'line-opacity': 1,
                    'line-color': '#ebb505',
                    'line-width': 2 ,
                    'line-gap-width': 2
                  },
                 layout: {
                    'line-cap': 'round',
                  }
                
              })
              
              
              map.addLayer(
              {
                id: "isolation_belt", type: 'fill',
                source:{
                'type': 'geojson',
                'data': jxh.isolation_belt
                },
                  paint: {
                    'fill-opacity': 0.55,
                    'fill-color': '#8deb89',
                  },
                  layout: {}
                
              })
              
              
              map.addLayer(
              {
                id: "trafficisland", type: 'extrusion',
                 source:{
                'type': 'geojson',
                'data': jxh.trafficisland
                },
                  paint: {
                    'extrusion-opacity': 0.5,
                    'extrusion-color': '#dcd9e6',
                    'extrusion-height': 0.5,
                  },
                  layout: {}
                
              })
    
            
            
            map.addLayer(
              {
                id: "stopline",
                type: 'line',
                source:{
                'type': 'geojson',
                'data': jxh.stopline
                },
                 paint: {
                    'line-opacity': 1,
                    'line-color': '#dddddd',
                    'line-width': 6 
                  },
                 layout: {
                    'line-cap': 'round',
                  }
                
              })
    
        });
        
        
        map.on('mousemove', function (e) {
        //console.log(e.lngLat)
        });
    </script>
    </body>
    </html>

     

    转载于:https://www.cnblogs.com/lilei2blog/p/9125181.html

    展开全文
  • 前言用 WebGL 渲染的 3D 机房现在也不是什么新鲜事儿了,这篇文章的主要目的是说明一下,3D 机房中的 eye 和 center 的问题,刚好在项目中用上了,好生思考了一番,最终觉得这个例子最符合我的要求,就拿来作为记录...

    前言

    用 WebGL 渲染的 3D 机房现在也不是什么新鲜事儿了,这篇文章的主要目的是说明一下,3D 机房中的 eye 和 center 的问题,刚好在项目中用上了,好生思考了一番,最终觉得这个例子最符合我的要求,就拿来作为记录。

    demo演示地址:http://hightopo.com/demo/3DRoom/index.html

    效果图:
    图片描述
    这个 3D 机房的 Demo 做的还不错,比较美观,基础的交互也都满足,接下来看看怎么实现。

    代码生成

    定义类

    首先从 index.html 中调用的 js 路径顺序一个一个打开对应的 js,server.js 中自定义了一个 Editor.Server 类由 HT 封装的 ht.Default.def 函数创建的(注意,创建的类名 Editor.Server 前面的 Editor 不能用 E 来替代):

    ht.Default.def('Editor.Server', Object, { // 第一个参数为类名,如果为字符串,自动注册到 HT 的 classMap 中;第二个参数为此类要继承的父类;第三个参数为方法和变量的声明
        addToDataModel: function(dm) { // 将节点添加进数据容器
            dm.add(this._node); // ht 中的预定义函数,将节点通过 add 方法添加进数据容器中
        },
        setHost: function() { // 设置吸附
            this._node.setHost.apply(this._node, arguments); 
        },
        s3: function() { // 设置节点的大小
            this._node.s3.apply(this._node, arguments);
        },
        setElevation: function() { // 控制Node图元中心位置所在3D坐标系的y轴位置
            this._node.setElevation.apply(this._node, arguments);
        }
    });
    

    创建 Editor.Server 类

    图片描述
    这个类可以创建一个 ht.Node 节点,并设置节点的颜色和前面贴图:

    var S = E.Server = function(obj) { // 服务器组件
        var color = obj.color, 
            frontImg = obj.frontImg;
    
        var node = this._node = new ht.Node(); // 创建节点
        node.s({ // 设置节点的样式 s 为 setStyle 的缩写
            'all.color': color, // 设置节点六面的颜色
            'front.image': frontImg // 设置节点正面的图片
        });
    };
    

    这样我在需要创建服务器组件的位置直接 new 一个新的服务器组件对象即可,并且能够直接调用我们上面声明的 setHost 等函数,很快我们就会用上。

    接下来创建 Editor.Cabinet 机柜类 ,方法跟上面 Editor.Server 类的定义方法差不多:

    ht.Default.def('Editor.Cabinet', Object, {
        addToDataModel: function(dm) {
            dm.add(this._door);
            dm.add(this._node);
            this._serverList.forEach(function(s) { 
                s.addToDataModel(dm); 
            });
        },
        p3: function() { 
            this._node.p3.apply(this._node, arguments); // 设置节点的 3d 坐标
        }
    });
    

    创建 Editor.Cabinet 类

    图片描述
    这个类相对于前面的 Editor.Server 服务器组件类要相对复杂一点,这个类中创建了一个柜身、柜门以及机柜内部的服务器组件:

    var C = E.Cabinet = function(obj) {
        var color = obj.color,
            doorFrontImg = obj.doorFrontImg,
            doorBackImg = obj.doorBackImg,
            s3 = obj.s3;
    
        var node = this._node = new ht.Node(); // 柜身
        node.s3(s3); // 设置节点的大小为 setSize3d
        node.a('cabinet', this); // 自定义 cabinet 属性
        node.s({ // 设置节点的样式为 setStyle
            'all.color': color, // 设置节点六面的颜色
            'front.visible': false // 设置节点前面是否可见
        });
    
        if (Math.random() > 0.5) {
            node.addStyleIcon('alarm', { // 向节点上添加 icon 图标
                names: ['icon 温度计'], // 包含多个字符串的数组,每个字符串对应一张图片或矢量(通过 ht.Default.setImage 注册)
                face: 'top', // 默认值为 front,图标在 3D 下的朝向,可取值 left|right|top|bottom|front|back|center
                position: 17, // 指定 icons 的位置
                autorotate: 'y', // 默认值为 false,图标在 3D 下是否自动朝向眼睛的方向
                t3: [0, 16, 0], // 默认值为 undefined,图标在 3D 下的偏移,格式为[x,y,z]
                width: 37, // 指定每个 icon 的宽度,默认根据注册图片时的宽度
                height: 32, // 指定每个 icon 的高度,默认根据注册图片时的高度
                textureScale: 4, // 默认值为 2,该值代表内存实际生成贴图的倍数,不宜设置过大否则影响性能
                visible: { func: function() { return !!E.alarmVisible; }} // 表示该组图片是否显示
            });
        }
    
        var door = this._door = new ht.DoorWindow(); // 柜门
        door.setWidth(s3[0]); // 置图元在 3D 拓扑中的 x 轴方向的长度
        door.setHeight(1); // 设置图元在 3D 拓扑中的 z 轴长度
        door.setTall(s3[1]); // 控制 Node 图元在 y 轴的长度
        door.setElevation(0); // 设置图元中心在 3D 坐标系中的y坐标
        door.setY(s3[2] * 0.5); // 设置节点在 y 轴的位置
        door.setHost(node); // 设置吸附
        door.s({ // 设置节点样式 setStyle
            'all.color': color, // 设置节点六面颜色
            'front.image': doorFrontImg, // 设置节点正面图片
            'front.transparent': true, // 设置节点正面是否透明
            'back.image': doorBackImg, // 设置节点背面的图片
            'back.uv': [1,0, 1,1, 0,1, 0,0], // 自定义节点后面 uv 贴图,为空采用默认值 [0,0, 0,1, 1,1, 1,0]
            'dw.axis': 'right' // 设置 DoorWindow 图元展开和关闭操作的旋转轴,可取值 left|right|top|bottom|v|h
        });
    
        var serverList = this._serverList = []; 
        var max = 6,
            list = E.randomList(max, Math.floor(Math.random() * (max - 2)) + 2); // global.js 中声明的获取随机数的函数 
        var server, h = s3[0] / 4;
        list.forEach(function(r) {
            var server = new E.Server({ // 服务器组件
                color: 'rgb(51,49,49)',
                frontImg: '服务器 组件精细'
            });
            server.s3(s3[0] - 2, h, s3[2] - 4); // 设置节点大小
            server.setElevation((r - max * 0.5) * (h + 2)); // 设置节点中心点在 y 轴的坐标
            server.setHost(node); // 设置节点的吸附
    
            serverList.push(server); // 向 serverList 中添加 server 节点
        });
    };
    

    上面代码中唯一没提到的是 Editor.randomList 函数,这个函数是在 global.js 文件中声明的,声明如下:

    var E = window.Editor = {
        leftWidth: 0,
        topHeight: 40,
        randomList: function(max, size) {
            var list = [], ran;
            while (list.length < size) {
                ran = Math.floor(Math.random() * max);
                if (list.indexOf(ran) >= 0) 
                    continue;
                list.push(ran);
            }
            return list;
        }
    };
    

    好了,场景中的各个部分的类都创建完成,那我们就该将场景创建起来,然后将这些图元都堆进去!

    界面设计

    场景创建

    如果熟悉的同学应该知道,用 HT 创建一个 3D 场景只需要 new 一个 3D 组件,再将通过 addToDOM 函数将这个场景添加进 body 中即可:

    var g3d = E.main = new ht.graph3d.Graph3dView(); // 3d 场景
    

    main.js 文件中主要做的是在 3D 场景中一些必要的元素,比如墙面,地板,门,空调以及所有的机柜的生成和排放位置,还有非常重要的交互部分。

    墙体,地板,门,空调和机柜的创建我就不贴代码出来了,有兴趣的请自行查看代码,这里主要说一下双击机柜以及与机柜有关的任何物体(柜门,服务器设备)则 3D 中 camera 的视线就会移动到双击的机柜的前方某个位置,而且这个移动是非常顺滑的,之前技艺不精,导致这个部分想了很久,最后参考了这个 Demo 的实现方法。

    为了能够重复地设置 eye 和 center,将设置这两个参数对应的内容封装为 setEye 和 setCenter 方法,setCenter 方法与 setEye 方法类似,这里不重复赘述:

    // 设置眼睛位置
    var setEye = function(eye, finish) {
        if (!eye) return;
        var e = g3d.getEye().slice(0), // 获取当前 eye 的值
            dx = eye[0] - e[0],
            dy = eye[1] - e[1],
            dz = eye[2] - e[2];
        // 启动 500 毫秒的动画过度
        ht.Default.startAnim({
            duration: 500,
            easing: easing, // 动画缓动函数
            finishFunc: finish || function() {}, // 动画结束后调用的函数
            action: function(v, t) { // 设置动画 v 代表通过 easing(t) 函数运算后的值,t 代表当前动画进行的进度[0~1],一般属性变化根据 v 参数进行
                g3d.setEye([ //设置 3D 场景中的 eye 眼睛的值,为一个数组,分别对应 x,y,z 轴的值 
                    e[0] + dx * v,
                    e[1] + dy * v,
                    e[2] + dz * v
                ]);
            }
        });
    };
    

    我没有重复声明 setCenter 函数不代表这个函数不重要,恰恰相反,这个函数在“视线”移动的过程中起到了决定性的作用,上面的 setEye 函数相当于我想走到我的目标位置的前面(至少我定义的时候是这种用途),而 setCenter 的定义则是将我的视线移到了目标的位置(比如我可以站在我现在的位置看我右后方的物体,也可以走到我右后方去,站在那个物体前面看它),这点非常重要,请大家好好品味一下。

    双击事件倒是简单,只要监听 HT 封装好的事件,判断事件类型,并作出相应的动作即可:

    g3d.mi(function(e) { // addInteractorListener 事件监听函数
        if (e.kind !== 'doubleClickData') // 判断事件类型为双击节点
            return;
        var data = e.data, p3;
    
        if (data.a('cabinet')) // 机身
            p3 = data.p3();
        else {
            host = data.getHost(); // 获取点击节点的吸附对象
            if (host && host.a('cabinet')) { // 如果吸附对象为 cabinet
                p3 = host.p3();
            }
        }
    
        if (!p3) return;
    
        setCenter(p3); // 设置 center 目标的要移向位置为 cabinet 的位置
        setEye([p3[0], 211, p3[2] + 247]); // 设置 eye 眼睛要移向的位置
    });
    

    顶部导航栏

    图片描述
    一开始看到这个例子的时候我在想,这人好厉害,我用 HT 这么久,用 HT 的 ht.widget.Toolbar 还没能做出这么漂亮的效果,看着看着发现这原来是用 form 表单做的,厉害厉害,我真是太愚钝了。

    var form = E.top = new ht.widget.FormPane(); // 顶部 表单组件
    form.setRowHeight(E.topHeight); // 设置行高
    form.setVGap(-E.topHeight); // 设置表单组件水平间距 设置为行高的负值则可以使多行处于同一行
    form.setVPadding(0); // 设置表单顶部和顶部与组件内容的间距
    form.addRow([null, { // 向表单中添加一行组件,第一个参数为元素数组,元素可为字符串、json 格式描述的组件参数信息、html 元素或者为 null
        image: {
            icon: './symbols/inputBG.json',
            stretch: 'centerUniform'
        }
    }], [40, 260]); // 第二个参数为每个元素宽度信息数组,宽度值大于1代表固定绝对值,小于等于1代表相对值,也可为80+0.3的组合
    form.addRow([null, null, {
        id: 'searchInput',
        textField: {}
    }, {
        element: '机房可视化管理系统',
        color: 'white',
        font: '18px arial, sans-serif'
    }, null, {
        button: {
            // label: '视图切换',
            icon: './symbols/viewChange.json',
            background: null,
            selectBackground: 'rgb(128,128,128)',
            borderColor: 'rgba(0, 0, 0, 0)',
            onClicked: function() {
                E.focusTo();
            }
        }
    }, null, {
        button: {
            // label: '告警',
            icon: './symbols/alarm.json',
            togglable: true,
            selected: false,
            background: null,
            selectBackground: 'rgb(128,128,128)',
            borderColor: 'rgba(0, 0, 0, 0)',
            onClicked: function(e) {
                E.setAlarmVisible(this.isSelected());
            }
        }
    }, null], [40, 42, 218, 300, 0.1, 50, 10, 50, 10]);
    

    以上都只是能实现,但是并没有真正地添加进 html 标签中,也就意味着,现在界面上什么都没有!别忘了在页面加载的时候将 3D 场景添加进 body 中,同时也别忘了将 form 表单添加进 body 中,并且设置窗口大小变化事件时,form 表单也需要实时更新:

    window.addEventListener('load', function() {
        g3d.addToDOM(); // 将 3D 场景添加进 body 中
    
        document.body.appendChild(E.top.getView()); //将 form 表单组件底层 div 添加进 body 中
    
        window.addEventListener('resize', function() { // 窗口大小变化事件监听
            E.top.iv(); // 更新 form 表单的底层 div 
        });
    });
    

    这里说明一下 addToDOM 函数,对于了解 HT 的机制非常重要。HT 的组件一般都会嵌入 BorderPane、SplitView 和 TabView 等容器中使用,而最外层的 HT 组件则需要用户手工将 getView() 返回的底层 div 元素添加到页面的 DOM 元素中,这里需要注意的是,当父容器大小变化时,如果父容器是 BorderPane 和 SplitView 等这些 HT 预定义的容器组件,则 HT 的容器会自动递归调用孩子组件invalidate 函数通知更新。但如果父容器是原生的 html 元素, 则 HT 组件无法获知需要更新,因此最外层的 HT 组件一般需要监听 window 的窗口大小变化事件,调用最外层组件 invalidate 函数进行更新。

    为了最外层组件加载填充满窗口的方便性,HT 的所有组件都有 addToDOM 函数,其实现逻辑如下,其中 iv 是 invalidate 的简写:

    addToDOM = function(){   
        var self = this,
            view = self.getView(),   
            style = view.style;
        document.body.appendChild(view); // 将场景的底层 div 添加进 body 中           
        style.left = '0'; // HT 默认将所有的组件底层 div 的 position 设置为 absolute
        style.right = '0';
        style.top = '0';
        style.bottom = '0';      
        window.addEventListener('resize', function () { self.iv(); }, false); // 窗口大小变化监听事件,通知组件变化更新          
    }
    

    这样,所有的代码就结束了,可以自己右键“检查”,network 中可以获取相对应的 json 文件。

    展开全文
  • 从传统的二维平面变形图、二维SVG矢量图到如今的SVG三维矢量技术、BIM技术、GIS+BIM技术、 WebGL技术,甚至连AR、VR、MR等虚拟现实技术,也开始应用于交通领域的可视化发展方面。 WebGL,SVG, BIM 技术对比 SVG 以二...

    #三维可视化##3D开发#

    1. WebGL, SVG,BIM技术对比
    2. ThingJS整合Echarts数据分析
    3. 隧道监控三维可视化5大场景
      ricardo-gomez-angel-oKrMEczSpis-unsplash.jpg

    互联网技术为交通行业的可视化带来了多样性的发展。从传统的二维平面变形图、二维SVG矢量图到如今的SVG三维矢量技术、BIM技术、GIS+BIM技术、 WebGL技术,甚至连AR、VR、MR等虚拟现实技术,也开始应用于交通领域的可视化发展方面。

    WebGL,SVG, BIM 技术对比

    SVG 以二维平面的矢量图形为主,也支持三维可视化展示,通常应用在地铁线路、高速公路线路展示方面。以SVG制作的三维模型在三维场景里的使用个数有限,否则会引起整体卡顿,此外,SVG三维模型对于模型渲染的程度不高,会影响三维模型展示的实时性。

    BIM(Building Information Modeling) 技术是一种应用于工程设计、建造、管理的数据化工具,常应用于城市楼宇、水库、工厂等以工程建筑为主体的全生命周期的健康监测方面,需要大量的三维数据模型来支撑。近年来,基于GS+BIM结合的三维可视化技术已经开始涉足交通行业,能够对空间数据分析及挖掘展示提供很好的技术支持,但对于路段级别的地道监控管理系统来说,成本过高。

    WebGLOpenGL 是基于(开放图形库)协议在Web浏览器中进行3D渲染的API,是一个基于纯BS架构开发的技术。对于路段级别的隧道监控管理系统来说,可视化的重点在于隧道内部,所以不需要大量的地理数据和建设数据作为支撑。

    SVG三维矢量技术、BIM技术、WebGL技术是与智能交通领域发展相匹配的可视化展示方式,下面从软件应用架构、模型数据量级、模型展示颗粒度、适用场景、对于数据分析的支持、模型场景动态浏览等六个方面对三种可视化技术进行对比。

    ThingJS整合Echarts数据分析

    WebGL实现了轻量化三维可视化技术,但无法支撑对于数据分析与挖掘的展示。为了弥补这一缺陷,ThingJS平台支持整合Echarts数据类库, 结合Ajax技术来进行异步监控并显示实时数据分析的2D界面,成为二维平面系统和三维可视化技术相融合的绝佳应用场景。
    【查看3D源码】
    1.GIF

    隧道监控三维可视化应用场景

    复杂场景的轻量化展示是一个主要趋势,B/S架构会成为大面积使用的平台。ThingJS是基于WebGL的三维可视化技术引擎,利用ThingJS可视化组件来降低物联网3D可视化开发的成本,传统的隧道监控管理系统也感受到了新技术的洗礼。

    1. 隧道内三维场景浏览

    传统的交通监控管理系统常常采用二维平面技术手段,以变形图的形式展示隧道的车型通道图。通过二维图形像素定位,在二维变形图上以图标的形式铺满所有机电监控类设备,无法给人以立体隧道及设备展示的真实客观感受。
    基于 WebGL的三维隧道全景可视化技术是矢量图形展示技术,通过基于CAD图元的二维平面隧道结构结合3D建模工具进行隧道二维平面结构拔高处理,可以完全再现三维隧道的客观事实及内部空间结构。
    模型部分
    隧道三维模型场景需要一个建模过程,利用3DSMAX进行精细建模,并在CampusBuilder内搭建3D场景,ThingJS平台可利用前端脚本开发3D效果,轻松实现场景纹理映射、模型光源效果和反射类型、定义可透视投影的可视空间等3D场景渲染,客观再现隧道内及隧道外部真实的客观世界,可以全景浏览感受隧道的弯曲度、距离水平面的高度、隧道的走向、隧道内车型通道、匝道交叉走向。
    交互部分
    三维模型的360度全景预览需要配合相应的交互式操作。通过对隧道三维模型场景的放大、缩小操作,可以实现对隧道整体场景的浏览及局部场景的放大展示;通过对隧道三维场景的平移、旋转等操作,以不同的视角浏览三维场景;通过3D场景漫游及相机飞行模式等功能,实现对三维隧道内客观的内部构造及设备安装位置、运行状态的监控。通常,ThingJS开发的3D场景会设定界面初始视角,如在隧道内部进行缓慢视角移动,浏览展示隧道内细节。
    【3D演示地址】
    2.GIF

    ####2. 三维设备模型可视化与数据交互

    隧道内三维设备模型可视化提供数据交互,以二维平面做数据展示的表现形式实现三维人机界面的交互,真实反映三维可视化场景中对机电设备的控制以及实现外场隧道机电设备状态。
    在三维模型场景中,通过调用传统监控管理系统的数据接口,实时展示单设备的基础信息和状态数据,有隧道场景视角拉近、三维设备模型放大、高亮显示实现设备运行状态拟物化显示、模型360度展示效果。
    ThingJS平台基于BS架构,利用WebSocket技术对接通信接口。通过二维信息控制面板展示设备的控制接口参数,同时通过命令发布按钮对设备实现单控、组控、自定义设备群控等操作实现命令一键发布;在接收设备控制命令反馈时,通过 WebSocket获取通信数据,解析设备运行状态与状态信息。利用ThingJS平台写WebSocket.js代码,不到100行即可实现。
    【3D演示地址】
    3.GIF

    3. 隧道辅助设施、设备健康管理

    为了保证隧道的正常通行状态,隧道内会建造一些辅助运行的设施及设备,如工作井、水泵房、管理中心、线缆管道等。在传统的监控平台中,立体的辅助设施通过分层,在二维平面中分别显示不同层级的平面图,不利于对立体层级的理解。
    在三维隧道监控中,将工作井、水泵房、管理中心线缆管道等由平面展示方式转换成立体三维模型,此显示模型层级之间、与道路之间、与辅助设备之间的位置关系,再通过线缆管道的线缆联通,结合数据采集技术,实现辅助设施的全生命周期的情况管理,以及隧道内网络拓扑、电力拓扑状态全方位监控。
    【3D演示地址】
    4.GIF

    4. 内场机房设施设备维护

    隧道临控中的内场监控,尤其是内场机房的监控承担着部分运维系统的职责面对机房内纷繁复杂的交换机、网络、存储、服务器等设备,传统的二维平面无法形象地表达机柜中各设备所处的位置和机柜的使用情况。
    基于三维可视化的内场机房场景的绘制,将整个机房的立体空间结构表现出来,并可做到对机房内全景视角的浏览,直观显示机房中相应机柜所在的位置、机柜中内场机电设备所处在的位置,通过设备通信信息采集数据,实现内场机电设备实时监控状态。通过与网络及电力系统的连接,直观显示机房整体网络架构及电力架构所处的问题点,提升维护处理能力。
    【3D演示地址】
    5.GIF

    5. 隧道突发应急事件演练

    在传统二维平面监控管理系统中,对于隧道应急事件的处置历来是一个痛点。针对仅有应急处置文字的章程,以及各种复杂的处置方式和无法关联的实时图像,让监控处置的效率一直难以提升。
    如何提高应急处置现场的可见性?三维可视化技术辅助高清视频实时图像,能够很好地解决这一问题。
    三维可视化技术部分包括创建人物模型、车辆模型、突发应急事件模型、应急救援模型、消防系统模型、逃生路线规划模型,联动预设的机电监控协调处置模型等在时间轴的作用下按处置流程步骤进行逐步演示,形成流畅的应急事件可视化演练效果。
    【3D演示地址】

    6.GIF

    展开全文
  • 价值实现 一、数据可视化 棉花加工 3D 工厂场景监控系统不仅能实现生产监控全过程一体化、精细化可视化、数字化的管理,集成企业现有的设备系统,及时发现问题、解决问题,让生产线全过程透明简单化。在生产过程...

    前言

    现在的棉花加工行业还停留在传统的反应式维护模式当中,当棉花加工厂的设备突然出现故障时,控制程序需要更换。这种情况下,首先需要客户向设备生产厂家请求派出技术人员进行维护,然后生产厂家才能根据情况再派人到现场进行处理。由于棉花加工设备分布在中国各地乃至出口到世界各地,从客户反应问题到厂家派人到达现场的时间周期就会很长,少则一天,个别偏远的地方可能会需要几天,不同程度地影响到企业生产活动的继续进行。传统的反应式维护存在以下缺点:售后服务响应速度慢;维护成本高;生产效率低下;停车率高;管理成本高;无法应对合格工程师不足的情况。

    3D棉花厂|全方位监控管理,可视化让生产变得透明

    远程监控系统主要是通过分布于棉花加工生产线各种设备的传感器、开关信号、视频监控设备、 PLC 控制器等装置,通过智能联网设备集成到互联网和局域网上面,实现对生产、运营情况的随时掌握,建立网络范围内的监控数据和网上知识资源库,根据现场采集的设备运行数据进行远程诊断和在线维修。

    HT for Web 不止自主研发了强大的基于 HTML5 的 2D、3D 渲染引擎,为可视化提供了丰富的展示效果。介于 2D 组态和 3D 组态上,Hightopo(以下简称 HT )的 HT for Web 产品上的有着丰富的组态化可供选择,本文将运用 HT 搭载出一个基于 HTML5 WebGL 2/3D 融合的棉花加工工厂系统可视化系统。

    3D棉花厂|全方位监控管理,可视化让生产变得透明

    预览地址:https://www.hightopo.com/demo/Plucker/

    1、棉花种植模式多样

    棉花是我国最重要的经济作物之一,也是生活必需品,在国防、医药、工业等领域均有着举足轻重的作用。 但目前我国总耕地面积正逐年减少,且粮棉争地趋势日益明显,全国棉花生产正呈现逐年减少的趋势。 为了保证棉花供给,满足人们日益增长的需要,提高棉花单产,在棉花总种植面积不变、甚至略有减少的劣势下,实现棉花总产大幅增长,应作为需要考虑的重要问题。 传统的棉花种植技术落后,人力成本耗费大, 操作流程繁琐,已不再适用于棉花产业的加速发展。 因此,在棉花生产管理中应用智慧农业,可以提供新的技术力量以及科学的种植方法,同时,基于其低成本、高效率、节省人力等多个优点,智慧农业已经成为棉花产业、乃至于世界农业产业发展的大方向。 智慧农业与棉花产业的有机结合可以为棉花产量的大幅度提高,进而实现棉花产业的大幅振兴提供重要的理论支撑。

    2、棉花加工智能化管理

    在智慧农业的支撑下同有机的相结合,保障了棉花的产量,其加工的方式也跟着更新换代,其中随着工厂智能化改革,信息化建设的不断推进,规模大、生产线复杂的企业对各种信息系统、自动化系统的部署与应用,使得生产企业车间管理变得越来越重要,对车间各类设备的安全性、可用性和运维管理等要求方面也越来越高。相比较下传统的监控系统、设备已无法满足企业对工厂“集中监控,统一管理”的需求,无法实现工厂、设备、生产、运行等信息状态全过程的高清展示、细节查看等操作。

    3、数据可视化解决方案

    可通过轻量化建模完成场景的搭建,继而通过数据绑定,呈现出场景流水线以及设备运行的状态,对加工厂起到监管作用,方便用户智能化管理。

    价值实现

    一、数据可视化

    棉花加工 3D 工厂场景监控系统不仅能实现生产监控全过程一体化、精细化、可视化、数字化的管理,集成企业现有的设备系统,及时发现问题、解决问题,让生产线全过程透明简单化。在生产过程中可控可管理,通过模型与对接的数据,反馈出运行状态,并且可以通过面板来控制抓棉机的运行,提升用户的体验度和管理。

    3D棉花厂|全方位监控管理,可视化让生产变得透明

     

    二、面板控制

    通过对抓棉机模型状态的数据绑定,可以实现创建出控制表单面板,对机器进行简单的运行控制。通过数据之间的交互,可以体现出设备的运行状态和场景流水线的走向,预防突发问题,起到合理有效的监查和控制的作用。

    3D棉花厂|全方位监控管理,可视化让生产变得透明

     

    总结

    现阶段,随着物联网、大数据等新兴技术大幅崛起,人工智能、大数据、深度学习等新兴概念已逐步渗透至生活的各个领域。 农业作为关系民生的传统行业,正处于重大改变的节点。 在未来,智慧农业可视化是棉花行业乃至整个农业行业发展的必然趋势,其对于轻简化植棉有着至关重要的作用。现阶段我们可以通过收集各方面的棉花数据,同棉花领域相关专业知识、数据资料相结合,并辅以神经网络、大数据技术进行分析, 建立棉花大数据库及相关数学模型,从而提高智慧农业决策能力,有效解决棉花生产管理所存在的相关问题;但目前智慧农业在棉花生产管理形式中仍存在一定的局限性。

    展开全文
  • 与室外空间相比,ThingJS平台的室内空间的三维可视化要求更加精细,如果不能很好地表达容易对用户造成误导! 与室外空间相比,室内空间的层次结构较为明显,各楼层间主要是通过楼梯、电梯等这些通道进行连接,除建筑...
  • Matplotlib可视化菜鸟教程

    千次阅读 2020-11-05 11:58:00
    公众号后台回复“图书“,了解更多号主新书内容作者:蛰虫适航来源:蛰虫适航简介Matplotlib可以说是Python最声名远扬的可视化库了,也是Python数据分析库的“三驾马车”之...
  • EverCraft一直在关注Web可视化技术的发展,在本系列文章里,小编将对国外一篇感觉很不错的综述性文章进行翻译,供这一领域的爱好者相互学习。这篇paper的信息为:“Mwalongo, F., et al., State-of-the-Art Report ...
  • 为什么会选择ThingJS搭建3D可视化场景? 不选择ThingJS的理由可能有很多,但是选择ThingJS,就是因为它简单,能够快速上手,十分容易入门,学习门槛极低!低到了什么程度?只需要你有JavaScript的开发经验就可以...
  • 12个超炫数据可视化工具

    千次阅读 2019-04-28 09:16:21
    12个超炫数据可视化工具 今天我们带来一篇来自Adobe工程师Rohit Boggarapu的文章。他在文章中介绍了一些适合网页开发者的数据可视化和绘图工具,让你不必再花大力气与枯燥的数据抗争。部分工具不要求写代码也可以...
  • 他每年都在突破,而企业这历史性的时刻用可视化数据大屏是否更有意义?答案是肯定的!那么数据可视化大屏于企业来说有什么重要意义及用处呢?  DIX(Data Integration Exchange)作为优锘IT和IoT各产品线的数据...
  • 物联网,大数据,人工智能,GIS等新兴技术,通过对园区内外的数据和资源进行检测、分析、集成和响应,实现对园区管理信息化、信息传递即时化、基础设施智能化、公共服务便捷化、产业发展现代化、社会治理精细化等,...
  • 物联网,大数据,人工智能,GIS等新兴技术,通过对园区内外的数据和资源进行检测、分析、集成和响应,实现对园区管理信息化、信息传递即时化、基础设施智能化、公共服务便捷化、产业发展现代化、社会治理精细化等,...
  • 实现价值 一、数据可视化 棉花加工 3D 工厂场景监控系统不仅能实现生产监控全过程一体化、精细化可视化、数字化的管理,集成企业现有的设备系统,及时发现问题、解决问题,让生产线全过程透明简单化,在生产过程...
  • 作为智慧城市的重要组成部分,智慧灯杆管理系统采用信息、数字手段,把路灯及城市景观照明等各种不同对象的监控和数据采集及处理融于一体, 为城市管理者进行城市管理、进行科学决策提供了强有力的手段。...
  • 数据中心作为基础设施,之前不断在底层无人问津,不过随着数字的疾速推进,数据中心的变化将更能表现新基建“基建+科技”的含义。新基建的浪潮中,阿里、腾讯等大厂企业不断投入千亿规划建造超大规模规模数据中心...
  • 商迪3D智慧消防是利用互联网、物联网、三维建模、3D可视化技术、WebGl,three.js红外线感知技术与视频监控系统、物联网数据,智慧消防集成一体的数字孪生系统。能实现消防设备的当前位置、状态,如有系统损坏能及时...
  • Unity 工具 之 常用的音乐/音频/语音类插件整理(音乐节拍/可视化/语音聊天/文字转语音等) 目录 Unity 工具 之 常用的音乐/音频/语音类插件整理(音乐节拍/可视化/语音聊天/文字转语音等) 一、简单介绍 二、...
  • 可视化之AQICN

    2017-06-07 09:04:00
    上一篇和大家分享了《可视化之Berkeley Earth》,这次看一看下面这个网站---aqicn.org。先做一个提示:文末有惊喜~ 该网站在中国有一定的权威性,PM2.5数据有一点敏感,它竟能提供全球级别,实时的,详尽的AQI数据,...
  • 使得我国经济快速发展,同时VR线上3D展示与电子沙盘3D可视化技术随着高兴技术产业的不断发展,商迪3D使得传统的产业工厂与园区也逐渐的向着智慧科技产业工厂与智能园去发展。VR3D可视化电子沙盘产业工厂与智能园区是...
  • 商迪3D运用3D可视化、3D建模和三维虚拟现实啊打造的变电站3D可视化线上监控管理平台,有利于变电站清洁可再数据的重复运用,变电站最佳的运行配置以及远程监控实时可视化等新型高科技产业的快速发展,变电站可视化...
  • 使得我国经济快速发展,同时VR线上3D展示与电子沙盘3D可视化技术随着高兴技术产业的不断发展,商迪3D使得传统的产业工厂与园区也逐渐的向着智慧科技产业工厂与智能园去发展。VR3D可视化电子沙盘产业工厂与智能园区是...
  • 3D可视化物联网平台是5G新时代互联网发展战略之一,随着社会与企业管理建设对社会现有的资源比如地上、地下空间数据的要求越来越迫切,而商迪3D使三维实景地图构建的的智慧园区3D可视化系统,可监控园区环境可视化、...
  • 过去的 2018 年,我们认为是国内工业互联网可视化的元年,图扑...2D 3D 可视化应用案例,希望能激发行业和学术工作者对可视化的深度思考,为推进国内工业互联网发展出份薄力。 数百个工业互联网2D/3D可视化案例集...
  • SuperMap iClient3D for WebGL将于每月更新一次产品包,目前已更新至2017年06月版本。下载SuperMap iClient3D for WebGL最新产品包请点击...1.新增可视化的专题范例,可视化效果包括热点图、风图、全球气温对比、全球船
  • 12个数据可视化工具,人人都能做出超炫图表

    万次阅读 多人点赞 2018-02-10 00:00:00
    他在文章中介绍了一些适合网页开发者的数据可视化和绘图工具,让你不必再花大力气与枯燥的数据抗争。部分工具不要求写代码也可以使用!我们诠释数据的方式和数据本身之间存在着巨大的鸿沟。尤其是当我们唯一的选择是...
  • 继《分享数百个 HT 工业互联网 2D 3D 可视化应用案例》2018 篇,图扑软件定义 2018 为国内工业互联网可视化的元年后,2019 年里我们与各行业客户进行了更深度合作,拓展了HT for Web在更多新领域的应用,图扑软件...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 282
精华内容 112
热门标签
关键字:

精细化道路webgl可视化