三维地图,智慧城市,商业智能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 中,切换盘符非常简单,使用 盘符名:ÿ…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...