三维地图,智慧城市,商业智能BI,数据可视化大屏(Cesiumjs/UE)
绘图工具
三维地图:Cesiumjs
建模方式:激光点云建模、航拍倾斜摄影建模、GIS建模、BIM建模、手工建模
建模工具:C4D Blender GeoBuilding ArcGIS
Cesiumjs
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../Build/Cesium/Cesium.js"></script><link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet"/><style>html,body{margin: 0;padding: 0;}</style>
</head>
<body>
<div id="Cesium"></div>
<script>// 在 Cesium官网上 注册用户获取 tokenCesium.Ion.defaultAccessToken = '***';// 基础图层,在线方式,从 Cesium 官方下载 瓦片let baseLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3813) // 需要在 Cesium官网 Asset Depot 添加 对应图层的 权限);// 离线方式,自行维护一个可访问的瓦片目录let baseLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.TileMapServiceImageryProvider.fromUrl(// 用模块的方式引入 Cesium 时,会有 /cesium/Assets/Textures 这个目录Cesium.buildModuleUrl('/cesium/Assets/Textures/3813')// 获取瓦片:用Chrome扩展程序 Save All Resources 保存用在线方式访问到的瓦片));baseLayer.gamma = 0; // 伽玛校正(对比度、亮度)baseLayer.hue = Cesium.Math.toRadians(0); // 色调【色相】,取值范围在 0-PI,参考色调环baseLayer.saturation = 1; // 饱和度,饱和度数值越低越(亮度高时)泛白(亮度低时)范黑baseLayer.alpha = 1; // 透明度baseLayer.brightness = 1; // 亮度// 3D地图查看器const viewer = new Cesium.Viewer('Cesium', {baseLayerPicker: false, // 底图[卫星、地形、矢量]切换按钮animation: false, // 左下角 时间播放控件timeline: false, // 下方 时间轴homeButton: false, // 右上角 主页按钮navigationHelpButton: false, // 右上角 问号按钮geocoder: false, // 右边上角 搜索框fullscreenButton: false, // 右下角 全屏按钮infoBox: false, // 点击实体时右侧出现的信息框selectionIndicator: false, // 点击地球时鼠标处出现的指示框contextOptions: {webgl: {alpha: true, // 允许透明背景}},baseLayer,});viewer.scene.globe.show = true; // 显示地球viewer.scene.skyBox.show = false; // 不显示星空viewer.scene.sun.show = false; // 不显示太阳viewer.scene.moon.show = false; // 不显示月球viewer.scene.skyAtmosphere.show = false; // 不显示大气viewer.scene.backgroundColor = Cesium.Color.TRANSPARENT; // 透明背景,需设置viewer.contextOptions.webgl.alphaCesium.GeoJsonDataSource.load("./world.json", { // 载入 GeoJson 矢量数据fill: Cesium.Color.TRANSPARENT, // 透明填充})let headingPitchRange = new Cesium.HeadingPitchRange(Cesium.Math.toRadians(50), Cesium.Math.toRadians(-90), 2000);// viewer.camera.lookAt(Cesium.Cartesian3.fromDegrees(116.39, 39.91), headingPitchRange); // 设置相机观察目标,同时设定了相机控制器的环绕点viewer.scene.camera.setView({ // 切换相机视口destination: Cesium.Cartesian3.fromDegrees(116.39, 39.91, 500000), // 相机经纬度和高度orientation: { // 相机姿态heading: Cesium.Math.toRadians(0), // 偏航角,在(相机与地心连线的法面)上的旋转,0为正北pitch: Cesium.Math.toRadians(-100), // 俯仰角,在(相机与地心连线所在的经线平面)上选择,-90朝向地心roll: 0 // 翻滚角}});let position = Cesium.Cartesian3.fromDegrees(116.39, 39.91, 400);viewer.entities.add({ // 添加实体polyline: { // 线条实体show: true,positions: Cesium.Cartesian3.fromDegreesArray([116.39, 39.91, 116.40, 39.91]),width: 5,material: new Cesium.Color(0,0,1,1)}});viewer.entities.add({ // 添加实体id: 'point',position, // 实体位置point: { // 圆点实体pixelSize: 100, // 圆点尺寸,为屏幕的像素尺寸,不随地图缩放和旋转color: new Cesium.Color(0,1,0,1) // 圆点颜色},description: '<div>html</div>' // 被点击时右侧弹窗的内容});viewer.entities.add({ // 添加实体position: Cesium.Cartesian3.fromDegrees(116.39, 39.91, 50), // 实体位置plane: { // 矩形平面实体plane: new Cesium.Plane(Cesium.Cartesian3.UNIT_Z, 0), // 朝向dimensions: new Cesium.Cartesian2(400, 300),material: Cesium.Color.RED.withAlpha(0.5), // 可以为图片outline: true,outlineColor: Cesium.Color.BLACK}});let polygon = viewer.entities.add({ // 添加实体id: 'polygon',polygon: { // 多边形实体hierarchy: Cesium.Cartesian3.fromDegreesArray([116.39, 39.91, 116.40, 39.91, 116.40, 39.90]),material: Cesium.Color.YELLOW, // 可以为图片extrudedHeight: 200 // 拉伸为三维物体}});viewer.entities.getById("polygon"); // 获取实体viewer.entities.remove(polygon); // 删除viewer.entities.add({ // 添加实体position: Cesium.Cartesian3.fromDegrees(116.39, 39.91, 150), // 实体位置label: { // 标签实体text: '标签',font: '50px Helvetica',fillColor: Cesium.Color.SKYBLUE}});viewer.entities.add({ // 添加实体position, // 实体位置orientation: Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(-90, 0, 0)), // 实体姿态model: { // 3D模型实体uri: './***.glb', // 载入模型minimumPixelSize: 128, // 模型缩放时最小像素尺寸maximumScale: 1000, // 模型缩放最大比率show: true, // 是否显示}});viewer.camera.viewBoundingSphere(new Cesium.BoundingSphere(position,20),new Cesium.HeadingPitchRange(0,0,0)); // 设置相机控制器360度环绕点// viewer.trackedEntity = entity; // 相机控制器的环绕点/* Cesium 坐标系 */// WGS84弧度坐标系 new Cesium.Cartographic(经弧度, 维弧度, 高度);Cesium.Cartographic.fromDegrees(经度,维度,高度)// 笛卡尔空间直角坐标系,原点为地心 new Cesium.Cartesian3(x,y,z);Cesium.Cartesian3.fromDegrees(经度,维度,高度)// 屏幕坐标系 new Cesium.Cartesian2(x,y)/* 坐标转换 */// 弧度与角度互转:Cesium.Math.toRadians(),Cesium.Math.toDegrees()// WGS84坐标系与笛卡尔坐标系互转: Cesium.Ellipsoid.WGS84.cartographicToCartesian(wgs84);Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);Cesium.Cartographic.fromCartesian(cartesian3)// 笛卡尔坐标系与屏幕坐标系互转:viewer.scene.pickPosition(cartesian2);viewer.scene.globe.pick(viewer.camera.getPickRay(cartesian2),viewer.scene);viewer.scene.camera.pickEllipsoid(cartesian2)// Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3);scene.cartesianToCanvasCoordinates(cartesian3)// 鼠标拾取let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction(function (action) {let pick = viewer.scene.pick(action.position);if(Cesium.defined(pick)){console.log(pick.id.id)}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
</script>
</body>
</html>
三维建筑物
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../Build/Cesium/Cesium.js"></script><link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet"/><style>html,body{margin: 0;padding: 0;}</style>
</head>
<body>
<div id="Cesium"></div>
<script>// 在 Cesium官网上 注册用户获取 tokenCesium.Ion.defaultAccessToken = '****';// 加载ArcGIS卫星地图栅格数据,比 Cesium 自带地图更加精细const viewer = new Cesium.Viewer('Cesium', {baseLayerPicker: false,imageryProvider: new Cesium.ArcGisMapServerImageryProvider({url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'}),// 地形,需要在 Cesium官网 Asset Depot 添加 Cesium World Terrain 权限;Ctrl+鼠标滑动改变相机视角可以进入地形terrainProvider: new Cesium.CesiumTerrainProvider({url: Cesium.IonResource.fromAssetId(1),requestVertexNormals: true,requestWaterMask: true, // 水面效果}),});// 添加建筑物模型,需要在 Cesium官网 Asset Depot 添加 Cesium OSM Buildings 权限const tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({url: Cesium.IonResource.fromAssetId(96188),}));// 建筑物模型样式tileset.style = new Cesium.Cesium3DTileStyle({color: "color('blue', 0.5)",show: true});/* 加载夜晚地图,需要在 Cesium官网 Asset Depot 添加 Earth at Night 权限 */// const viewer = new Cesium.Viewer('Cesium', {// baseLayerPicker: false// });// 从 My Assets 里拷贝// const layer = viewer.imageryLayers.addImageryProvider(// new Cesium.IonImageryProvider({ assetId: 3812 })// );
</script>
</body>
</html>
自转
rotate(116.39); // 北京经度function rotate(longitude) {viewer.scene.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(longitude, 20, 30000000), // 相机经纬度和高度duration: 20, // 飞行时间flyOverLongitude: longitude > 0 ? 180 : 0, // 转动时要经过的经度,从而确定转动的方向easingFunction: Cesium.EasingFunction.LINEAR_NONE, // 均匀转动complete() {rotate(longitude > 0 ? longitude - 180 : 180 + longitude); // 转到背面},});}
点位呼吸效果
viewer.entities.add({id: "NewYork",position: Cesium.Cartesian3.fromDegrees(-74.00, 40.43, 50),billboard: {image: './position.png',}});viewer.entities.add({id: 'NewYorkLabel',position: Cesium.Cartesian3.fromDegrees(-74.00, 40.43, 50),label: { // 标签text: '纽约分公司',font: '200 12px sans-serif', // font-weight font-size font-familyfillColor: Cesium.Color.fromCssColorString('#3D3D3D'), // 字体颜色showBackground: true,backgroundColor: Cesium.Color.fromCssColorString('#F0DBAF'), // 背景色,没法渐变backgroundPadding: new Cesium.Cartesian2(10, 6),pixelOffset: new Cesium.Cartesian2(0, -30) // 在position基础上的屏幕偏移}});let NewYork = viewer.entities.getById("NewYork");NewYork.billboard.scale = 1;let progress = 0; // 呼吸渐变进度let up = true; // 呼吸渐变方向breath();function breath() {requestAnimationFrame(function () {NewYork.billboard.scale = 1 + 0.1 * progress;if(up){if(progress >= 5){up = false;progress = progress - 1;}else {progress = progress + 1;}}else {if(progress <= 0){up = true;progress = progress + 1;}else {progress = progress - 1;}}setTimeout(breath, 150);});}
地点连线(OD线 Origin-Destination Line)
<img id="gif" src="" style="position: absolute" />
var gif = {name: "curve.gif", // 箭头从左侧中间点到右侧中间点width: 1920,height: 392,};
// 终点位置let toDegree = [108.947, 34.259];let toCartesian3 = Cesium.Cartesian3.fromDegrees(toDegree[0], toDegree[1]);let toCartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,toCartesian3);
// 起点位置let fromDegree = [121.506377, 31.245105];let fromCartesian3 = Cesium.Cartesian3.fromDegrees(fromDegree[0], fromDegree[1]);if (!isVisible(fromCartesian3)) {fromCartesian3 = findVisibleEdge(fromDegree);}let fromCartesian2 =Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,fromCartesian3);
// 屏幕距离let distance = Cesium.Cartesian2.distance(toCartesian2,fromCartesian2);
/* 计算连线角度,试用 Cesium.Cartesian2.angleBetween 计算角度发现不对 */let angle = 0;let deltaY = toCartesian2.y - fromCartesian2.y;if (toCartesian2.x > fromCartesian2.x) {if (deltaY > 0) {angle = Math.asin(deltaY / distance);} else {angle = -Math.asin(Math.abs(deltaY) / distance);}} else {if (deltaY > 0) {angle = Math.PI - Math.asin(deltaY / distance);} else {angle = Math.asin(Math.abs(deltaY) / distance) - Math.PI;}}let width = distance; // 图片显示宽度let height = (width / gif.width) * gif.height; // 图片显示高度$("#gif").attr("src", gif.name).css("width", width + "px").css("left",(fromCartesian2.x + toCartesian2.x) / 2 - width / 2 + "px").css("top",(fromCartesian2.y + toCartesian2.y) / 2- height / 2 + "px").css("transform", `rotate(${angle}rad)`);// 判断一个点是否可见,即是否在地球背面function isVisible(cartesian3) {return new Cesium.EllipsoidalOccluder(Cesium.Ellipsoid.WGS84, viewer.camera.position).isPointVisible(cartesian3);}// 给一个不可见的点找一个同维度的、可见的、离原点最近的点,此点在可见范围边缘上function findVisibleEdge(fromDegree) {let cartesian3From;let fromLongitude = fromDegree[0];let toLongitude = toDegree[0];let fromEast = fromLongitude - toLongitude > 0;let moveEast;if (fromEast) {moveEast = fromLongitude - toLongitude > 180;} else {moveEast = toLongitude - fromLongitude < 180;}do {if (moveEast) {fromLongitude = fromLongitude + 0.1;fromLongitude = fromLongitude < 180 ? fromLongitude : fromLongitude - 360;} else {fromLongitude = fromLongitude - 0.1;fromLongitude = fromLongitude > -180 ? fromLongitude : 360 + fromLongitude;}cartesian3From = Cesium.Cartesian3.fromDegrees(fromLongitude, fromDegree[1]);} while (!isVisible(cartesian3From));return cartesian3From;},
判断一个点是否在GeoJSON内
import chinaJson from './100000.json'; // 中国区域handler.setInputAction((action) => { let inChina = false;// 屏幕坐标,如果用了 autofit.js,要进行处理position = this.autoFitPosition(action.endPosition);// 笛卡尔坐标let cartesian3 = viewer.scene.camera.pickEllipsoid(position);if (cartesian3) {// 经纬弧度坐标let cartographic = Ellipsoid.WGS84.cartesianToCartographic(cartesian3);chinaJson.features.forEach((feature) => {feature.geometry.coordinates[0].forEach((polygon) => {// 是否在区域内if (this.isInPolygon([CesiumMath.toDegrees(cartographic.longitude), CesiumMath.toDegrees(cartographic.latitude)], polygon)) {inChina = true;}});});}
}, ScreenSpaceEventType.MOUSE_MOVE);isInPolygon(checkPoint, polygonPoints) {let counter = 0;let pointCount = polygonPoints.length;let p1 = polygonPoints[0];let i, xinters, p2;for (i = 1; i <= pointCount; i++) {p2 = polygonPoints[i % pointCount];if (checkPoint[0] > Math.min(p1[0], p2[0]) && checkPoint[0] <= Math.max(p1[0], p2[0])) {if (checkPoint[1] <= Math.max(p1[1], p2[1])) {if (p1[0] !== p2[0]) {xinters = ((checkPoint[0] - p1[0]) * (p2[1] - p1[1])) / (p2[0] - p1[0]) + p1[1];if (p1[1] === p2[1] || checkPoint[1] <= xinters) {counter++;}}}}p1 = p2;}return counter % 2 > 0;
},autoFitPosition(position) {let scale = 1;let transform = document.querySelector('body').style.transform;if (transform) {scale = transform.split('(')[1].split(')')[0];scale = parseFloat(scale);}return new Cartesian2(position.x / scale, position.y / scale);
},
UE 像素流
PixelStreamingInfrastructure
package.json
"dependencies": {"@epicgames-ps/lib-pixelstreamingfrontend-ue5.3": "^1.0.6", // 版本与UE保持一致"@epicgames-ps/lib-pixelstreamingfrontend-ui-ue5.3": "^1.0.5",},
vue
<template><div class="ue-container" ref="ueContainer"></div>
</template><script>
import { Config, PixelStreaming, Flags } from '@epicgames-ps/lib-pixelstreamingfrontend-ue5.3'
import {Application,PixelStreamingApplicationStyle,UIElementCreationMode
} from '@epicgames-ps/lib-pixelstreamingfrontend-ui-ue5.3'
import io from 'socket.io-client'let ueApplication, streamexport default {mounted() {this.createUE()},methods: {createUE() {const PixelStreamingApplicationStyles = new PixelStreamingApplicationStyle()PixelStreamingApplicationStyles.applyStyleSheet()const config = new Config({ useUrlParams: true })config.getTextSettings().at(0).value = 'ws://信令服务器地址' // 设置 SignallingServerUrlconfig.setFlagEnabled(Flags.AutoConnect, true) // 自动连接config.setFlagEnabled(Flags.AutoPlayVideo, true) // 自动播放config.setFlagEnabled(Flags.StartVideoMuted, true) // 播放时静音,上面的自动播放才能生效// config.setFlagEnabled(Flags.MouseInput, false) // 禁止鼠标操作// config.setFlagEnabled(Flags.KeyboardInput, false) // 禁止键盘操作config.setFlagEnabled(Flags.HoveringMouseMode, true) // 进入操作状态时依然显示光标stream = new PixelStreaming(config)ueApplication = new Application({stream,onColorModeChanged: (isLightMode) => PixelStreamingApplicationStyles.setColorMode(isLightMode),fullScreenControlsConfig: {isEnabled: false // 隐藏全屏按钮},settingsPanelConfig: {visibilityButtonConfig: { creationMode: UIElementCreationMode.Disable } // 隐藏设置按钮},statsPanelConfig: {visibilityButtonConfig: { creationMode: UIElementCreationMode.Disable } // 隐藏信息按钮},videoQpIndicatorConfig: {disableIndicator: { disableIndicator: true } // 隐藏信号强度图标}})this.$refs.ueContainer.appendChild(ueApplication.rootElement)stream.addResponseEventListener('handle_responses', this.handleUeResponse) // 监听UE推送的消息stream.addEventListener('videoInitialized', this.initScene) // UE初始化完成事件},sendMessage(data) {stream.emitUIInteraction(data)},handleUeResponse(msg) {console.log(msg)},async initScene() {this.sendMessage('')},forbidMouse() {// 某种情况下禁止鼠标操作,如果用 ueApplication.stream.setFlagEnabled(Flags.MouseInput, false) 会导致不能解禁document.getElementById('videoElementParent').style.pointerEvents = 'none'document.getElementById('streamingVideo').style.pointerEvents = 'none'},}
}
</script><style lang="less">
body {width: 100vw;height: 100vh;min-height: -webkit-fill-available;margin: 0;#playerUI {position: absolute;z-index: 0;video {object-fit: fill;}}
}.ue-container {position: absolute;width: 100vw;height: 100vh;overflow: hidden;
}
</style>
peer-stream
vue
<script>
import '@/utils/peer-stream.js'let ueVideo
export default {mounted() {ueVideo = document.createElement('video', { is: 'peer-stream' })ueVideo.id = 'ws://信令地址'this.$refs.container.appendChild(ueVideo)ueVideo.addEventListener('playing', this.initScene) // UE场景开始渲染ueVideo.addEventListener('message', this.handleUeResponse) // 监听UE推送的消息},methods: {sendUeMessage(data) {// 发送消息ueVideo.emitMessage(data)},}
}
</script>
<style lang="less">
body {height: 100vh;min-height: -webkit-fill-available;margin: 0;min-width: 1920px;position: relative;.video-container {video {position: absolute;z-index: 0;width: 100%;height: 100%;background-color: #0A1B2F;}}
}
</style>
相关文章:

三维地图,智慧城市,商业智能BI,数据可视化大屏(Cesiumjs/UE)
绘图工具 三维地图:Cesiumjs 建模方式:激光点云建模、航拍倾斜摄影建模、GIS建模、BIM建模、手工建模 建模工具:C4D Blender GeoBuilding ArcGIS Cesiumjs <!DOCTYPE html> <html lang"en"> <head><meta …...

鸿蒙Next通过oss上传照片到阿里云
前言 最近在写纯血鸿蒙的APP,需要用到oss上传照片,之前的客户端 Android 和 IOS 都已经实现了,获取的阿里云签名的上传地址是服务端实现的,相信大部分公司都是这样的模式,服务端也是调用阿里云的SDK来实现的ÿ…...

小白爬虫——selenium入门超详细教程
目录 一、selenium简介 二、环境安装 2.1、安装Selenium 2.2、浏览器驱动安装 三、基本操作 3.1、对页面进行操作 3.1.1、初始化webdriver 3.1.2、打开网页 3.1.3、页面操作 3.1.4、页面数据提取 3.1.5、关闭页面 3.1.6、综合小案例 3.2、对页面元素进行操作 3.2.…...

nlp培训重点
1. SGD梯度下降公式 当梯度大于0时,变小,往左边找梯度接近0的值。 当梯度小于0时,减去一个负数会变大,往右边找梯度接近0的值,此时梯度从负数到0上升 2.Adam优化器实现原理 #coding:utf8import torch import torch.n…...

什么是多模态和模态
文章目录 前言一、定义1. 模态 (Modal)2. 非模态 (Non-modal) 二、GUI中1. 模态(Modal)对话框2. 非模态(Modeless)对话框 三、模态 vs 非模态 的对比四、何时使用模态和非模态对话框?五、Qt 中 exec() 与 show() 的区别…...

apache中的Worker 和 Prefork 之间的区别是什么?
文章目录 内存使用稳定性兼容性适用场景 Apache中的Worker和Prefork两种工作模式在内存使用、稳定性以及兼容性等方面存在区别 内存使用 Worker:由于使用线程,内存占用较少。Prefork:每个进程独立运行,内存消耗较大。 稳定性 W…...

系统监控——分布式链路追踪系统
摘要 本文深入探讨了分布式链路追踪系统的必要性与实施细节。随着软件架构的复杂化,传统的日志分析方法已不足以应对问题定位的需求。文章首先解释了链路追踪的基本概念,如Trace和Span,并讨论了其基本原理。接着,文章介绍了SkyWa…...

【Python]深入Python日志管理:从logging到分布式日志追踪的完整指南
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 日志是软件开发中的核心部分,尤其在分布式系统中,日志对于调试和问题定位至关重要。本篇文章将从Python标准库的logging模块出发,逐步探讨日志管理的最佳实践,涵盖日志配置、日志分层、日志格式化等基…...

DHCP Client的工作方式
【运作方式】 一开始Client没有IP资料 DHCPDISCOVER Client发出DHCPDISCOVER广播封包(UDP port 67),寻找DHCP Server。 DHCPOFFER Client开始监听UDP port 68 (任何)DHCP Server收到DHCPDISCOVER封包后ÿ…...

docker-常用应用部署dockerfile模板
文章目录 概述Springboot-Djava.security.egdfile:/dev/./urandom参数说明 vue应用部署nginx.conf配置Dockerfile 概述 本文列举了Java开发中常用如SpringBoot、Vue前端等类型的应用Docker部署所需的DockerFile Springboot FROM anapsix/alpine-java:8_server-jre_unlimited…...

Unity3D学习FPS游戏(13)玩家血量控制
玩家血量控制 血条UI玩家Canvas下的Slider血量逻辑控制 子弹攻击掉血子弹发射者的区分玩家受伤逻辑子弹碰撞检测 效果 血条UI 和之前我们前面介绍的玩家武器弹夹UI的思路是一样的,跟详细的细节可以参考博客Unity3D装弹和弹夹UI显示。 玩家Canvas下的Slider 之前玩…...

TDesign:Switch开关
Switch 开关 文档地址 view TDSwitch(isOn: controller.isDefault, // 默认是否开启状态trackOnColor: AppColors.mainColor,onChanged: ((bool value){controller.onTapSwitch(value);return value;}), ),controller bool isDefault true; // 是否默认 void onTapSwitch(bool…...

AI在SEO中的应用与关键词优化探讨
内容概要 在当今数字化时代,人工智能(AI)技术为搜索引擎优化(SEO)带来了革命性的改变。传统的SEO主要依赖于人为的经验和判断,而AI则通过算法分析海量数据,提供更加精准和高效的方式优化关键词…...

[docker中首次配置git环境与时间同步问题]
11月没写东西,12月初赶紧水一篇。 刚开始搭建docker服务器时,网上找一堆指令配置好git后,再次新建容器后忘记怎么配了,,这次记录下。 一、git ssh指令法,该方法不用每次提交时输入密码 前期准备࿰…...

使用lumerical脚本语言创建绘制波导并进行数据分析(纯代码实现)(1)
使用lumerical脚本语言创建绘制波导、配置二维模式求解器、计算模式轮廓、计算有效折射率(neff)和群折射率(ng)随波长的变化关系、计算有效折射率(neff)随波导宽度的变化关系及针对有效折射率法进行相关数据处理(代码均有注释详解)。 一、绘制波导结构 1.1 代码实现 w…...

redis.conf
tracking-table-max-keys tracking-table-max-keys 是 Redis 中的一个配置选项,它与 Key Tracking 功能有关。Key Tracking 是 Redis 6.0 引入的一项功能,用于追踪哪些键在被客户端操作时发生了变化。 tracking-table-max-keys 的作用: 该配置…...

泷羽sec学习打卡-shell命令8
声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell8 until循环(直到为止)case语句func函数定义实践是检验真理的唯一标准 别问&…...

割草机器人架构设计和技术应用
题目:割草机器人项目的系统架构设计与技术应用 摘要: 随着智能家居和自动化技术的发展,割草机器人作为一种便捷的园艺工具逐渐进入市场。本论文以我参与管理和开发的割草机器人项目为例,详细阐述了项目中采用的关键技术、系统架…...

基于SSM闪光点映像摄影工作室预约系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...

Windows 和 Linux 系统命令行操作详解:从文件管理到进程监控
1.切换盘符与目录操作 在命令行中,切换盘符和目录是最常见的操作。尽管 DOS 和 Linux 在这些操作上有所不同,但它们都能实现相似的功能。 (1)切换盘符 ①DOS命令:在 DOS 中,切换盘符非常简单,使用 盘符名:ÿ…...

【Calibre-Web】Calibre-Web服务器安装详细步骤(个人搭建自用的电子书网站,docker-compose安装)
文章目录 一、Calibre-Web和Calibre的区别是什么?使用场景分别是什么?二、服务器安装docker和docker-compose三、服务器安装Calibre-Web步骤1、安装完成后的目录结构2、安装步骤3、初始配置4、启动上传 四、安装Calibre五、docker-compose常用命令六、客…...

服务器数据恢复—服务器raid0阵列硬盘指示灯显示黄颜色的数据恢复案例
服务器数据恢复环境&故障情况: 某品牌服务器上有一组由两块SAS硬盘组建的raid0阵列,上层是windows server操作系统ntfs文件系统。服务器上一个硬盘指示灯显示黄颜色,该指示灯对应的硬盘离线,raid不可用。 服务器数据恢复过程…...

.nii.gz文件读取方式
".nii.gz"文件的介绍: ".nii.gz"文件是一种常见的用于存储神经影像数据的格式,它通常包含了三维或四维的图像体素数据,以及与磁共振扫描相关的一些重要元数据,比如扫描参数、特征描述等等。而".nii"表示未经压…...

Kube-Prometheus-Stack安装时初始化导入自定义Grafana dashboards
获取Grafana dashboards的JSON文件 这里是获取已经编辑好的Grafana dashboards的JSON文件;以便内置到Kube-Prometheus-Stack的helm charts的安装zip文件中。 编辑自定义dashboards JSON文件 获取dashboards JSON文件模板 其实Kube-Prometheus-Stack内部本身已经内…...

【SNIP】《An Analysis of Scale Invariance in Object Detection – SNIP》
CVPR-2018 Singh B, Davis L S. An analysis of scale invariance in object detection snip[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 3578-3587. https://github.com/bharatsingh430/snip?tabreadme-ov-file 文章目录 …...

JAVA基础学习笔记_异常
文章目录 异常异常的作用处理异常的方式异常中的常见方法捕获异常自定义异常 异常 应该知道出了异常怎么处理 java.lang.Throwable Error(错误,硬件出错或内存不足,不是程序员能解决的) Exception(异常) RuntimeException(运行时异常),代码出错导致程序出现的问题 其他异…...

Modern Effective C++条款三十四:考虑lambda而非std::bind
C11中的std::bind是C98的std::bind1st和std::bind2nd的后续,C11 lambda几乎总是比std::bind更好的选择。 从C14开始,lambda的作用不仅强大,而且是完全值得使用的。与item32中一样,我们将从std::bind返回的函数对象称为bind对象(bi…...

lyapunov指数的绘制
有如下方程: %% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)绘制其对应的lyapunov指数。 MATLAB实现方式: clc; clearvars; close all;%% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)%% 代码 N 1000; a (0:0.001:1.4); b 0.3; na length(a…...

Ansible 运维工具
安装 apt install ansible /etc/ansible/hosts , 指定密码或密钥访问分组机器 [k8s_masters] master0.c0.k8s.sb[k8s_nodes] node0.c0.k8s.sb node1.c0.k8s.sb[k8s:children] k8s_masters k8s_nodes[k8s_masters:vars] ansible_ssh_usersbadmin ansible_ssh_pass"***&q…...

【AI系统】MobileNet 系列
MobileNet 系列 在本文会介绍 MobileNet 系列,重点在于其模型结构的轻量化设计,主要介绍详细的轻量化设计原则,基于这原则,MobileNetV1 是如何设计成一个小型,低延迟,低功耗的参数化模型,可以满…...