当前位置: 首页 > news >正文

OpenLayers WebGL与3D渲染 (进阶一)

1. WebGL概述

WebGL是一种JavaScript API,它基于OpenGL ES 2.0/3.0标准,允许在不使用插件的情况下在兼容的Web浏览器中呈现高性能的交互式3D和2D图形。在地理信息系统(GIS)领域,WebGL为地图渲染和空间数据可视化提供了强大的性能支持。

1.1 WebGL与Canvas的区别

// 传统Canvas 2D渲染
const canvasRenderer = new ol.renderer.canvas.Map(map);// WebGL渲染
const webglRenderer = new ol.renderer.webgl.Map(map);// 性能对比:
// Canvas适合渲染少量矢量要素(几百到几千)
// WebGL适合渲染大量要素(万级以上)或执行复杂的可视化效果

1.2 OpenLayers中的WebGL支持

OpenLayers从版本3开始引入了WebGL支持,并在后续版本中不断增强其功能。WebGL允许OpenLayers实现以下功能:

  • 高性能渲染大量矢量数据
  • 支持复杂的符号系统和动画效果
  • 实现3D可视化和地形渲染
  • 支持自定义着色器程序

2. 启用WebGL渲染

2.1 基本配置

// 创建使用WebGL渲染器的地图
const map = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()})],target: 'map',view: new ol.View({center: [0, 0],zoom: 2}),// 明确指定使用WebGL渲染器renderer: 'webgl'
});

2.2 检测WebGL支持

// 检测浏览器是否支持WebGL
function checkWebGLSupport() {const canvas = document.createElement('canvas');const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');return gl !== null && gl !== undefined;
}// 根据WebGL支持情况选择渲染器
const renderer = checkWebGLSupport() ? 'webgl' : 'canvas';
const map = new ol.Map({renderer: renderer,// 其他配置...
});

3. 3D地形渲染

OpenLayers本身并不直接支持3D地形渲染,但可以通过与其他库集成来实现此功能。

3.1 使用ol-cesium集成

ol-cesium是OpenLayers和Cesium的集成库,允许在2D和3D地图之间无缝切换。

// 首先初始化OpenLayers地图
const map = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()})],target: 'map',view: new ol.View({center: ol.proj.fromLonLat([116.4074, 39.9042]),zoom: 12})
});// 然后创建ol-cesium实例
const ol3d = new olcs.OLCesium({map: map,sceneOptions: {terrainProvider: new Cesium.CesiumTerrainProvider({url: Cesium.IonResource.fromAssetId(1)})}
});// 启用3D显示
ol3d.setEnabled(true);

3.2 地形高程数据

// 使用Cesium世界地形服务
const terrainProvider = new Cesium.CesiumTerrainProvider({url: Cesium.IonResource.fromAssetId(1),requestWaterMask: true,requestVertexNormals: true
});// 应用到ol-cesium场景
const ol3d = new olcs.OLCesium({map: olMap,sceneOptions: {terrainProvider: terrainProvider}
});

4. 3D矢量渲染

4.1 使用ol-ext实现2.5D效果

ol-ext是OpenLayers的扩展库,提供了许多额外功能,包括2.5D效果渲染。

