CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制

版本简介:

cesium:1.99;Supermap3D:SuperMap iClient JavaScript 11i(2023);

官方下载文档链家:SuperMap技术资源中心|为您提供全面的在线技术服务

示例参考:support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#analysis

support.supermap.com.cn:8090/webgl/examples/webgl/examples.html

Cesium:场景初始化、渲染、Bing地图、S3M图层加载。

SuperMap3D:可视域分析、S3M图层加载、裁剪区域绘制、Knockout绑定等功能。

两者结合:Cesium 提供基础渲染和事件处理,SuperMap3D 提供高级的功能实现。

1. Cesium 部分

场景初始化与配置
Cesium.Ion.defaultAccessToken = '...';
var viewer = new Cesium.Viewer('Container', {selectionIndicator: false,infoBox: false,terrainProvider: Cesium.createWorldTerrain()
});
viewer.resolutionScale = window.devicePixelRatio;
  • 这段代码是使用 Cesium 进行场景渲染的部分。Cesium.Ion.defaultAccessToken 用于访问 Cesium Ion 服务,viewer 是 Cesium Viewer 的实例,它用于创建一个可视化容器,其中指定了Container元素来渲染场景。createWorldTerrain() 设置了全球地形服务,resolutionScale 提高了分辨率,以适应高DPI屏幕。
添加Bing地图图层
viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({url: 'https://dev.virtualearth.net',mapStyle: Cesium.BingMapsStyle.AERIAL,key: URL_CONFIG.BING_MAP_KEY
}));
  • 这里是Cesium的图层管理部分,使用 BingMapsImageryProvider 添加了 Bing 地图的航拍图层。Cesium 的图层管理方式主要通过 imageryLayers.addImageryProvider() 实现。
