项目实战:数字孪生可视化大屏幕,实现生产过程实时监控

项目介绍

智慧工厂数据可视化系统,融合工业大数据、物联网、人工智能等各类信息技术,整合厂区现有信息系统的数据资源,实现数字孪生工厂、设备运维监测、智能管网监测、综合安防监测、便捷通行监测、能效管理监测、生产管理监测、仓储物流监测等多种功能,有效提高厂区综合监管能力、降低企业厂区运营成本,实现管理精细化、决策科学化和服务高效化。

项目展示

我们使用canvas,echarts,three.js开发绘制数字孪生工厂、设备运维监测、能效管理监测等页面,下面是项目中的一些案例

1.数字孪生工厂案例

2.设备运维监测案例

3.能效管理监测

项目开发

下面我们将通过项目实战教会大家如何利用canvas绘制一个智慧工厂数据可视化场景页面。

本文章以设备运维监测页面为案例讲解

1.场景画布绘制

针对智慧工厂数据可视化系统各种场景的绘制,首先我们使用canvas绘制一个画布,然后定义全局的canvas和ctx对象。

<canvas id="canvas" width="1880" height="900"></canvas>

let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
2.场景元素绘制

首先我们把模型的图片准备好,然后我们写一个函数createPic可以传入模型的坐标位置,模型的大小和模型的路径。

2.1 绘制模型

createPic前2个参数是坐标xy轴的位置,我们这边坐标点是10,10 就会在画布的左上角绘制模型。createPic第3个第四个参数是模型的大小,我们这边定义模型的大小是222,232 。createPic最后一个参数数模型图片的位置。

createPic(10,10,222,232,'../scanboard4/model/水池.png');//调节池
2.2 createPic函数实现

创建一个Image对象,把图片的路径src赋值给Image对象,在Image的onload方法中拿到Image图片并通过ctx对象(canvas上下文对象)的drawImage的方法把模型加载到画布上

2.3 绘制标签

给模型添加名称,实际设备参数

createPic(50,50,222,232,'../scanboard4/model/水池.png');//调节池
drawLabel(125,40,'pH:3.21');
drawTitle(125,159,'调节池');

2.4 drawTitle和drawLabel函数实现

我们使用canvasAPI中的fillText绘制文字,设备参数是动态参数经常会变,我们需要每次绘制的时候把上一次的文字抹除掉,这边我们通过clearRect方法把上一次的文字抹除,因为文字大小和长度不一样的,每次抹除的范围不一样,我们通过canvasAPI中的measureText(text)可以得到文字的长度和高度去抹除

//绘制标题
function drawTitle(x,y,title,color,font){
    ctx.beginPath();
    if(!font){
        ctx.font="18px Arial";
    }else{
        ctx.font = font; 
    }
    
    if(!color){
        ctx.fillStyle = "#F6DC2C"; 
    }else{
        ctx.fillStyle = color; 
    }
    ctx.textAlign="left";
    
    ctx.fillText(title,x,y); 
    ctx.closePath();  
    ctx.restore();    
}

//绘制指标
function drawLabel(x,y,text,color,font){
    ctx.beginPath();

    if(!font){
        ctx.font="14px Arial";
    }else{
        ctx.font = font; 
    }
    
    if(!color){
        ctx.fillStyle = "#fff"; 
    }else{
        ctx.fillStyle = color; 
    }
    var textWidth = ctx.measureText(text).width +50;
    var hangingBaseline = ctx.measureText(text).hangingBaseline;

    ctx.clearRect(x-3,y-(hangingBaseline+3),textWidth,(hangingBaseline+8));
    
    ctx.textAlign="left";
    ctx.fillText(text,x,y);
    ctx.closePath();      
}
2.5绘制管道

设备与设备之间会有管道转接,我们这边有金属风格、蓝色风格、绿色风格的管子,我们这边通过

drawTunnelLine和drawTunnelInterface 2个函数分别绘制管道和管道转接。

createPic(50,50,222,232,'../scanboard4/model/水池.png');//调节池
drawLabel(125,40,'pH:3.21');
drawTitle(125,159,'调节池');
//金属风格管道
drawTunnelLine(271, 87,387,87);
drawTunnelInterface(386,86,3);
drawTunnelLine(387,86,387,56);
//蓝色风格管道
drawTunnelLine1(271, 165,387,165);
//绿色风格管道
drawTunnelLine2(271, 256,387,256);
drawTunnelInterface2(387,267,2);
drawTunnelLine2(398,267,398,356);

2.6 drawTunnelLine和drawTunnelInterface函数实现

drawTunnelLine函数传入4个函数,分别是起点坐标和终点坐标。我们通过canvasAPI中fillRect绘制管道,通过createLinearGradient设置渐变色实现金属风格的渐变效果。

drawTunnelInterface函数传入3个函数,转接管的坐标点以及转接管的朝向。我通过canvasAPI中arc绘制圆弧,然后通过createRadialGradient设置渐变色实现金属风格的渐变效果。