// 引入ol-ext库
import {Renderer3D} from 'ol-ext/style/Renderer3D';// 创建矢量图层
const vectorLayer = new ol.layer.Vector({source: new ol.source.Vector({url: 'buildings.geojson',format: new ol.format.GeoJSON()}),style: function(feature) {// 基于要素属性设置高度const height = feature.get('height') || 40;return new ol.style.Style({fill: new ol.style.Fill({color: [255, 128, 0, 0.6]}),stroke: new ol.style.Stroke({color: [255, 128, 0, 1],width: 2})});}
});// 设置3D渲染器
vectorLayer.setRenderer3D(new Renderer3D({// 高度获取函数height: function(feature) {return feature.get('height') || 40;},// 默认高度defaultHeight: 10,// 高度单位(像素)heightUnit: 'm',// 自定义缩放系数zScale: 0.2,// 光照方向light: [1, 0.5, 1]
}));

4.2 自定义3D符号

// 创建3D点符号
function create3DPointSymbol(feature) {const size = feature.get('size') || 20;const color = feature.get('color') || [255, 0, 0, 0.8];// 创建Canvas元素const canvas = document.createElement('canvas');canvas.width = size * 2;canvas.height = size * 2;// 获取2D上下文const ctx = canvas.getContext('2d');// 绘制3D球体效果const gradient = ctx.createRadialGradient(size, size, 0,size, size, size);gradient.addColorStop(0, `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`);gradient.addColorStop(1, `rgba(${color[0]}, ${color[1]}, ${color[2]}, 0)`);ctx.fillStyle = gradient;ctx.beginPath();ctx.arc(size, size, size, 0, 2 * Math.PI);ctx.fill();return new ol.style.Icon({img: canvas,imgSize: [size * 2, size * 2],anchor: [0.5, 0.5]});
}// 应用3D点符号
const pointLayer = new ol.layer.Vector({source: new ol.source.Vector({url: 'points.geojson',format: new ol.format.GeoJSON()}),style: function(feature) {return new ol.style.Style({image: create3DPointSymbol(feature)});}
});

5. 高级WebGL渲染技术

5.1 自定义着色器

OpenLayers允许开发者编写自定义WebGL着色器程序,实现特殊的渲染效果。

// 顶点着色器
const vertexShader = `precision mediump float;uniform mat4 u_projectionMatrix;uniform mat4 u_offsetScaleMatrix;uniform mat4 u_offsetRotateMatrix;attribute vec2 a_position;attribute float a_index;varying vec2 v_texCoord;varying float v_opacity;void main() {mat4 offsetMatrix = u_offsetScaleMatrix * u_offsetRotateMatrix;vec4 offsets = offsetMatrix * vec4(a_position, 0.0, 1.0);gl_Position = u_projectionMatrix * vec4(offsets.xy, 0.0, 1.0);// 根据索引设置不同的不透明度v_opacity = 1.0 - (a_index / 50.0);}
`;// 片段着色器
const fragmentShader = `precision mediump float;varying float v_opacity;uniform vec4 u_color;void main() {gl_FragColor = u_color;gl_FragColor.a *= v_opacity;}
`;// 创建WebGL点图层
const webglLayer = new ol.layer.WebGLPoints({source: new ol.source.Vector({url: 'points.geojson',format: new ol.format.GeoJSON()}),style: {symbol: {symbolType: 'circle',size: 10,color: [255, 0, 0, 1],rotateWithView: true},vertexShader: vertexShader,fragmentShader: fragmentShader}
});

5.2 热力图渲染

// WebGL热力图
const heatmapLayer = new ol.layer.Heatmap({source: new ol.source.Vector({url: 'data.geojson',format: new ol.format.GeoJSON()}),blur: 15,radius: 10,weight: function(feature) {// 根据属性设置权重return feature.get('magnitude');},gradient: ['#00f', '#0ff', '#0f0', '#ff0', '#f00']
});

6. 性能优化

6.1 使用WebGL图层提升渲染性能

// 使用WebGL图层渲染大量点
const pointsLayer = new ol.layer.WebGLPoints({source: new ol.source.Vector({url: 'large-point-dataset.geojson',format: new ol.format.GeoJSON()}),disableHitDetection: true, // 禁用点击检测以提升性能style: {symbol: {symbolType: 'circle',size: 8,color: [51, 153, 204, 0.8],rotateWithView: false}}
});// 使用WebGL图层渲染大量线
const linesLayer = new ol.layer.WebGLLines({source: new ol.source.Vector({url: 'large-line-dataset.geojson',format: new ol.format.GeoJSON()}),style: {strokeWidth: 2,strokeColor: [255, 128, 0, 1]}
});

6.2 图层切换策略

根据缩放级别和数据量切换Canvas和WebGL渲染器:

// 创建两个图层:一个使用Canvas渲染,一个使用WebGL渲染
const canvasLayer = new ol.layer.Vector({source: vectorSource,style: styleFunction,minZoom: 12 // 只在高缩放级别使用Canvas渲染
});const webglLayer = new ol.layer.WebGLPoints({source: vectorSource,style: {symbol: {symbolType: 'circle',size: 5,color: [255, 0, 0, 0.8]}},maxZoom: 11 // 在低缩放级别使用WebGL渲染
});// 将两个图层都添加到地图
map.addLayer(canvasLayer);
map.addLayer(webglLayer);

7. 案例研究:城市建筑3D可视化

7.1 数据准备

// 加载建筑物GeoJSON数据
const buildingSource = new ol.source.Vector({url: 'buildings.geojson',format: new ol.format.GeoJSON()
});// 预处理数据,确保每个建筑都有高度属性
buildingSource.on('change', function() {if (buildingSource.getState() === 'ready') {const features = buildingSource.getFeatures();features.forEach(function(feature) {if (!feature.get('height')) {// 没有高度属性时,根据建筑类型设置默认高度const type = feature.get('building:type') || 'residential';let height = 15; // 默认住宅高度if (type === 'commercial') height = 25;else if (type === 'industrial') height = 10;else if (type === 'office') height = 40;feature.set('height', height);}});}
});

7.2 实现建筑物3D渲染

// 引入ol-ext
import {Renderer3D} from 'ol-ext/style/Renderer3D';// 创建3D建筑图层
const buildingLayer = new ol.layer.Vector({source: buildingSource,style: function(feature) {// 根据建筑用途设置颜色let color;const type = feature.get('building:type') || 'residential';if (type === 'residential') color = [255, 185, 151, 0.8];else if (type === 'commercial') color = [107, 195, 255, 0.8];else if (type === 'industrial') color = [190, 190, 190, 0.8];else if (type === 'office') color = [145, 255, 198, 0.8];else color = [255, 255, 240, 0.8];return new ol.style.Style({fill: new ol.style.Fill({color: color}),stroke: new ol.style.Stroke({color: [0, 0, 0, 0.4],width: 1})});}
});// 设置3D渲染器
buildingLayer.setRenderer3D(new Renderer3D({height: function(feature) {return feature.get('height');},// 高度单位为米heightUnit: 'm',// 设置适当的z缩放系数以获得良好的可视效果zScale: 0.1,// 设置光照方向,创建阴影效果light: [1, 1, 1],// 设置屋顶颜色roofColor: function(feature) {const type = feature.get('building:type') || 'residential';if (type === 'residential') return [255, 121, 77, 0.9];else if (type === 'commercial') return [64, 164, 223, 0.9];else if (type === 'industrial') return [150, 150, 150, 0.9];else if (type === 'office') return [105, 223, 161, 0.9];else return [223, 223, 200, 0.9];}
}));

7.3 添加交互功能

// 添加鼠标悬停高亮效果
const hoverInteraction = new ol.interaction.Select({condition: ol.events.condition.pointerMove,style: function(feature) {// 获取原始样式const originalStyle = buildingLayer.getStyle()(feature);// 创建高亮样式const highlightStyle = originalStyle.clone();const originalFill = originalStyle.getFill();const originalColor = originalFill.getColor();// 增亮填充颜色highlightStyle.setFill(new ol.style.Fill({color: [Math.min(255, originalColor[0] + 50),Math.min(255, originalColor[1] + 50),Math.min(255, originalColor[2] + 50),originalColor[3]]}));return highlightStyle;}
});map.addInteraction(hoverInteraction);// 添加点击显示建筑信息的功能
map.on('click', function(evt) {const feature = map.forEachFeatureAtPixel(evt.pixel, function(feature) {return feature;});if (feature) {const properties = feature.getProperties();let content = '<div class="building-popup">';// 显示建筑类型content += `<h3>${properties.name || '建筑'}</h3>`;content += `<p>类型: ${properties['building:type'] || '未知'}</p>`;content += `<p>高度: ${properties.height || '未知'} 米</p>`;// 添加其他可用属性if (properties.address) content += `<p>地址: ${properties.address}</p>`;if (properties.levels) content += `<p>层数: ${properties.levels}</p>`;if (properties.year) content += `<p>建造年份: ${properties.year}</p>`;content += '</div>';// 显示弹出框const overlay = new ol.Overlay({element: document.createElement('div'),positioning: 'bottom-center',stopEvent: false});overlay.getElement().innerHTML = content;overlay.setPosition(evt.coordinate);map.addOverlay(overlay);// 点击其他地方关闭弹窗const clickOutside = function(e) {map.removeOverlay(overlay);map.un('click', clickOutside);};setTimeout(function() {map.on('click', clickOutside);}, 100);}
});

8. 最佳实践

  1. 选择正确的渲染器

    • 使用WebGL渲染大量要素(>10,000)或实现复杂可视化
    • 保留Canvas用于少量要素和更好的交互性能
  2. 数据优化

    • 简化几何图形以减少顶点数量
    • 使用空间索引来提高查询性能
    • 实现级别细节(LOD)策略,根据缩放级别显示不同详细程度的数据
  3. 视觉表现

    • 善用光照效果增强3D感知
    • 注意色彩对比度和透明度设置
    • 考虑加入阴影效果以增强深度感
  4. 交互设计

    • 提供直观的导航控件
    • 实现平滑的动画过渡
    • 为3D视图提供参考信息(如比例尺、指北针等)
  5. 性能监控

    • 监控帧率(FPS)确保流畅体验
    • 使用浏览器开发工具分析渲染性能
    • 实现自适应渲染策略,根据设备性能调整细节级别

相关文章:

OpenLayers WebGL与3D渲染 (进阶一)

1. WebGL概述 WebGL是一种JavaScript API&#xff0c;它基于OpenGL ES 2.0/3.0标准&#xff0c;允许在不使用插件的情况下在兼容的Web浏览器中呈现高性能的交互式3D和2D图形。在地理信息系统(GIS)领域&#xff0c;WebGL为地图渲染和空间数据可视化提供了强大的性能支持。 1.1…...

ARP协议(地址解析协议)

ARP协议是用来把IP地址转换成MAC地址的。 因为在局域网里&#xff0c;真正通信靠的是MAC地址&#xff0c;但我们平时只知道目标的IP地址&#xff0c;所以需要一个办法把IP地址变成MAC地址 —— 这个过程就是靠ARP完成的。 举个超简单的例子&#xff1a; 你电脑要发数据给192.1…...

深度学习常见框架:TensorFlow 与 PyTorch 简介与对比

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、为什么需要深度学习框架&#xff1f; 2、框架的发展背…...

iOS 类与对象底层原理

iOS 类与对象底层原理 文章目录 iOS 类与对象底层原理探索对象本质objc_setProperty 源码cls与类的关联原理联合体isa的类型isa_t 原理探索initIsa方法通过setClass方法中的shiftcls来验证绑定的一个流程通过 isa & ISA_MSAK通过object_getClass通过位运算 类&类的结构…...

Babel、core-js、Loader之间的关系和作用全解析

在现代前端开发中&#xff0c;Babel、polyfill&#xff08;如 core-js&#xff09;和 Loader 是非常常见又容易混淆的几个概念。为了彻底搞明白它们的作用、关系和使用方法&#xff0c;下面一篇文章详细梳理。 一、Babel的作用 Babel 是一个 JavaScript 的编译器&#xff0c;主…...

总线位宽不变,有效数据位宽变化的缓存方案

总线位宽不变&#xff0c;有效数据位宽变化的缓存方案 譬如总线位宽为64bit&#xff0c;但是有时候只有高32bit有效&#xff0c;有时只有低32bit有效&#xff0c;有时64bit都有效。总线上收到的数据要先缓存到FIFO中&#xff0c;那么这个FIFO的宽度和深度如何设置呢&#xff1…...

若依脱敏功能升级:接口返回想脱就脱,想不脱就不脱(实现灵活可控制的数据脱敏)

若依原生框架中的脱敏功能不够灵活&#xff08;默认超级管理员不脱敏&#xff0c;其他则脱敏&#xff09;。 有时候&#xff0c;我们有些接口想要脱敏&#xff0c;但是有些接口又不想脱敏。&#xff08;例如列表查询的时候脱敏。修改的时候&#xff0c;不想数据脱敏&#xff0…...

【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?

问题描述 在Azure Redis服务中&#xff0c;如何实现只允许Azure App Service访问呢&#xff1f; 问题解答 Azure Redis 开启 防火墙的功能&#xff0c;并在防火墙中添加上App Service的出口IP地址即可。两步即可实现此目的&#xff01; 1&#xff09;查询 App Service 的出口IP…...

如何解决无训练数据问题:一种更为智能化的解决方案

手动标注数据真的很费时间,而且买数据集又贵得要命,还不一定能完全符合你的需求。但这里有个令人兴奋的好消息,为啥不用 AI 来解决这个问题呢? 别再依赖传统方法了,你可以用像 LLM(大型语言模型)和图像生成器这样的 AI 工具,为你的特定目标创建合成训练数据。如今有那…...

AI 应用同质化:一场看不见的资源 “吞噬战”

大家好&#xff0c;我是涛涛&#xff0c;今天聊聊令人担心的事情。 一、同质化的“繁荣”背后 当ChatGPT在2022年掀起全球AI热潮时&#xff0c;中国互联网行业迅速进入“All in AI”模式。根据艾瑞咨询数据&#xff0c;2023年国内AI应用市场新增注册企业超2.3万家&#xff0c…...

Java + Spring Boot + MyBatis获取以及持久化sql语句的方法

在Java的Spring Boot项目中结合MyBatis获取实际执行的SQL语句&#xff0c;可以通过以下几种方法实现&#xff1a; 方法一&#xff1a;配置MyBatis日志级别 通过调整日志级别&#xff0c;MyBatis会输出执行的SQL语句及参数&#xff0c;适用于快速调试。 修改application.prope…...

「浏览器即OS」:WebVM技术栈如何用Wasm字节码重构冯·诺依曼体系?

一、冯诺依曼架构的维度坍塌 1. 传统计算模型的能量耗散 浏览器执行效率瓶颈分析&#xff1a; 操作x86指令周期Wasm指令周期能效比提升矩阵乘法3894.2x内存访问1234x系统调用120012100x 二、WebVM的量子纠缠架构 1. 浏览器内核的重构 // 基于WASI的系统调用处理 #[no_mangl…...

Vue3项目目录结构规范建议

以下是一个推荐的 Vue 3 项目目录结构规范&#xff0c;适用于中大型项目并遵循最佳实践&#xff1a; 基础目录结构 bash src/ ├─ assets/ # 静态资源 │ ├─ images/ # 图片文件 │ ├─ fonts/ # 字体文件 │ └─ styles/ …...

【计算机视觉】CV实战项目- Four-Flower:基于TensorFlow的花朵分类实战指南

深度解析Four-Flower&#xff1a;基于TensorFlow的花朵分类实战指南 项目概述与技术背景技术栈组成 完整实战流程环境配置1. 基础环境安装2. 项目环境搭建3. 环境验证 数据准备模型架构解析训练过程优化1. 训练配置2. 关键参数建议3. 训练监控 常见问题与解决方案1. 内存不足错…...

4.27 JavaScript核心语法+事件监听

JavaScript负责网页的行为&#xff08;交互行为&#xff09; JS基本语法&#xff1a; 引用方式 变量&常量&数据类型&#xff1a; alert()标签输出弹出框&#xff0c;如以上代码会输出true。 函数&#xff1a; 自定义对象: 属性方法行为 JS中的全局变量是window。 js…...

于键值(KV)的表

基于键值&#xff08;KV&#xff09;的表 将行编码为键值&#xff08;KVs&#xff09; 索引查询&#xff1a;点查询和范围查询 在关系型数据库中&#xff0c;数据被建模为由行和列组成的二维表。用户通过SQL表达他们的意图&#xff0c;而数据库则神奇地提供结果。不那么神奇的…...

Matlab算例运行

1. 使用终端命令运行算例&#xff1a; 2. 如果点击Run 按钮就是会一直报错&#xff0c;所以直接改成终端运行算例...

package.json script 中的 prepare 脚本的作用是什么

在 package.json 的 scripts 中&#xff0c;prepare 脚本是一个特殊的生命周期脚本&#xff0c;主要作用和执行时机如下&#xff1a; prepare 脚本的作用和执行时机 执行时机&#xff1a; 在执行 npm publish 命令之前运行。在执行不带参数的 npm install 命令时运行&#xff…...

图论---最大流(Dinic)

最大流一定是阻塞流&#xff0c;阻塞流不一定是最大流。 阻塞流---从起点到终点的管道已经阻塞了。 时间复杂度&#xff1a; 一般情况&#xff1a;O(n2m)O(n2m)&#xff08;但实际运行效率较高&#xff0c;尤其在稀疏图上&#xff09;。 使用当前弧优化后&#xff0c;效率接近…...

FastAPI系列06:FastAPI响应(Response)

FastAPI响应&#xff08;Response&#xff09; 1、Response入门2、Response基本操作设置响应体&#xff08;返回数据&#xff09;设置状态码设置响应头设置 Cookies 3、响应模型 response_model4、响应类型 response_classResponse派生类自定义response_class 在“FastAPI系列0…...

双目RealSense系统配置rs_camera.launch----实现D435i自制rosbag数据集到离线场景的slam建图

引言 Intel RealSense系列相机因其出色的深度感知能力和灵活的配置选项&#xff0c;在机器视觉与应用中得到广泛应用。大家在后期的slam学习中&#xff0c;无论是对算法本身的性能要求还是实验的泛化性都有一定的要求&#xff0c;那么公开的数据集如kitti、tum、Eourc不能满足…...

【MCP-2】MCP是什么,利用智普大模型在MaxKB中调用自己开发的MCP服务

在上一篇【MCP-1】MCP是什么&#xff0c;从DEMO入手文章中我们介绍了MCP是什么、他能干啥&#xff0c;以及简单的Demo示例等&#xff0c;这篇文章我们使用MaxKB这个工具&#xff0c;利用智普大模型&#xff0c;看看MCP到底怎么用。 创建SSE协议的MCP服务 在上篇文章中的Demo是…...

Allegro23.1新功能之如何单独关闭铜皮显示效果操作指导

Allegro23.1新功能之如何单独关闭铜皮显示效果操作指导 Allegro升级到了23.1的时候,支持单独关闭铜皮显示 ,如下图 如何仅关闭shape的显示,单独显示线,具体操作如下 点击setup...

《从分遗产说起:JS 原型与继承详解》

“天天开心就好” 先来讲讲概念&#xff1a; 原型&#xff08;Prototype&#xff09; 什么是原型&#xff1f; 原型是 JavaScript 中实现对象间共享属性和方法的机制。每个 JavaScript 对象&#xff08;除了 null&#xff09;都有一个内部链接指向另一个对象&#xff0c;这…...

【Part 2安卓原生360°VR播放器开发实战】第二节|基于等距圆柱投影方式实现全景视频渲染

《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化&#xff0c;以及高分辨率视频性能优化等实战技巧。 &#x1f4dd; 希望通过这个专栏&am…...

Android——RecyclerView

RecyclerView的使用 依赖 implementation("androidx.recyclerview:recyclerview:1.4.0")activity_recyclerview.xml <androidx.recyclerview.widget.RecyclerViewandroid:id"id/rv"android:layout_width"match_parent"android:layout_height…...

跨域问题(Cross-Origin Problem)

跨域问题&#xff08;Cross-Origin Problem&#xff09;是浏览器出于安全考虑&#xff0c;对不同源&#xff08;协议、域名、端口&#xff09;之间的资源访问进行限制而引发的限制。以下是详细解释&#xff1a; 1. 核心定义 跨域&#xff1a;当一个网页&#xff08;源A&#x…...

阿里云直接对系统云盘扩容

阿里云直接对系统云盘扩容 登录阿里云控制台&#xff0c;进入ECS实例管理页面&#xff0c;检查目标磁盘的容量是否已更新为扩容后的数值。通过SSH远程连接服务器&#xff0c;使用命令 lsblk 或 fdisk -l 查看当前磁盘分区和容量&#xff0c;确认扩容后的物理磁盘已被系统识别。…...

Java大厂面试突击:从Spring Boot自动配置到Kafka分区策略实战解析

第一轮核心知识 面试官&#xff1a;请解释Spring Boot中自动配置的工作原理并演示如何自定义一个ConfigurationProperties组件&#xff1f; xbhog&#xff1a;自动配置通过EnableAutoConfiguration注解触发&#xff0c;结合当前环境判断&#xff08;如是否检测到MyBatis依赖&…...

【python】lambda用法(结合例子理解)

目录 lambda 是什么? 为什么叫 lambda? 语法 举例 1. 最简单的 lambda:单个数字处理 2. 用 lambda 排序一组字符串(按照长度排序) 3. 在列表里找出绝对值最小的数字 4. 给 map() 用 lambda 5. 组合使用:筛选出偶数 lambda 和 def 的对比 lambda 适合用在什么地…...

前端Ui设计工具

PS 稿、蓝湖、Sketch 和 Figma 前端 UI 设计工具的对比分析 PS 稿&#xff08;Adobe Photoshop&#xff09; 提供精准设计细节&#xff1a;PS 稿能让前端更精准地理解页面布局、元素尺寸、颜色等&#xff0c;通过精确测量和查看信息面板&#xff0c;把握设计元素的空间关系、…...

深入探索Python Pandas:解锁数据分析的无限可能

放在前头 深入探索Python Pandas&#xff1a;解锁数据分析的无限可能 深入探索Python Pandas&#xff1a;解锁数据分析的无限可能 在当今数据驱动的时代&#xff0c;高效且准确地处理和分析数据成为了各个领域的关键需求。而Python作为一门强大且灵活的编程语言&#xff0c;…...

django admin 设置字段不可编辑

在Django中&#xff0c;如果你想让管理员在后台管理界面中无法编辑某个字段&#xff0c;你可以通过在模型的Meta类中设置editable属性为False&#xff0c;或者在admin.py文件中使用readonly_fields属性来实现。 方法1&#xff1a;在模型中使用Meta类设置 你可以在模型的Meta类…...

AI在医疗领域的10大应用:从疾病预测到手术机器人

AI在医疗领域的10大应用&#xff1a;从疾病预测到手术机器人 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI在医疗领域的10大应用&#xff1a;从疾病预测到手术机器人摘要引言1. 医学影像诊断&#xff1a;从静态…...

深入理解 Java 单例模式:从基础到最佳实践

单例&#xff08;Singleton&#xff09;模式是 Java 中最基本、最常用的设计模式之一。它确保一个类在任何情况下都只有一个实例&#xff0c;并提供一个全局访问点来获取这个唯一的实例。 一、为什么需要单例模式&#xff1f;&#xff08;使用场景&#xff09; 单例模式主要适…...

Rust:安全与性能兼得的现代系统编程语言

一、起源与设计理念 Rust 是由 Mozilla 研究院 Graydon Hoare 于 2006 年发起设计的系统级编程语言&#xff0c;其诞生源于传统系统语言&#xff08;如 C/C&#xff09;在内存安全与并发编程方面的缺陷。经过近十年的迭代&#xff0c;Rust 1.0 稳定版于 2015 年正式发布&#…...

AI赋能智慧医疗新范式:小天互连即时通讯打造高效、安全的医疗通讯平台

在医疗行业&#xff0c;高效的信息协作与严格的数据安全不仅直接关系患者诊疗效率&#xff0c;更是医院现代化管理的核心命题。小天互连即时通讯系统通过将智能化功能与医疗场景深度结合&#xff0c;打造出全链路数字化协作平台&#xff0c;有效破解了传统沟通模式的效率瓶颈&a…...

图像生成新势力:GPT-Image-1 与 GPT-4o 在智创聚合 API 的较量

在人工智能领域&#xff0c;图像生成技术正迅速发展&#xff0c;OpenAI 推出的 GPT-Image-1 和 GPT-4o 在图像生成方面展现出了强大的能力。智创聚合 API 平台已支持这两个模型&#xff0c;并且其图片生成 / 编辑工作台支持图片的循环编辑等功能&#xff0c;为用户提供了更便捷…...

如何避免爬虫因Cookie过期导致登录失效

1. Cookie的作用及其过期机制 1.1 什么是Cookie&#xff1f; Cookie是服务器发送到用户浏览器并保存在本地的一小段数据&#xff0c;用于维持用户会话状态。爬虫在模拟登录后&#xff0c;通常需要携带Cookie访问后续页面。 1.2 Cookie为什么会过期&#xff1f; 会话Cookie&…...

集成方案 | Docusign + 甄零科技,赋能企业海外业务高效增长!

本文将详细介绍 Docusign 与甄零科技的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 甄零科技是一家专注于数字化合同管理系统的 SaaS 解决方案提供商&#xff0c;致力于为企业打造“…...

【Arxiv 2025】Single Image Iterative Subject-driven Generation and Editing

文章目录 文章标题作者及研究团队介绍01 在论文所属的研究领域&#xff0c;有哪些待解决的问题或者现有的研究工作仍有哪些不足&#xff1f;02 这篇论文主要解决了什么问题&#xff1f;03 这篇论文解决问题采用的关键解决方案是什么&#xff1f;04 这篇论文的主要贡献是什么&am…...

CoOAG:首个捕捉学术研究兴趣动态演变的数据集

2025-04-24&#xff0c;由西安交通大学基于学术合作网络构建一种新的动态图数据集CoOAG&#xff0c;用于研究动态图中的节点分类问题。该数据集通过捕捉作者研究兴趣的动态变化&#xff0c;为动态图学习领域提供了新的研究方向和测试平台&#xff0c;特别是在标签受限的动态节点…...

决策树随机深林

决策树和随机森林是机器学习中常用的两种模型&#xff0c;以下是对它们的简单介绍&#xff1a; 决策树 - 原理&#xff1a;通过一系列的条件判断对样本进行分类或预测。它由节点&#xff08;内部节点是属性上的测试&#xff0c;叶节点是类别或值&#xff09;和边组成&#xff0…...

Unity 和 Unreal Engine(UE) 两大主流游戏引擎的核心使用方法

以下是 Unity 和 Unreal Engine&#xff08;UE&#xff09; 两大主流游戏引擎的核心使用方法和对比分析&#xff0c;帮助开发者快速上手并根据项目需求选择合适工具&#xff1a; 一、Unity 使用指南 1. 安装与配置 安装&#xff1a;从 Unity Hub 下载&#xff0c;选择长期支持…...

Maven 依赖范围(Scope)详解

Maven 依赖范围&#xff08;Scope&#xff09;详解 Maven 是一个强大的项目管理工具&#xff0c;广泛用于 Java 开发中构建、管理和部署应用程序。在使用 Maven 构建项目时&#xff0c;我们经常需要引入各种第三方库或框架作为项目的依赖项。通过在 pom.xml 文件中的 <depe…...

博物馆除湿控湿保卫战:M-5J1R 电解除湿科技如何重塑文物守护的未来

在卢浮宫幽深的长廊里&#xff0c;达芬奇的《蒙娜丽莎》正经历着一场看不见的战争——不是来自时间的侵蚀&#xff0c;而是空气中无形的水分子。每一件文物都在与湿度进行着无声的抗争&#xff0c;这场抗争关乎人类文明的延续。湿度&#xff0c;这个看不见的文物杀手&#xff0…...

消防应急物资智能调用立库:豪越科技助力消防“速战速决”

在消防救援的战场上&#xff0c;时间就是生命&#xff0c;每一秒都关乎着人民群众的生命财产安全。然而&#xff0c;在过去的紧急救援中&#xff0c;应急物资无法及时到位的情况时有发生&#xff0c;成为制约救援效率的关键难题&#xff0c;给救援工作带来了巨大的困境。 想象一…...

机器学习基础理论 - 分类问题评估指标

几个定义:混淆矩阵 TP: True Positives, 表示实际为正例且被分类器判定为正例的样本数FP: False Positives, 表示实际为负例且被分类器判定为正例的样本数FN: False Negatives, 表示实际为正例但被分类器判定为负例的样本数TN: True Negatives, 表示实际为负例且被分类…...

深度学习4.1 多层感知机

基本概念 多层感知机&#xff08;Multilayer Perceptron, MLP&#xff09;是一种‌前馈人工神经网络‌&#xff0c;由输入层、至少一个隐藏层和输出层组成。 ‌核心特点‌&#xff1a; 采用‌全连接结构‌&#xff08;相邻层神经元全部相连&#xff1b; 通过‌非线性激活函数‌…...

解决两个技术问题后小有感触-QZ Tray使用经验小总结

老朋友都知道&#xff0c;我现在是一家软件公司销售部门的项目经理和全栈开发工程师&#xff0c;就是这么“奇怪”的岗位&#xff0c;大概我是公司销售团队里比较少有技术背景、销售业绩又不那么理想的销售。 近期在某个票务系统项目上驻场&#xff0c;原来我是这个项目的项目…...