鼠标获取坐标 vs 相机获取坐标
Cesium鼠标点击获取坐标 vs 相机视角获取坐标
鼠标点击获取坐标流程图
相机视角获取坐标流程图
一、鼠标点击事件获取坐标 ⭐⭐⭐
1. 基本实现方法
// 创建事件处理器
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);// 注册鼠标左键点击事件
handler.setInputAction(function(click) {// 获取点击的屏幕坐标const screenPosition = click.position;// 方法1:拾取实体 - 如果点击到了模型或实体const pickedObject = viewer.scene.pick(screenPosition);if (Cesium.defined(pickedObject)) {// 获取实体的世界坐标const entity = pickedObject.id;if (entity && entity.position) {const position = entity.position.getValue(viewer.clock.currentTime);// 转换为经纬度坐标const cartographic = Cesium.Cartographic.fromCartesian(position);const longitude = Cesium.Math.toDegrees(cartographic.longitude);const latitude = Cesium.Math.toDegrees(cartographic.latitude);const height = cartographic.height;console.log(`点击实体坐标: 经度=${longitude}, 纬度=${latitude}, 高度=${height}米`);}} // 方法2:射线拾取 - 如果点击到地球表面else {// 从相机位置创建一条射线,穿过点击的屏幕位置const ray = viewer.camera.getPickRay(screenPosition);// 计算射线与地球表面的交点const position = viewer.scene.globe.pick(ray, viewer.scene);if (Cesium.defined(position)) {// 转换为经纬度坐标const cartographic = Cesium.Cartographic.fromCartesian(position);const longitude = Cesium.Math.toDegrees(cartographic.longitude);const latitude = Cesium.Math.toDegrees(cartographic.latitude);const height = cartographic.height;console.log(`点击地表坐标: 经度=${longitude}, 纬度=${latitude}, 高度=${height}米`);}}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
2. 高级用法 - 处理各种特殊情况
// 更完整的点击坐标获取函数
function getClickPosition(click, includeTerrainHeight = true) {// 点击的屏幕坐标const screenPosition = click.position;// 1. 首先尝试拾取3D瓦片或模型const pickedFeature = viewer.scene.pick(screenPosition);if (Cesium.defined(pickedFeature)) {// 如果点击到3D Tilesif (pickedFeature instanceof Cesium.Cesium3DTileFeature) {const cartesian = viewer.scene.pickPosition(screenPosition);if (Cesium.defined(cartesian)) {const cartographic = Cesium.Cartographic.fromCartesian(cartesian);return {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: cartographic.height,type: '3DTiles',feature: pickedFeature};}}// 如果点击到Entityelse if (pickedFeature.id instanceof Cesium.Entity) {const entity = pickedFeature.id;if (entity.position) {const position = entity.position.getValue(viewer.clock.currentTime);const cartographic = Cesium.Cartographic.fromCartesian(position);return {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: cartographic.height,type: 'Entity',entity: entity};}}// 如果点击到Primitiveelse if (pickedFeature.primitive) {const cartesian = viewer.scene.pickPosition(screenPosition);if (Cesium.defined(cartesian)) {const cartographic = Cesium.Cartographic.fromCartesian(cartesian);return {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: cartographic.height,type: 'Primitive',primitive: pickedFeature.primitive};}}}// 2. 如果没有拾取到对象,尝试获取地球表面坐标const ray = viewer.camera.getPickRay(screenPosition);const position = viewer.scene.globe.pick(ray, viewer.scene);if (Cesium.defined(position)) {// 基本的经纬度坐标const cartographic = Cesium.Cartographic.fromCartesian(position);let height = cartographic.height;// 如果需要包含地形高度if (includeTerrainHeight && viewer.terrainProvider) {// 获取地形高度(异步)const promise = Cesium.sampleTerrainMostDetailed(viewer.terrainProvider, [cartographic]);Cesium.when(promise, function(updatedCartographics) {height = updatedCartographics[0].height;});}return {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: height,type: 'Surface',position: position};}// 3. 如果前两种方法都失败,返回空值return null;
}
二、相机视角获取坐标 ⭐⭐⭐
1. 获取相机当前位置
// 获取相机当前位置
function getCameraPosition() {// 获取相机位置(世界坐标)const cameraPosition = viewer.camera.position;// 转换为经纬度坐标const cartographic = Cesium.Cartographic.fromCartesian(cameraPosition);return {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: cartographic.height,type: 'Camera'};
}
2. 获取相机视线与地球的交点
// 获取相机视线中心与地球的交点
function getCameraViewTarget() {// 屏幕中心点const windowPosition = new Cesium.Cartesian2(viewer.canvas.clientWidth / 2,viewer.canvas.clientHeight / 2);// 从屏幕中心点创建射线const ray = viewer.camera.getPickRay(windowPosition);// 计算射线与地球表面的交点const position = viewer.scene.globe.pick(ray, viewer.scene);if (Cesium.defined(position)) {// 转换为经纬度坐标const cartographic = Cesium.Cartographic.fromCartesian(position);return {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: cartographic.height,type: 'ViewTarget'};}return null;
}
3. 获取相机完整状态信息
// 获取相机完整状态(位置、朝向、视线等)
function getCameraState() {// 相机位置const position = viewer.camera.position;const positionCartographic = Cesium.Cartographic.fromCartesian(position);// 相机朝向const heading = Cesium.Math.toDegrees(viewer.camera.heading);const pitch = Cesium.Math.toDegrees(viewer.camera.pitch);const roll = Cesium.Math.toDegrees(viewer.camera.roll);// 相机视线方向const direction = viewer.camera.direction;// 屏幕中心视线与地球交点const windowPosition = new Cesium.Cartesian2(viewer.canvas.clientWidth / 2,viewer.canvas.clientHeight / 2);const ray = viewer.camera.getPickRay(windowPosition);const viewTarget = viewer.scene.globe.pick(ray, viewer.scene);let targetCartographic = null;if (Cesium.defined(viewTarget)) {targetCartographic = Cesium.Cartographic.fromCartesian(viewTarget);}return {// 相机位置(经纬度)position: {longitude: Cesium.Math.toDegrees(positionCartographic.longitude),latitude: Cesium.Math.toDegrees(positionCartographic.latitude),height: positionCartographic.height},// 相机姿态角orientation: {heading: heading, // 航向角(正北为0,顺时针为正)pitch: pitch, // 俯仰角(水平为0,向上为正)roll: roll // 翻滚角},// 相机视线方向(笛卡尔坐标)direction: {x: direction.x,y: direction.y,z: direction.z},// 视线目标点(如果有)target: targetCartographic ? {longitude: Cesium.Math.toDegrees(targetCartographic.longitude),latitude: Cesium.Math.toDegrees(targetCartographic.latitude),height: targetCartographic.height} : null};
}
三、两种方法对比 ⭐⭐
特性 | 鼠标点击获取坐标 | 相机视角获取坐标 |
---|---|---|
用户交互 | 需要用户主动点击 | 无需用户交互,可自动获取 |
适用场景 | 精确选点、查询信息、标记位置 | 视角记录、飞行定位、路径规划 |
精度 | 高(取决于点击精度) | 中(视线中心点) |
获取位置 | 任意点击位置 | 固定为屏幕中心或相机位置 |
实现复杂度 | 中等 | 简单 |
拾取对象 | 可拾取实体、模型、地表 | 主要获取地表或视线方向 |
四、应用场景示例
1. 鼠标点击坐标应用
// 创建标记点应用示例
const markerPoints = [];
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);// 注册点击事件
handler.setInputAction(function(click) {// 获取点击坐标const position = getClickPosition(click);if (position) {// 创建标记点实体const pointEntity = viewer.entities.add({name: `标记点 ${markerPoints.length + 1}`,position: Cesium.Cartesian3.fromDegrees(position.longitude, position.latitude, position.height),point: {pixelSize: 10,color: Cesium.Color.RED,outlineColor: Cesium.Color.WHITE,outlineWidth: 2},label: {text: `点${markerPoints.length + 1}: ${position.longitude.toFixed(6)}, ${position.latitude.toFixed(6)}`,font: '14px sans-serif',horizontalOrigin: Cesium.HorizontalOrigin.LEFT,verticalOrigin: Cesium.VerticalOrigin.TOP,pixelOffset: new Cesium.Cartesian2(10, 10)}});// 添加到标记点数组markerPoints.push({id: markerPoints.length,entity: pointEntity,position: position});console.log(`已添加标记点: ${position.longitude.toFixed(6)}, ${position.latitude.toFixed(6)}, ${position.height.toFixed(2)}米`);}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
2. 相机视角坐标应用
// 视角书签功能实现
const viewBookmarks = [];// 添加当前视角到书签
function addCurrentViewToBookmarks(name) {// 获取当前相机状态const cameraState = getCameraState();// 创建书签对象const bookmark = {id: viewBookmarks.length,name: name || `视角 ${viewBookmarks.length + 1}`,timestamp: new Date().toISOString(),cameraState: cameraState};// 添加到书签数组viewBookmarks.push(bookmark);console.log(`已保存视角: ${bookmark.name}`);return bookmark;
}// 飞行到指定书签视角
function flyToBookmark(bookmarkId) {const bookmark = viewBookmarks.find(b => b.id === bookmarkId);if (!bookmark) return;// 飞行到书签位置viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(bookmark.cameraState.position.longitude,bookmark.cameraState.position.latitude,bookmark.cameraState.position.height),orientation: {heading: Cesium.Math.toRadians(bookmark.cameraState.orientation.heading),pitch: Cesium.Math.toRadians(bookmark.cameraState.orientation.pitch),roll: Cesium.Math.toRadians(bookmark.cameraState.orientation.roll)},duration: 3.0});
}// 实时相机位置监控
function startCameraMonitoring() {// 每秒更新一次相机信息return setInterval(() => {const cameraPos = getCameraPosition();const target = getCameraViewTarget();// 更新UI显示document.getElementById('cameraInfo').textContent = `相机: ${cameraPos.longitude.toFixed(6)}, ${cameraPos.latitude.toFixed(6)}, ${cameraPos.height.toFixed(2)}米\n` +`视点: ${target ? `${target.longitude.toFixed(6)}, ${target.latitude.toFixed(6)}, ${target.height.toFixed(2)}米` : '无'}`;}, 1000);
}
五、高级技巧与优化 ⭐⭐
1. 拾取优化
// 提高拾取精度与性能
function optimizedPick(screenPosition) {// 如果点击位置有多个对象重叠,首先用drillPick获取所有const pickedObjects = viewer.scene.drillPick(screenPosition);if (pickedObjects.length > 0) {// 按照优先级排序(可根据需求调整)pickedObjects.sort((a, b) => {// 优先返回Entityconst aIsEntity = a.id instanceof Cesium.Entity;const bIsEntity = b.id instanceof Cesium.Entity;if (aIsEntity && !bIsEntity) return -1;if (!aIsEntity && bIsEntity) return 1;// 其次是3DTilesconst aIs3DTiles = a.content && a.content.tileset;const bIs3DTiles = b.content && b.content.tileset;if (aIs3DTiles && !bIs3DTiles) return -1;if (!aIs3DTiles && bIs3DTiles) return 1;return 0;});// 返回排序后的第一个return pickedObjects[0];}return null;
}
2. 射线交点优化
// 提高射线拾取精度
function getTerrainIntersection(screenPosition) {// 创建射线const ray = viewer.camera.getPickRay(screenPosition);if (!ray) return null;// 地球表面交点let groundIntersection = viewer.scene.globe.pick(ray, viewer.scene);// 如果找不到交点(可能是视线方向与地球没有交点)if (!groundIntersection) {// 创建一个射线-球体交点计算const ellipsoid = viewer.scene.globe.ellipsoid;const intersection = Cesium.IntersectionTests.rayEllipsoid(ray, ellipsoid);if (intersection) {// 计算交点位置groundIntersection = Cesium.Ray.getPoint(ray, intersection.start);}}return groundIntersection;
}
3. 视线距离计算
// 计算两点间视线距离
function calculateLineOfSightDistance(pointA, pointB) {// 转换为Cartesian坐标const cartesianA = Cesium.Cartesian3.fromDegrees(pointA.longitude, pointA.latitude, pointA.height);const cartesianB = Cesium.Cartesian3.fromDegrees(pointB.longitude, pointB.latitude, pointB.height);// 计算直线距离const distance = Cesium.Cartesian3.distance(cartesianA, cartesianB);// 检查两点之间是否有遮挡const direction = Cesium.Cartesian3.subtract(cartesianB, cartesianA, new Cesium.Cartesian3());Cesium.Cartesian3.normalize(direction, direction);const ray = new Cesium.Ray(cartesianA, direction);// 检查射线是否与地形相交const results = viewer.scene.globe.pick(ray, viewer.scene);let hasObstacle = false;if (results) {// 计算交点与目标点的距离const intersectionDistance = Cesium.Cartesian3.distance(cartesianA, results);// 如果交点距离小于两点距离,说明有遮挡hasObstacle = intersectionDistance < distance * 0.99;}return {distance: distance,hasLineOfSight: !hasObstacle};
}
六、两种方法结合的最佳实践
// 结合两种方法的通用坐标获取工具
class CesiumCoordinateHelper {constructor(viewer) {this.viewer = viewer;this.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);this.callbacks = {click: [],move: [],cameraChanged: []};// 初始化事件监听this.initEventListeners();}// 初始化事件监听initEventListeners() {// 点击事件this.handler.setInputAction((event) => {const position = this.getClickPosition(event.position);this.callbacks.click.forEach(callback => callback(position, event));}, Cesium.ScreenSpaceEventType.LEFT_CLICK);// 鼠标移动事件this.handler.setInputAction((event) => {const position = this.getClickPosition(event.endPosition);this.callbacks.move.forEach(callback => callback(position, event));}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);// 相机变化事件this.viewer.camera.changed.addEventListener(() => {const cameraState = this.getCameraState();this.callbacks.cameraChanged.forEach(callback => callback(cameraState));});}// 获取点击位置坐标getClickPosition(screenPosition) {// 首先尝试拾取对象const pickedObject = this.viewer.scene.pick(screenPosition);if (Cesium.defined(pickedObject)) {// 对象拾取成功if (pickedObject.id instanceof Cesium.Entity) {return this.getEntityPosition(pickedObject.id);} else {return this.getPickedPosition(screenPosition);}} else {// 获取地表坐标return this.getTerrainPosition(screenPosition);}}// 获取Entity位置getEntityPosition(entity) {if (entity && entity.position) {const position = entity.position.getValue(this.viewer.clock.currentTime);const cartographic = Cesium.Cartographic.fromCartesian(position);return {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: cartographic.height,cartesian: position,type: 'entity',entity: entity};}return null;}// 获取精确拾取位置getPickedPosition(screenPosition) {const position = this.viewer.scene.pickPosition(screenPosition);if (Cesium.defined(position)) {const cartographic = Cesium.Cartographic.fromCartesian(position);return {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: cartographic.height,cartesian: position,type: 'picked'};}return null;}// 获取地表位置getTerrainPosition(screenPosition) {const ray = this.viewer.camera.getPickRay(screenPosition);const position = this.viewer.scene.globe.pick(ray, this.viewer.scene);if (Cesium.defined(position)) {const cartographic = Cesium.Cartographic.fromCartesian(position);return {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: cartographic.height,cartesian: position,type: 'terrain'};}return null;}// 获取相机状态getCameraState() {const camera = this.viewer.camera;const position = camera.position;const cartographic = Cesium.Cartographic.fromCartesian(position);// 视线中心点const centerPosition = this.getCameraViewTarget();return {position: {longitude: Cesium.Math.toDegrees(cartographic.longitude),latitude: Cesium.Math.toDegrees(cartographic.latitude),height: cartographic.height,cartesian: position},orientation: {heading: Cesium.Math.toDegrees(camera.heading),pitch: Cesium.Math.toDegrees(camera.pitch),roll: Cesium.Math.toDegrees(camera.roll)},viewTarget: centerPosition,direction: camera.direction.clone()};}// 获取相机视线中心目标点getCameraViewTarget() {const windowPosition = new Cesium.Cartesian2(this.viewer.canvas.clientWidth / 2,this.viewer.canvas.clientHeight / 2);return this.getTerrainPosition(windowPosition);}// 注册点击事件回调onLeftClick(callback) {this.callbacks.click.push(callback);return this;}// 注册鼠标移动事件回调onMouseMove(callback) {this.callbacks.move.push(callback);return this;}// 注册相机变化事件回调onCameraChanged(callback) {this.callbacks.cameraChanged.push(callback);return this;}// 销毁事件处理器destroy() {this.handler.destroy();this.callbacks = {click: [],move: [],cameraChanged: []};}
}// 使用示例
const coordinateHelper = new CesiumCoordinateHelper(viewer);// 点击事件获取坐标
coordinateHelper.onLeftClick((position) => {if (position) {console.log(`点击坐标: ${position.longitude.toFixed(6)}, ${position.latitude.toFixed(6)}, ${position.height.toFixed(2)}米`);// 在此处理坐标...}
});// 监听相机变化
coordinateHelper.onCameraChanged((cameraState) => {const pos = cameraState.position;const target = cameraState.viewTarget;console.log(`相机位置: ${pos.longitude.toFixed(6)}, ${pos.latitude.toFixed(6)}, ${pos.height.toFixed(2)}米`);if (target) {console.log(`视点位置: ${target.longitude.toFixed(6)}, ${target.latitude.toFixed(6)}, ${target.height.toFixed(2)}米`);}
});
总结对比
鼠标点击获取坐标
- ✅ 优点: 精确定位、可选择任意位置、可交互获取对象信息
- ❌ 缺点: 需要用户主动点击、无法自动采集
相机视角获取坐标
- ✅ 优点: 自动采集、无需用户交互、可记录视角状态
- ❌ 缺点: 固定中心点、不适合精确选点、难以拾取特定对象
在实际应用中,两种方法各有优势,通常需要结合使用:视角坐标用于导航定位和状态记录,点击坐标用于交互式操作和信息查询。最佳实践是开发一个综合坐标工具类,同时支持两种坐标获取方式。
相关文章:
鼠标获取坐标 vs 相机获取坐标
Cesium鼠标点击获取坐标 vs 相机视角获取坐标 鼠标点击获取坐标流程图 #mermaid-svg-WwyCUbcFQekWG97C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WwyCUbcFQekWG97C .error-icon{fill:#552222;}#mermaid-svg-W…...
HarmonyOS SDK助力鸿蒙版今日水印相机,真实地址防护再升级
今日水印相机是一款真实记录"工作"和"生活"的水印拍照APP。作为专业的可信影像服务平台,今日水印相机依托时间、地点、身份三重数字水印技术,为企业和个人提供考勤打卡、外勤巡检、生活美好时刻记录等场景的可信存证服务。 面对虚拟…...
数组滑动窗口单调栈单调队列trick集【leetcode hot100 c++速查!!!】
文章目录 栈经典模版题-括号最小栈字符串解码每日温度柱状图的最大矩形 堆数组中的第k个最大元素前k个高频元素数据流中的中位数 数组最大子数组和合并区间轮转数组除自身以外数组的乘积 我们尝试将这三类问题放在一个专题中进行讨论,是因为它们有很多公共的部分。 …...
半监督学习与强化学习的结合:新兴的智能训练模式
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4o-mini模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...
C++ 可调用实体 (详解 一站式)
目录 可调用实体 函数对象 函数指针 成员函数指针 空指针的使用(了解) 可调用实体 讲到调用这个词,我们首先能够想到普通函数和函数指针,在学习了类与对象的基础知识后,还增加了成员函数,那么它们都被…...
架构师与高级工程师:职业差异与进阶之路
“学而不思则罔,思而不学则殆。”——孔子 解释:该名言强调了学习和思考的结合,对应文章中工程师若想晋升为架构师,不能仅满足于对工具的学习,还要深入探究事物本质,培养深度思考能力,体现了思…...
声纹监测技术在新能源汽车的应用场景解析
新能源汽车声纹监测技术可应用于多个场景,以下是详细解析: 故障诊断 电机系统故障检测:新能源汽车的电机在运行过程中会发出特定的声音。通过声纹监测技术,采集电机运行时的声音信号并进行分析,能够及时发现电机轴承磨…...
About why docker application mode taskmanager not down in time
Tips: docker flink application mode 当任务完成或者jobmanager cancel,则taskmanager会因为flink集群机制继续保留监听等待jobmanager发送任务命令,当超过大约6 mins,taskmanager便会自动exited退出。...
2025-4-27-C++ 学习 数组(2)
数组 2025-4-27-C 学习 数组(2)P2550 [AHOI2001] 彩票摇奖题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示题解代码 P2615 [NOIP 2015 提高组] 神奇的幻方题目背景题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例…...
timerfd定时器时间轮定时器
目录 一、timerfd定时器 二、timerfd定时器代码演示 三、时间轮定时器 一、timerfd定时器 timerfd是一种通过文件描述符管理定时器的机制 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); 作用:创建定时器的文件描述符 返回值&…...
什么是数据中心代理IP?有哪些用途?
在海外代理IP的选择中,数据中心代理IP是一个热门选项。这些代理服务器为用户分配了非ISP(互联网服务提供商)提供的IP地址,而是由第三方云服务提供商所提供的,通常位于数据中心内的服务器上,由托管和云公司所…...
机器学习分类模型性能评估:应对类别不平衡的策略与指标
在机器学习的世界里,模型们就像一群努力破案的侦探,而数据就是它们的“犯罪现场”。今天,咱们的主角——一个自命不凡的分类模型,接到了一个看似简单的任务:揪出那些患有罕见疾病的患者。这听起来是不是很容易…...
论文导读 - 基于边缘计算、集成学习与传感器集群的便携式电子鼻系统
基于边缘计算、集成学习与传感器集群的便携式电子鼻系统 原论文地址:https://www.sciencedirect.com/science/article/abs/pii/S0925400522015684 引用此论文(GB/T 7714-2015): WANG T, WU Y, ZHANG Y, et al. Portable electr…...
Molex莫仕连接器:增强高级驾驶辅助系统,打造更安全的汽车
随着对先进、高耗电量的系统的需求日益增长,电气化进程不断加速,汽车行业正处于一个十字路口。现代汽车面临着关键挑战,即满足不断增长的电力需求,特别是高级驾驶辅助系统(ADAS)等关键技术的需求。 由于现今的汽车比以往需要更多的…...
[密码学实战]SDF之密钥管理类函数(二)
[密码学实战]SDF之密钥管理类函数(二) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层 功能范畴: #mermaid-svg-af5D1B1iHx3K8vSU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16…...
多实例情况下,实例名较长dbca失败
dbca创建数据库,但是失败,提示ORA-01158 看来千锤百炼的dbca脚本还是菜,直觉上讲不应该mount上,看一下Action 本地已存在多个实例且名称前缀类似,下一步应该分析dbca日志和实例的alert.log 改为 一个简短的实例名就…...
模电——PN结
一、铺垫 这篇文章将会吊打一切、只会从电子、电场力的角度来阐述PN结为啥会形成、和变薄、变厚;不再考虑空穴这种东西;——提出空穴的人,真不是东西 我敢打赌,全网,我的说法不一定对,但是绝对是唯一可以…...
c++11 : 特殊类设计
目录 一 设计一个类:只能在堆上创建对象 二 设计一个类:只能在栈上创建对象 三 设计一个类:不能被拷贝 四 设计一个类:不能被继承 五 设计一个类: 只能创建一个对象(单例模式) 六 饿汉和懒汉模式的对比 一 设计一个类…...
算法笔记.kruskal算法求最小生成树
题目:(来源:AcWing) 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。 给定一张边带权的无向…...
量子算法调试:Grover算法搜索空间压缩过程可视化方案
一、Grover算法核心原理回顾 Grover算法通过以下两步迭代实现搜索空间压缩: Oracle操作(相位翻转) 标记目标状态: Uω∣x⟩={−∣x⟩x=ω∣x⟩x≠ωUω∣x⟩={−∣x⟩∣x⟩x=ωx=ω 扩散操作(振幅放大) 执行反转平均操作: D=2∣s⟩⟨s∣−ID=2∣s⟩⟨s∣−I 其…...
零基础搭建AI作曲工具:基于Magenta/TensorFlow的交互式音乐生成系统
引言:当AI遇见莫扎特 “音乐是流动的建筑”,当人工智能开始理解音符间的数学规律,音乐创作正经历着前所未有的范式变革。本文将手把手教你构建一套智能作曲系统,不仅能够生成古典钢琴小品,还能实现巴洛克与爵士风格的…...
springboot项目文件上传到服务器本机,返回访问地址
文件上传到服务器本机,然后给出访问地址: 具体如下: 1、添加必要的工具类依赖 <!-- 文件上传工具类 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId>…...
mysql community 8.0.23升级到8.0.42再到8.4.5
近日生产服务器准备正式试运行,数据进入客户的专有网络,于是甲方派了人过来测漏洞,结果扫出一大堆。其间关于mysql的漏洞300多个,吓死人。给出的补丁地址,打开来看,全部是英文,可能是一些什么测…...
ubuntu安装docker,conda,tmux,btop,nvitop
在 Ubuntu 上安装 Docker Engine (使用华为云源) 1. 更新系统软件包 sudo apt update sudo apt upgrade -y2. 安装必要的依赖包 sudo apt install -y \ca-certificates \curl \gnupg \lsb-release \git \vim \wget3. 添加 Docker 的 GPG 密钥 (来自华为云镜像) # 创建用于存…...
大模型在肝硬化腹水风险预测及临床方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、肝硬化及大模型相关理论基础 2.1 肝硬化概述 2.2 大模型技术原理 2.3 大模型在医疗领域的应用现状 三、大模型预测肝硬化腹水术前风险 3.1 术前风险因素分析 3.2 大模型预测术前…...
孙宇晨将出席迪拜Token2049 与特朗普次子共话加密未来
据官方消息,波场TRON创始人孙宇晨将出席5月1日在迪拜举办的Token2049峰会上,并与特朗普次子埃里克特朗普(Eric Trump)进行一场备受瞩目的炉边对话,出席对话的人士还包括特朗普家族支持的去中心化金融项目WLFI(World Liberty Financial)的联合创始人Zach Witkoff。这场对话不仅彰…...
深入理解同源策略与跨域资源共享(CORS)
深入理解同源策略与跨域资源共享(CORS) 前言 在当今的 Web 开发中,跨域资源请求已成为常见需求。然而,浏览器的同源策略(Same-Origin Policy)作为最基础的安全机制,限制了不同源之间的资源交互…...
Vue 生命周期钩子总结
Vue 生命周期钩子总结 Vue 组件的生命周期钩子允许在组件不同阶段执行自定义逻辑。以下是各阶段的钩子函数及其用途、触发时机和注意事项: 1. 生命周期阶段概览 Vue 组件的生命周期分为四个主要阶段: 创建(Creation)࿱…...
【解决方案】Linux解决CUDA安装过程中GCC版本不兼容
Linux解决CUDA安装过程中GCC版本不兼容 目录 问题描述 解决方法 安装后配置 问题描述 Linux环境下安装 CUDA 时,运行sudo sh cuda_10.2.89_440.33.01_linux.run命令出现 “Failed to verify gcc version.” 的报错,提示 GCC 版本不兼容,查…...
网络准入控制系统推荐:2025年构建企业网络安全的第一道防线
随着信息技术的飞速发展,企业网络环境日益复杂,阳途网络准入控制系统作为一种先进的网络安全解决方案,其核心是确保网络接入的安全性。 一、网络准入控制系统的基本原理与功能 网络准入控制以“只有合法的用户、安全的终端才可以接入网络”为…...
AI Agent
李宏毅:从零开始搞懂 AI Agent - 知乎台大李宏毅2025 AI Agent新课来了! - 知乎读懂AI Agent:基于大模型的人工智能代理 - 知乎 1.什么是AI Agent 一个基于大模型的 AI Agent 系统可以拆分为大模型、规划、记忆与工具使用四个组 件部分。AI A…...
大模型如何应对内容安全:原理、挑战与技术路径探讨
随着大语言模型(LLM)技术的广泛应用,从AI写作助手到智能客服、再到生成式内容平台(AIGC),AI 正以前所未有的速度深入人类社会的各个角落。然而,随之而来的内容安全问题也日益凸显:模…...
Flinkcdc 实现 MySQL 写入 Doris
Flinkcdc 实现 MySQL 写入 Doris Flinkcdc 实现 MySQL 写入 Doris 一、环境配置 Doris:3.0.4 JDK 17 MySQL (业务数据库):5.7 MySQL(本地数据库):5.7 Flink:flink-1.19.1 flinkc…...
vim粘贴代码格式错乱 排版错乱 缩进错乱 解决方案
从IDE复制代码, 粘贴到vim打开的文件 出现以下格式错乱解决方案 在使用 Vim 编辑器粘贴代码时,出现格式错乱的问题,通常是因为 Vim 的自动缩进功能与粘贴的代码发生了冲突。Vim 默认会尝试对输入的内容进行自动缩进,这会导致粘贴的代码被错误…...
发那科机器人(基本操作、坐标系、I/O通信)
发那科机器人(基本操作、坐标系、I/O通信) 一,机器人基本操作1,坐标系种类2,机器人手动操作一关节运动3,机器人手动操作一直角运动二,坐标系建立1,工具坐标系建立原理及验证方法2,工具坐标系建立步骤3,用户坐标系建立原理及验证方法4,用户坐标系建立步骤三,I/O通信…...
GPU 架构入门笔记
引文位置:https://www.trainy.ai/blog/gpu-utilization-misleading 相关概念是通过 ChatGPT 迅速学习总结而成。 概念: GPU H100 GPU, with 144 SMs 每个 SM(streaming multiprocessors) 的架构: GPU Utilizati…...
centos7使用yum快速安装Docker环境
一、基础环境设置 1:关闭防火墙和内核安全机制 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 02:配置网络yum源 [rootlocalhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Cento…...
解密面试高频题:加权轮询负载均衡算法 (Java 实现)
在分布式系统设计和面试中,负载均衡是一个绕不开的话题。而加权轮询(Weighted Round Robin, WRR)作为一种经典且实用的负载均衡策略,经常出现在笔试题和面试环节中。本文将带你深入理解 WRR 算法的原理,并探讨几种常见…...
Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
延时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的,不会重复执行 当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中默认系统中的所有普通…...
高效运维,智慧监测:COMEM光纤温度测量系统在电力行业中的应用
在电力行业中,变压器的稳定运行对于整个电网的安全很重要。为了确保变压器的健康状态,实时、精确的温度监测成为了不可或缺的一环。COMEM光纤温度测量系统应运而生,为变压器的温度监测提供了创新的解决方案。 变压器温度监测的重要性 变压器在…...
TP5兼容达梦国产数据库
1.首先数据库安装,部署时需配置大小写不敏感 2.安装PHP达梦扩展,一定要是对应版本(兼容操作系统)的扩展,否则会出现各种报错。参考官方文档:https://eco.dameng.com/document/dm/zh-cn/app-dev/php_php_new…...
[leetcode]2302.统计得分小于k的子数组
1.题目 2.事例 3.数据规模 4.思路(滑动窗口) 4.1滑动窗口的定义 滑动窗口是一种在数组、字符串等序列数据结构上进行操作的算法技巧。以下是其定义及相关要素的详细介绍: 定义:滑动窗口可以理解为在一个序列上,用一…...
Linux网络编程:TCP多进程/多线程并发服务器详解
Linux网络编程:TCP多进程/多线程并发服务器详解 TCP并发服务器概述 在Linux网络编程中,TCP服务器主要有三种并发模型: 多进程模型:为每个客户端连接创建新进程多线程模型:为每个客户端连接创建新线程I/O多路复用&am…...
Nacos源码—1.Nacos服务注册发现分析二
大纲 1.客户端如何发起服务注册 发送服务心跳 2.服务端如何处理客户端的服务注册请求 3.注册服务—如何实现高并发支撑上百万服务注册 4.内存注册表—如何处理注册表的高并发读写冲突 2.服务端如何处理客户端的服务注册请求 (1)客户端自动发送服务注册请求梳理 (2)Nacos…...
设备指纹护航电商和金融反欺诈体系建设
众所周知,人的指纹具有唯一性,可以作为人的身份识别标识。对于设备而言,也有可以用于识别的特征。设备指纹是指可以用于唯一标识出某一设备的特征或者独特的设备标识,具有固定性、较难篡改性、唯一性等特质。 设备指纹是金融机构…...
FFmpeg源码学习---ffmpeg
1、ffmpeg源码主函数 ┌────────────────────┐ │ main() │ └─────────┬───────────┘ ↓ ┌────────────────────┐ │ 初始化 (日志/网络等) │ │ init_dynload() │ │ avf…...
leetcode 206. 反转链表
题目描述: 迭代法: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode …...
NVIDIA新模型DAM-3B:描述一切,图像视频局部描述新突破
在数字时代,图像和视频内容爆炸式增长,如何让AI像人类一样精准描述画面中的特定区域,成为计算机视觉领域的核心挑战。传统模型要么丢失细节,要么缺乏上下文,而NVIDIA与UC Berkeley联合团队提出的DAM(Descri…...
7、langChain和RAG实战:基于LangChain和RAG的常用案例实战
PDF 文档问答ChatBot 本地上传文档 支持 pdf支持 txt支持 doc/docx问答页面 python环境 新建一个requirements.txt文件streamlit python-docx PyPDF2 faiss-cpu langchain langchain-core langchain-community langchain-openai然后安装相应的包pip install -r requirements.t…...
c++11: 类型转换
目录 一 C语言中的类型转换 二 . C强制类型转换 1. static_cast 2. reinterpret_cast 3. const_cast 4. dynamic_cast 三 explicit 关键字 一 C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配ÿ…...