事件处理与视口操作
var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(function (e) {//...
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  • 这一部分代码处理的是 Cesium 中的鼠标事件,如屏幕空间事件(ScreenSpaceEventHandler) 和鼠标移动事件 (MOUSE_MOVE)。这是 Cesium 的交互控制,通过捕捉鼠标操作来对场景进行更新。

2. SuperMap3D 部分

可视域分析与裁剪
var viewshed3D = new SuperMap3D.ViewShed3D(scene);
  • 这里是 SuperMap3D 提供的可视域分析功能的初始化。SuperMap3D.ViewShed3D 是用于在 3D 场景中执行可视域分析的类,用于计算某个点是否可见。
加载S3M图层
var promise = scene.open('http://www.supermapol.com/realspace/services/3D-CBD-2/rest/realspace');
SuperMap3D.when(promise, function (layers) {// 设置相机位置等操作
}, function (e) {// 错误处理
});
  • 这里通过 scene.open() 加载了 SuperMap3D 的 S3M 图层,这个图层是 SuperMap 提供的特定格式,通常用于大规模3D场景的渲染和展示。
裁剪区域操作
var handlerPolygon = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Polygon, 0); 
handlerPolygon.movingEvt.addEventListener(function (windowPosition) {if (handlerPolygon.isDrawing) {tooltip.showAt(windowPosition, '<p>绘制相交区域(右键结束绘制)</p>'); // 绘制提示}
});
handlerPolygon.drawEvt.addEventListener(function (result) {var array = [].concat(result.object.positions);var positions = [];for (var i = 0, len = array.length; i < len; i++) {var cartographic = SuperMap3D.Cartographic.fromCartesian(array[i]);var longitude = SuperMap3D.Math.toDegrees(cartographic.longitude);var latitude = SuperMap3D.Math.toDegrees(cartographic.latitude);var h = cartographic.height;positions.push(longitude, latitude, h);}viewshed3D.addClipRegion({name: 'test', position: positions}); // 添加裁剪区域
});
  • 这是 SuperMap3D 的裁剪操作部分。通过 SuperMap3D.DrawHandler 绘制多边形区域,viewshed3D.addClipRegion() 函数则用于将绘制的区域应用到可视域分析对象中,进行裁剪。
  • DrawHandler 用于激活绘制多边形裁剪面的功能。
  • movingEvt 事件在绘制过程中显示提示信息。
  • drawEvt 事件在绘制完成时获取多边形的坐标,并将其设置为可视域的裁剪区域。
Knockout 绑定
SuperMap3D.knockout.track(viewModel);
SuperMap3D.knockout.applyBindings(viewModel, toolbar);
  • 这段代码是使用 SuperMap3D 提供的 Knockout 绑定功能,目的是将数据模型 viewModel 与 UI 绑定。这个功能允许动态更新可视域分析的参数。

3. Cesium 和 SuperMap3D 的结合

Cesium 在整个代码中主要负责场景渲染、基础交互和图层的管理,如初始化 Viewer、处理鼠标事件、添加图层等。而 SuperMap3D 负责具体的功能实现,比如可视域分析、S3M 图层加载、裁剪操作等。

两者通过 viewer.scene 来共享场景,SuperMap3D 的功能在 Cesium 的场景之上实现。例如:

  • var viewshed3D = new SuperMap3D.ViewShed3D(scene); —— 这里的 scene 是 Cesium 场景,而 viewshed3D 是 SuperMap3D 的可视域对象,它依赖于 Cesium 的场景。
  • 加载S3M图层和添加裁剪区域也是在 Cesium 场景中进行操作,二者配合使用

 4.完整代码展示

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"><meta name="viewport"content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"><title>可视域分析</title><link href="../../public/SuperMap3D/Widgets/widgets.css" rel="stylesheet"><link rel="stylesheet" href="./css/font-awesome.min.css"><link href="../css/pretty.css" rel="stylesheet"><link href="../css/style.css" rel="stylesheet"><link href="../css/viewshed3D.css" rel="stylesheet"><script type="text/javascript" src="../js/jquery.min.js"></script><script src="../js/slider.js"></script><script src="../js/config.js"></script><script src="../js/tooltip.js"></script><script src="../js/spectrum.js"></script><script type="text/javascript" src="../../public/SuperMap3D/SuperMap3D.js"></script><script src="../../../Cesium-1.99/Build/Cesium/Cesium.js"></script><link href="../../../Cesium-1.99/Build/Cesium/Widgets/widgets.css">
</head><body>
<div id="Container"></div>
<div id='loadingbar' class="spinner"><div class="spinner-container container1"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container2"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container3"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div>
</div>
<div id="toolbar" class="param-container tool-bar"><button type="button" id="chooseView" class="button black">绘制可视域</button><button type="button" id="cilpRegion" class="button black">绘制裁剪面</button><button type="button" id="clear" class="button black">清除</button><div class="param-item"><b>裁剪模式:</b><select id="clip-mode" class="supermap3d-button"><option value="keep-inside">保留区域内</option><option value="keep-outside">保留区域外</option></select></div>
</div><div id="wrapper" style="display:none"><div id="login" class="animate form"><span class="close" aria-hidden="true">×</span><form><h1>属性编辑</h1><p><div><label>方向(度)</label><input type="range" id="direction" min="0" max="360" step="1.0" title="方向"data-bind="value: direction, valueUpdate: 'input'"><input type="text" size="5" data-bind="value: direction"></div><div><label>翻转(度)</label><input type="range" id="pitch" min="-90" max="90" step="1.0" value="1" title="翻转"data-bind="value: pitch, valueUpdate: 'input'"><input type="text" size="5" data-bind="value: pitch"></div><div><label>距离(米)</label><input type="range" id="distance" min="1" max="500" step="1.0" value="1" title="距离"data-bind="value: distance, valueUpdate: 'input'"><input type="text" size="5" data-bind="value: distance"></div><div><label>水平视场角(度)</label><input type="range" id="horizonalFov" min="1" max="120" step="1" value="1" title="水平视场角"data-bind="value: horizontalFov, valueUpdate: 'input'"><input type="text" size="5" data-bind="value: horizontalFov"></div><div><label>垂直视场角(度)</label><input type="range" id="verticalFov" min="1" max="90" step="1.0" value="1" title="垂直视场角"data-bind="value: verticalFov, valueUpdate: 'input'"><input type="text" size="5" data-bind="value: verticalFov"></div></p><p><div class="square square-left"><label>可见区域颜色</label><input class="colorPicker" data-bind="value: visibleAreaColor,valueUpdate: 'input'"id="colorPicker1"/></div><div class="square square-right"><label>不可见区域颜色</label><input class="colorPicker"data-bind="value: invisibleAreaColor,valueUpdate: 'input'"id="colorPicker2"/></div></p><br/><br/><p><label>本例中观察者附加高度:1.8 米</label></p></form></div>
</div><script type="text/javascript">function onload(Cesium) {Cesium.Ion.defaultAccessToken = 'your token'var viewer = new Cesium.Viewer('Container', {selectionIndicator: false,infoBox: false,terrainProvider: Cesium.createWorldTerrain()});viewer.resolutionScale = window.devicePixelRatio;viewer.scenePromise.then(function(scene){init(Cesium, scene, viewer);});}function init(Cesium, scene, viewer) {var labelImagery = new Cesium.TiandituImageryProvider({mapStyle: Cesium.TiandituMapsStyle.CIA_C,//天地图全球中文注记服务token: 'your token' //由天地图官网申请的密钥});var scene = viewer.scene;scene.lightSource.ambientLightColor = new Cesium.Color(0.65, 0.65, 0.65, 1);var viewPosition;if (!scene.pickPositionSupported) {alert('不支持深度纹理,可视域分析功能无法使用(无法添加观测)!');}// 先将此标记置为true,不激活鼠标移动事件中对可视域分析对象的操作scene.viewFlag = true;var pointHandler = new Cesium.DrawHandler(viewer, Cesium.DrawMode.Point);// 创建可视域分析对象var viewshed3D = new SuperMap3D.ViewShed3D(scene);var colorStr1 = viewshed3D.visibleAreaColor.toCssColorString();var colorStr2 = viewshed3D.hiddenAreaColor.toCssColorString();var widget = viewer.Widget;try {//添加S3M图层var promise = scene.open('http://www.supermapol.com/realspace/services/3D-CBD-2/rest/realspace');SuperMap3D.when(promise, function (layers) {// 图层加载完成,设置相机位置scene.camera.setView({destination: SuperMap3D.Cartesian3.fromDegrees(116.44366835831197, 39.907137217792666, 48.237028126511696),orientation: {heading: 1.6310555040487564,pitch: 0.0017367269669030794,roll: 3.007372129104624e-12}});for (var i = 0; i < layers.length; i++) {layers[i].selectEnabled = false;}}, function (e) {if (widget._showRenderLoopErrors) {var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';widget.showErrorPanel(title, undefined, e);}});} catch (e) {if (widget._showRenderLoopErrors) {var title = '渲染时发生错误,已停止渲染。';widget.showErrorPanel(title, undefined, e);}}var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);// 鼠标移动时间回调handler.setInputAction(function (e) {// 若此标记为false,则激活对可视域分析对象的操作if (!scene.viewFlag) {//获取鼠标屏幕坐标,并将其转化成笛卡尔坐标var windowPosition = e.endPosition;scene.pickPositionAsync(windowPosition).then((last)=>{//计算该点与视口位置点坐标的距离var distance = SuperMap3D.Cartesian3.distance(viewPosition, last);if (distance > 0) {// 将鼠标当前点坐标转化成经纬度var cartographic = Cesium.Cartographic.fromCartesian(last);var longitude = Cesium.Math.toDegrees(cartographic.longitude);var latitude = Cesium.Math.toDegrees(cartographic.latitude);var height = cartographic.height;// 通过该点设置可视域分析对象的距离及方向viewshed3D.setDistDirByPoint([longitude, latitude, height]);}})}}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);handler.setInputAction(function (e) {//鼠标右键事件回调,不再执行鼠标移动事件中对可视域的操作scene.viewFlag = true;$("#wrapper").show();viewModel.direction = viewshed3D.direction;viewModel.pitch = viewshed3D.pitch;viewModel.distance = viewshed3D.distance;viewModel.horizontalFov = viewshed3D.horizontalFov;viewModel.verticalFov = viewshed3D.verticalFov;}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);var tooltip = createTooltip(document.body);//绘制裁剪面var handlerPolygon = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Polygon, 0);handlerPolygon.activeEvt.addEventListener(function (isActive) {if (isActive == true) {viewer.enableCursorStyle = false;viewer._element.style.cursor = '';$('body').removeClass('drawCur').addClass('drawCur');} else {viewer.enableCursorStyle = true;$('body').removeClass('drawCur');}});handlerPolygon.movingEvt.addEventListener(function (windowPosition) {if (handlerPolygon.isDrawing) {tooltip.showAt(windowPosition, '<p>绘制相交区域(右键结束绘制)</p>');}});handlerPolygon.drawEvt.addEventListener(function (result) {tooltip.setVisible(false);var array = [].concat(result.object.positions);var positions = [];for (var i = 0, len = array.length; i < len; i++) {var cartographic = SuperMap3D.Cartographic.fromCartesian(array[i]);var longitude = SuperMap3D.Math.toDegrees(cartographic.longitude);var latitude = SuperMap3D.Math.toDegrees(cartographic.latitude);var h = cartographic.height;if (positions.indexOf(longitude) == -1 && positions.indexOf(latitude) == -1) {positions.push(longitude);positions.push(latitude);positions.push(h);}}handlerPolygon.polygon.show = false;handlerPolygon.polyline.show = false;viewshed3D.addClipRegion({name: 'test', position: positions});handlerPolygon.deactivate();});pointHandler.drawEvt.addEventListener(function (result) {// var point = result.object;var position = result.object.position;viewPosition = position;// 将获取的点的位置转化成经纬度var cartographic = Cesium.Cartographic.fromCartesian(position);var longitude = Cesium.Math.toDegrees(cartographic.longitude);var latitude = Cesium.Math.toDegrees(cartographic.latitude);var height = cartographic.height + 1.8;// point.position = SuperMap3D.Cartesian3.fromDegrees(longitude, latitude, height);if (scene.viewFlag) {// 设置视口位置viewshed3D.viewPosition = [longitude, latitude, height];viewshed3D.build();// 将标记置为false以激活鼠标移动回调里面的设置可视域操作scene.viewFlag = false;}});var viewModel = {direction: 1.0,pitch: 1.0,distance: 1.0,verticalFov: 1.0,horizontalFov: 1.0,visibleAreaColor: '#ffffffff',invisibleAreaColor: '#ffffffff'};SuperMap3D.knockout.track(viewModel);var toolbar = document.getElementById('wrapper');SuperMap3D.knockout.applyBindings(viewModel, toolbar);SuperMap3D.knockout.getObservable(viewModel, 'direction').subscribe(function (newValue) {if(viewshed3D.direction !== parseFloat(newValue)){viewshed3D.direction = parseFloat(newValue);viewshed3D.removeClipRegion('test');}});SuperMap3D.knockout.getObservable(viewModel, 'pitch').subscribe(function (newValue) {if(viewshed3D.pitch !== parseFloat(newValue)){viewshed3D.pitch = parseFloat(newValue);viewshed3D.removeClipRegion('test');}});SuperMap3D.knockout.getObservable(viewModel, 'distance').subscribe(function (newValue) {if(viewshed3D.distance !== parseFloat(newValue)){viewshed3D.distance = parseFloat(newValue);viewshed3D.removeClipRegion('test');}});SuperMap3D.knockout.getObservable(viewModel, 'verticalFov').subscribe(function (newValue) {if(viewshed3D.verticalFov !== parseFloat(newValue)){viewshed3D.verticalFov = parseFloat(newValue);viewshed3D.removeClipRegion('test');}});SuperMap3D.knockout.getObservable(viewModel, 'horizontalFov').subscribe(function (newValue) {if(viewshed3D.horizontalFov !== parseFloat(newValue)){viewshed3D.horizontalFov = parseFloat(newValue);viewshed3D.removeClipRegion('test');}});SuperMap3D.knockout.getObservable(viewModel, 'visibleAreaColor').subscribe(function (newValue) {var color = SuperMap3D.Color.fromCssColorString(newValue);viewshed3D.visibleAreaColor = color;});SuperMap3D.knockout.getObservable(viewModel, 'invisibleAreaColor').subscribe(function (newValue) {var color = SuperMap3D.Color.fromCssColorString(newValue);viewshed3D.hiddenAreaColor = color;});$("#colorPicker1").spectrum({color: colorStr1,showPalette: true,showAlpha: true,localStorageKey: "spectrum.demo",preferredFormat:'rgb'});$('#colorPicker2').spectrum({color: colorStr2,showPalette: true,showAlpha: true,localStorageKey: "spectrum.demo",preferredFormat:'rgb'});$(".close").click(function () {$("#wrapper").hide();});$("#chooseView").click(function (e) {if (pointHandler.active) {return;}//先清除之前的可视域分析// viewer.entities.removeAll();viewshed3D.distance = 0.1;scene.viewFlag = true;//激活绘制点类pointHandler.activate();});$("#clip-mode").on("input propertychange", function () {clipMode = $(this).val() === 'keep-inside' ? SuperMap3D.ClippingType.KeepInside : SuperMap3D.ClippingType.KeepOutside;viewshed3D.setClipMode(clipMode);});$("#cilpRegion").click(function (e) {handlerPolygon.deactivate();handlerPolygon.activate();});$("#clear").on("click", function () {viewshed3D.removeAllClipRegion();// 清除观察点pointHandler.clear()$("#wrapper").hide();viewshed3D.distance = 0.1;scene.viewFlag = true;})$('#loadingbar').remove();$("#toolbar").show();}if (typeof SuperMap3D !== 'undefined') {window.startupCalled = true;onload(SuperMap3D);}
</script>
</body></html>

注意替换Cesium.Ion.defaultAccessToken,以及天地图官网申请的密钥 

5.效果展示:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

切换淘宝最新镜像源npm详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 在中国大陆&#xff0c;npm&#xff08;Node Package Manager&#xff09;的默认源由于网络限制&#xff0c;速度可能较慢。为了解决这个问题&#xff0c;淘宝提供了一个镜像源&#xff0c;它同步了 npm 的…

电商API接口安全:警惕常见漏洞,筑牢数据防线

在电子商务的蓬勃发展中&#xff0c;API接口扮演着至关重要的角色&#xff0c;它们使得数据交换和业务流程自动化成为可能。然而&#xff0c;随着API的广泛应用&#xff0c;安全问题也日益凸显。本文将探讨电商API接口中常见的安全漏洞&#xff0c;并提供有效的防范措施。 一、…

第158天:安全开发-Python-Socket编程反弹Shell分离免杀端口探针域名爆破

前置知识 使用 socket 模块 1. 导入模块 首先&#xff0c;你需要导入 Python 的 socket 模块。 import socket 2. 创建套接字 使用 socket.socket() 函数创建一个新的套接字。这个函数可以接收两个参数&#xff1a;地址族和套接字类型。 地址族&#xff08;Address Family&…

大厂硬件梦:字节、腾讯“向首”,华为、小米“向手”

涉足可穿戴设备的大厂们&#xff0c;都抱着再造用户入口的野望&#xff0c;大模型治不好的痼疾&#xff0c;仍需继续前行寻找解药。 转载&#xff1a;科技新知 原创 作者丨茯神 编辑丨蕨影 苹果发布会再次令网友失望&#xff01;相比iPhone新机配色丑上热搜&#xff0c;反而苹…

《PostMan(一):配置全局令牌》

文章目录 一、配置全局token1、设置2、添加全局3、添加全局变量名称4、选中全局&#xff0c;并查看5、添加赋值脚本6、配置令牌取值7、即可成功获取用户信息 一、配置全局token 1、设置 2、添加全局 3、添加全局变量名称 4、选中全局&#xff0c;并查看 5、添加赋值脚本 // 把…

2024年智能船舶与机电系统国际学术会议(ICISES 2024)

2024年智能船舶与机电系统国际学术会议&#xff08;ICISES 2024&#xff09;初定于2024年12月27-29日在中国广州举行。会议主要围智能船舶与机电系统等研究领域展开讨论。会议旨在为从事相关研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&#xf…

门磁模块详解(防盗感应开关 STM32)

目录 一、介绍 二、程序设计 main.c文件 gate_guard.h文件 gate_guard.c文件 三、实验效果 四、资料获取 项目分享 一、介绍 MC-38常闭式门磁开关是作为IO开关输入数字信号的&#xff0c;原理是合在一起信号是导通的 , 配合有线主机使用 不能单独使用。适用于非铁质&a…

function uuid_generate_v4()不存在

说明&#xff1a;记录一次使用postgresql函数错误&#xff0c;如下&#xff1a; 项目中的一个SQL用到了uuid_generate_v4()函数生成uuid作为记录的主键&#xff0c;结果报上面这个错误&#xff1b; 分析&排查 首先&#xff0c;我连接上了数据库&#xff0c;在数据库里敲下…

矩阵直播换IP:如何使用代理IP提升直播效果

在直播行业中&#xff0c;稳定的网络连接和高质量的直播效果至关重要。然而&#xff0c;随着观众数量的增加和网络环境的复杂化&#xff0c;直播过程中可能会遇到网络波动、IP封禁等问题。通过使用代理IP&#xff0c;可以有效解决这些问题&#xff0c;提升直播效果。本文将详细…

谈谈LLM训练中的“过拟合”与“欠拟合”

如今&#xff0c;由于其出色的理解、生成和操纵人类语言的能力&#xff0c;语言模型已经成为焦点。据最新调查数据显示&#xff0c;大概30%的企业计划使用非结构化数据来提高大型语言模型&#xff08;LLM&#xff09;的准确性。在训练这些语言模型时&#xff0c;一个基本挑战是…

VSCode C++ Tasks.json基本信息介绍

前言 上文介绍了VSCode在Windows环境下如果创建C项目和编译多个文件项目&#xff0c;但是只是粗略的说明了一下Tasks.json文件。今天对tasks.json进行进一步的了解。 内容 Tasks文件 {"version": "2.0.0","tasks": [{"type": &quo…

IPC之AIDL从认识到实战

目录 前言 什么是AIDL? 为什么要设计出这样一种语言&#xff1f;它能帮助我们干什么&#xff1f; 还有其他方法能实现跨进程通信吗&#xff1f;相较于别的方法AIDL有什么优势呢&#xff1f; AIDL的相关语法 Java与AIDL的不同之处 AIDL默认支持的数据类型&#xff1a; …

博弈美业系统实操:美业门店管理系统如何查看客户档案?美业SaaS系统源码

1.打开博弈美业App&#xff1b; 2.点击App下方【客户】&#xff0c;进入客户管理页&#xff1b; 3.找到想要查看的客户&#xff0c;点击进入客户详情页&#xff1b; 4.客户详情页可查看客户个人信息、个性标签、消费记录、回访记录等等详细信息。

RedisTemplate操作ZSet的API

文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素&#xff0c;并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…

026.(娱乐)魔改浏览器-任务栏图标右上角加提示徽章

一、目标&#xff1a; windows中&#xff0c;打开chromium&#xff0c;任务栏中会出现一个chromium的图标。我们的目标是给这个图标的右上角&#xff0c;加上"有1条新消息"的小提示图标&#xff0c;也叫徽章(badge)注意&#xff1a;本章节纯属娱乐&#xff0c;有需要…

钻机、塔吊等大型工程设备,如何远程维护、实时采集运行数据?

在建筑和工程领域&#xff0c;重型设备的应用不可或缺&#xff0c;无论是在道路与桥梁建设、高层建筑施工&#xff0c;还是在风电、石油等能源项目的开发中&#xff0c;都会用到塔吊、钻机等大型机械工程设备。 随着数字化升级、工业4.0成为行业发展趋势&#xff0c;为了进一步…

基于python+django+mysql+Nanodet检测模型的水稻虫害检测系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Qt (16)【Qt 事件 —— Qt 事件简介 | 如何重写相关的 Event 函数】

阅读导航 引言一、事件介绍二、如何重写相关的 Event 函数1. 事件的处理简介2. 示例重写鼠标相关的 Event 函数&#xff08;1&#xff09;新建Qt项目&#xff0c;设计UI文件&#xff08;2&#xff09;新添加MyLabel类&#xff08;3&#xff09;重写enterEvent()方法和leaveEven…

果蔬识别系统架构+流程图

相关文章和代码 果蔬识别系统 果蔬识别系统优化&#xff08;1~5&#xff09; 架构图 流程图 初始化 识别流程 学习流程 同步流程 与初始化类似&#xff0c;只是同步只同步一个storeCode数据 删除数据流程 导入数据

三、k8s中的控制器的使用

一 什么是控制器 官方文档&#xff1a; 工作负载管理 | Kubernetes 控制器也是管理pod的一种手段 自主式pod&#xff1a;pod退出或意外关闭后不会被重新创建 控制器管理的 Pod&#xff1a;在控制器的生命周期里&#xff0c;始终要维持 Pod 的副本数目 Pod控制器是管理pod…