// 绘制金属管道
function drawTunnelLine(x1, y1, x2, y2) {
    lineWidth = 10;  // 设置线条宽度
    // 计算线条的矩形范围
    let dx = x2 - x1;
    let dy = y2 - y1;
    let length = Math.sqrt(dx*dx + dy*dy);  // 线段长度
    let angle = Math.atan2(dy, dx);  // 线段的角度
    // 绘制矩形
    ctx.save();  // 保存当前上下文状态
    ctx.translate(x1, y1);  // 平移到起始点
    ctx.rotate(angle);  // 旋转到线段的角度

    var g1 = ctx.createLinearGradient(0, 0, 0,  lineWidth);
    g1.addColorStop(0.2, '#7A8383'); 
    g1.addColorStop(0.6, '#fff');
    g1.addColorStop(0.8, '#7A8383'); 
    ctx.fillStyle = g1;

    ctx.fillRect(0, 0, length, lineWidth);  // 绘制矩形
    ctx.restore();  // 恢复上下文状态
}

// 绘制金属管道转接口
function drawTunnelInterface(x,y,rotate){
    var RADIUS = 11;

    ctx.beginPath();
    ctx.lineWidth=0.01;
    ctx.moveTo(x, y);
    var rotate = (Math.PI/2) *rotate;

    ctx.arc(x, y, RADIUS, Math.PI / 2 + rotate, Math.PI + rotate); //sAngle 90 ,eAngle 180
    var g1 = ctx.createRadialGradient(
        x, // 内圆中心的 x 坐标
        y, // 内圆中心的 y 坐标
        0, // 内圆的半径
        x, // 外圆中心的 x 坐标
        y, // 外圆中心的 y 坐标
        RADIUS // 外圆的半径,这里设置为整个 Canvas 的一半
    );
    g1.addColorStop(0.2, '#7A8383'); 
    g1.addColorStop(0.6, '#fff');
    g1.addColorStop(0.8, '#7A8383'); 

    ctx.fillStyle = g1;
    ctx.fill();
    ctx.restore();
    ctx.stroke();
}

项目结束

以上我们一个简单的案例基础功能就完成了,通过此案例简单的介绍了一下canvas的一些功能,大家可以根据自己的需求场景绘制自己的可视化场景。

最后给大家看一下我在工作中绘制的一些别的场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/296462.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据分析实战】冰雪大世界携程景区评价信息情感分析采集词云

文章目录 引言数据采集数据集展示数据预处理 数据分析评价总体情况分析本人浅薄分析 各游客人群占比分析本人浅薄分析 各评分雷达图本人浅薄分析 差评词云-可视化本人浅薄分析 好评词云-可视化本人浅薄分析 综合分析写在最后 今年冬天&#xff0c;哈尔滨冰雪旅游"杀疯了&q…

技术学习|CDA level I 业务分析方法

业务分析方法有三个主要构成部分&#xff1a;业务指标分析、业务模型分析及业务分析方法。 业务指标分析是发现业务问题的核心方法&#xff1a;用于通用指标和场景指标的计算及分析方法&#xff0c;以及指标体系的设计与应用方法。业务模型是从一系列业务行为中抽象出来的信息…

请你列出逻辑电路中的24种表达式

随着时代发展&#xff0c;数字电路的使用频率越来越高&#xff0c;完全不低于模拟电路&#xff0c;因此从事数字电路的工程师越来越多&#xff0c;如果你想成为一名优秀的数字工程师&#xff0c;一定要学会下面的逻辑电路表达式&#xff01; 1、基本逻辑运算与运算 (AND): A AN…

04 帧 Frame

文章目录 04 帧 Frame4.1 相机相关信息4.2 特征点提取4.2.1 特征点提取 ExtractORB()4.3 ORB-SLAM2对双目/RGBD特征点的预处理4.3.1 双目视差公式4.3.2 双目图像特征点匹配 ComputeStereoMatches()4.3.3 根据深度信息构造虚拟右目图像&#xff1a;ComputeStereoFromRGBD() 4.4 …

Python中的h5py包使用

h5py是一个非常强大的工具&#xff0c;可以用于存储和处理大量科学数据。它可以帮助我们提高数据处理的效率和可靠性。 目录 一、h5py1.1 特点1.2 主要功能1.3 常用场景 二、安装h5py三、示例代码3.1 运行结果 四、总结 一、h5py h5py是Python中的一个库&#xff0c;提供了对H…

JS函数实现数字转中文大写

JS函数实现数字转中文大写 1. 数字转字符,分割,去除空字符2. 遍历分割字符,替换为中文3. 增加四位数单位4. 处理零5. 拼接四位数据和单位 项目中,JS将万亿以下正整数转为中文大写 1. 数字转字符,分割,去除空字符 function toChineseNumber(num){const strs num.toString().re…

计算机组成原理 总线

总线 总线定义 总线 总线是一组能为多个部件分时共享的公共信息传送线路 总线的好处 早期计算机外部设备少时大多采用分散连接方式&#xff0c;不易实现随时增减外部设备 为了更好地解决I/O设备和主机之间连接的灵活性问题&#xff0c;计算机的结构从分散连接发展为总线连接 …

Mac环境下Parallels Desktop 19的安装和使用

为了后续构建漏洞靶场和渗透测试环境&#xff0c;我们需要提前准备好几套与宿主机隔离的工作环境&#xff08;Windows、Linux等&#xff09;&#xff0c;在Mac上最常用的就是Paralles Desktop&#xff08;PD&#xff09;工具了&#xff0c;当前最新版本为19。接下来介绍如何安装…

QT工具栏开始,退出

QT工具栏开始&#xff0c;退出 //初始化场景QMenuBar *bar menuBar();setMenuBar(bar);QMenu *startbar bar->addMenu("开始");QAction * quitAction startbar->addAction("退出");connect(quitAction , &QAction::triggered,[](){this->c…

Chromedriver 下载和安装指南

1. 确定Chrome浏览器版本 首先&#xff0c;在谷歌浏览器中找到当前版本信息。 打开“设置”&#xff0c;点击“关于谷歌”即可看到版本号。确保后续下载的Chromedriver版本与Chrome浏览器版本一致。或者直接跳转网页地址&#xff1a;chrome://settings/help 2. 下载Chromedri…

js逆向第12例:猿人学第5题js混淆-乱码增强

文章目录 那么`RM4hZBv0dDon443M=`是怎么来的?密钥怎么找加密数组怎么破解_0x4e96b4[_$pr]m=,f=时间戳是哪个?打开控制台查看数据接口 https://match.yuanrenxue.cn/api/match/5?page=2&m=1704439385499&f=1704439384000 利用postman测试接口请求,判断参数是否强…

机器学习 - 决策树

场景 之前有说过k近邻算法&#xff0c;k近邻算法是根据寻找最相似特征的邻居来解决分类问题。k近邻算法存在的问题是&#xff1a;不支持自我纠错&#xff0c;无法呈现数据格式&#xff0c;且吃性能。k近邻算法的决策过程并不可视化。对缺失数据的样本处理很不友好&#xff0c;…

C++ OpenGL 3D GameTutorial 1:Making the window with win32 API学习笔记

视频地址https://www.youtube.com/watch?vjHcz22MDPeE&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg 一、入口函数 首先看入口函数main代码&#xff1a; #include<OGL3D/Game/OGame.h>int main() {OGame game;game.Run();return 0; } 这里交代个关于C语法的问题&#x…

MidJourney笔记(10)-faq-fast-help-imagine-info-public-stealth

/faq 在官方 Midjourney Discord 服务器中使用可快速生成流行提示工艺频道常见问题解答的链接。 不过这个命令,我也是没有找到入口,之前还能在MidJourney的频道里使用,然后最近发现没有权限,有点奇怪。不知道系统又做了什么升级。 /fast 切换到快速模式。

七、HTML 文本格式化

一、HTML 文本格式化 加粗文本斜体文本电脑自动输出 这是 下标 和 上标 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>HTML文本格式化</title> </head><body><b>加粗文本</b><br>…

HarmonyOS应用开发学习笔记 包名、icon图标,应用名修改 UIAbility组件介绍、UIAbility启动模式、UIAbility组件基本用法

目前HarmonyOS应用主推的是Stage模型开发 一、Stage模型基本概念 项目描述UIAbility组件UIAbility组件是一种包含UI界面的应用组件&#xff0c;主要用于和用户交互。例如&#xff0c;图库类应用可以在UIAbility组件中展示图片瀑布流&#xff0c;在用户选择某个图片后&#xf…

Mysqld的关键优化参数

skip-name-resolve 现象 mysql连接很慢&#xff0c;登陆到服务器上查看服务器日志都是正常的&#xff0c;无可疑记录&#xff0c;登陆到mysql服务器上&#xff0c;查看下进程&#xff0c;发现有很多这样的连接&#xff1a; 218 | unauthenticated user | 192.168.10.6:44500 |…

Stable Diffusion架构的3D分子生成模型 GeoLDM - 测评与代码解析

之前&#xff0c;向大家介绍过3D分子生成模型 GeoLDM。 GeoLDM按照Stable Diffusion架构&#xff0c;将3D分子生成的扩散过程运行在隐空间内&#xff0c;优化了基于扩散模型的分子生成。可能是打开Drug-AIGC的关键之作。让精确控制分子生成有了希望。 详见&#xff1a;分子生成…

听GPT 讲Rust源代码--compiler(16)

File: rust/compiler/rustc_span/src/lib.rs 在Rust源代码中&#xff0c;rust/compiler/rustc_span/src/lib.rs文件定义了与Rust编译器源代码位置相关的数据结构和功能。 下面是对一些重要结构和枚举类型的详细介绍&#xff1a; SessionGlobals: 代表编译器会话&#xff08;Ses…

leetcode2975. 移除栅栏得到的正方形田地的最大面积

题目 有一个大型的 (m - 1) x (n - 1) 矩形田地&#xff0c;其两个对角分别是 (1, 1) 和 (m, n) &#xff0c;田地内部有一些水平栅栏和垂直栅栏&#xff0c;分别由数组 hFences 和 vFences 给出。 水平栅栏为坐标 (hFences[i], 1) 到 (hFences[i], n)&#xff0c;垂直栅栏为…
最新文章