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

Vue项目中集成百度地图API的实战指南与优化技巧

1. 从零开始在Vue项目中引入百度地图API如果你正在开发一个需要展示地理位置、规划路线或者标记兴趣点的Vue应用那么集成一个地图组件几乎是绕不开的。百度地图作为国内主流的地图服务其JavaScript API功能强大、文档齐全对于前端开发者来说是个不错的选择。但第一次在Vue这种现代前端框架里接入传统的地图库可能会有点无从下手感觉像是要把一个老式的收音机装进智能汽车里。别担心我刚开始做的时候也踩过不少坑比如地图容器渲染不出来、API对象找不到或者事件绑定混乱。这篇文章我就以一个过来人的身份手把手带你走一遍完整的流程并分享一些让集成更顺畅、性能更优秀的实战技巧。首先最基础也是最重要的一步是获取你的“通行证”——百度地图开发者密钥AK。没有它一切功能都无法调用。你需要访问百度地图开放平台官网注册并登录后在“控制台”的“应用管理”中创建一个新应用。应用类型选择“浏览器端”注意这里要正确填写应用的“白名单”。对于开发阶段你可以直接填写“*”来允许所有域名访问方便调试但切记在项目正式上线前一定要将其修改为你真实的服务器域名或IP地址这是保证服务安全和稳定的基本要求。创建成功后你就能拿到那个宝贵的AK了请妥善保管。接下来我们面临一个关键选择如何在Vue项目中引入百度地图的JavaScript库原始文章提到了在public/index.html中直接通过script标签引入。这确实是最简单直接的方法尤其适合快速原型验证。你只需要在HTML文件的head或body底部添加一行脚本链接并将你的AK填入即可。!DOCTYPE html html langen head meta charsetutf-8 meta http-equivX-UA-Compatible contentIEedge meta nameviewport contentwidthdevice-width,initial-scale1.0 script typetext/javascript srchttps://api.map.baidu.com/api?v1.0typewebglak你的AK/script title我的Vue地图项目/title /head body div idapp/div /body /html这种方法下百度地图的BMapGL等全局对象会挂载到window上。在你的Vue组件中就可以通过window.BMapGL来访问了。但是这种方法存在一些隐患比如全局命名空间污染、依赖关系不明确、在服务端渲染SSR场景下会报错等。对于追求工程化和可维护性的大型项目我更推荐使用异步加载的方式。我们可以封装一个工具函数动态创建script标签来加载百度地图API并返回一个Promise这样能更好地控制加载时机和错误处理。2. 核心实战创建你的第一个交互式地图组件拿到AK并引入库之后我们就可以在Vue组件里大展拳脚了。让我们创建一个基础的、可交互的地图组件。首先在组件的模板中我们需要一个容器元素来承载地图。这个容器必须指定一个明确的宽度和高度否则地图将无法渲染。template div classmap-page h2我的地图应用/h2 !-- 地图容器ref用于获取DOM节点 -- div idbmap-container refmapContainer/div /div /template style scoped #bmap-container { width: 100%; height: 600px; /* 必须设置高度 */ border: 1px solid #ccc; border-radius: 8px; } /style在脚本部分我们使用Vue 3的Composition APIscript setup来组织逻辑。核心步骤是在组件挂载后onMounted钩子中初始化地图实例。这里有一个关键点确保DOM容器已经真实渲染到页面上。我们通过ref获取到容器DOM节点然后将其作为参数传递给BMapGL.Map构造函数。script setup import { ref, onMounted, onUnmounted } from vue // 获取地图容器DOM引用 const mapContainer ref(null) // 用于存储地图实例方便在其他函数中调用 let mapInstance null onMounted(() { if (!mapContainer.value) return // 初始化地图实例 mapInstance new window.BMapGL.Map(mapContainer.value) // 创建一个中心点坐标这里以天安门为例 const point new window.BMapGL.Point(116.404, 39.915) // 初始化地图设置中心点和缩放级别 mapInstance.centerAndZoom(point, 15) // 启用鼠标滚轮缩放 mapInstance.enableScrollWheelZoom(true) // 添加缩放控件 mapInstance.addControl(new window.BMapGL.ZoomControl()) // 添加比例尺控件 mapInstance.addControl(new window.BMapGL.ScaleControl()) // 添加城市列表控件用于快速切换城市 mapInstance.addControl(new window.BMapGL.CityListControl()) }) // 良好的习惯在组件销毁时清理地图实例释放内存 onUnmounted(() { if (mapInstance) { // 百度地图API没有显式的destroy方法但可以移除容器内所有子元素 mapContainer.value.innerHTML mapInstance null } }) /script运行你的项目一个具备基本缩放、平移和控件功能的地图就应该出现了。你可能注意到我添加了几个控件。ZoomControl是常见的加减号缩放按钮ScaleControl是地图左下角的比例尺CityListControl则是一个下拉列表允许用户快速切换主要城市视图。这些控件极大地提升了用户的交互体验。此外enableScrollWheelZoom(true)这一行代码允许用户用鼠标滚轮缩放地图这是一个非常符合用户习惯的操作建议默认开启。2.1 地图类型与个性化样式默认的地图样式是标准的矢量图。百度地图API还提供了其他地图类型比如卫星图、三维地球模式等你可以通过setMapType方法来切换。// 切换到卫星图 mapInstance.setMapType(window.BMAP_SATELLITE_MAP) // 切换到普通矢量图默认 mapInstance.setMapType(window.BMAP_NORMAL_MAP) // 切换到地球模式3D mapInstance.setMapType(window.BMAP_EARTH_MAP) // 切换到路书地图突出道路 mapInstance.setMapType(window.BMAP_PERSPECTIVE_MAP)除了切换类型你还可以通过百度地图开放平台提供的“个性化地图”功能自定义地图的配色、元素显隐等使其更贴合你的应用主题。你需要在开放平台的地图个性化编辑器中设计好样式获取样式JSON的styleId然后在代码中应用。// 应用个性化地图样式 mapInstance.setMapStyleV2({ styleId: 你的个性化样式ID })3. 让地图“活”起来覆盖物与交互实现静态的地图只是开始真正发挥价值的是在地图上添加各种元素和交互。这些元素在地图API中被称为“覆盖物”包括标记点Marker、折线Polyline、多边形Polygon、信息窗口InfoWindow等。**添加一个标记点Marker**是最常见的需求。我们可以创建一个表示位置的标记并为其添加点击事件。// 创建坐标点 const point new window.BMapGL.Point(116.404, 39.915) // 创建标记使用默认图标 const marker new window.BMapGL.Marker(point) // 将标记添加到地图 mapInstance.addOverlay(marker) // 为标记添加点击事件 marker.addEventListener(click, function(e) { console.log(你点击了标记点, e) // 可以在这里打开信息窗口或执行其他操作 })你可能会觉得默认的红色图标太普通。没问题我们可以自定义图标的样式。// 创建自定义图标 const myIcon new window.BMapGL.Icon( https://your-cdn.com/path/to/icon.png, // 图标图片URL new window.BMapGL.Size(40, 50), // 图标显示大小 { anchor: new window.BMapGL.Size(20, 50), // 图标锚点即图标底部中心对准坐标点 imageSize: new window.BMapGL.Size(40, 50) // 图片实际大小 } ) // 使用自定义图标创建标记 const customMarker new window.BMapGL.Marker(point, { icon: myIcon }) mapInstance.addOverlay(customMarker)绘制折线Polyline和多边形Polygon常用于展示路线、区域范围。它们的创建方式类似都是传入一个坐标点数组。// 绘制一条折线例如简单路线 const polylinePoints [ new window.BMapGL.Point(116.399, 39.910), new window.BMapGL.Point(116.405, 39.920), new window.BMapGL.Point(116.425, 39.900) ] const polyline new window.BMapGL.Polyline(polylinePoints, { strokeColor: #1890ff, // 线条颜色 strokeWeight: 4, // 线条宽度 strokeOpacity: 0.8, // 线条透明度 strokeStyle: dashed // 线条样式可选 solid, dashed, dotted }) mapInstance.addOverlay(polyline) // 绘制一个多边形例如电子围栏 const polygonPoints [ new window.BMapGL.Point(116.387112, 39.920977), new window.BMapGL.Point(116.385243, 39.913063), new window.BMapGL.Point(116.394226, 39.917988) ] const polygon new window.BMapGL.Polygon(polygonPoints, { strokeColor: #ff4d4f, strokeWeight: 2, strokeOpacity: 1, fillColor: #ffccc7, // 填充颜色 fillOpacity: 0.4 // 填充透明度 }) mapInstance.addOverlay(polygon)3.1 实现信息窗口与用户交互信息窗口InfoWindow是展示地点详情的神器。它可以在标记点被点击时弹出显示自定义的HTML内容。// 创建信息窗口内容支持HTML字符串 const infoContent div stylepadding: 10px; min-width: 200px; h4 stylemargin-top:0;天安门广场/h4 p位于北京市中心是世界上最大的城市广场。/p psmall点击查看更多详情.../small/p /div // 创建信息窗口对象 const infoWindow new window.BMapGL.InfoWindow(infoContent, { width: 250, // 窗口宽度 height: 150, // 窗口高度 title: 地点信息 // 窗口标题旧版API样式 }) // 为标记点绑定点击事件打开信息窗口 marker.addEventListener(click, function() { // openInfoWindow 方法参数信息窗口对象打开的位置点 mapInstance.openInfoWindow(infoWindow, point) }) // 你也可以直接在地图的任意位置打开信息窗口 // mapInstance.openInfoWindow(infoWindow, new BMapGL.Point(116.408, 39.915))更复杂的交互比如让用户在地图上点击动态添加标记或者画线、画面其核心是监听地图的点击click、双击dblclick等事件。这里分享一个我常用的技巧实现“点击画点双击结束并绘制多边形”的功能。我们需要维护一个临时存储点的数组并在不同事件中处理。let drawingPoints [] let tempMarkers [] // 存储临时标记用于清除 // 监听地图点击事件添加临时点 mapInstance.addEventListener(click, function(e) { const point new window.BMapGL.Point(e.latlng.lng, e.latlng.lat) drawingPoints.push(point) // 添加一个临时标记点给用户反馈 const tempMarker new window.BMapGL.Marker(point) mapInstance.addOverlay(tempMarker) tempMarkers.push(tempMarker) }) // 监听地图双击事件结束绘制 mapInstance.addEventListener(dblclick, function(e) { if (drawingPoints.length 3) { alert(至少需要3个点才能构成多边形) clearDrawing() return } // 创建多边形 const polygon new window.BMapGL.Polygon(drawingPoints, { strokeColor: #52c41a, fillColor: #b7eb8f, strokeWeight: 2 }) mapInstance.addOverlay(polygon) // 清除临时点和标记 clearDrawing() }) function clearDrawing() { // 清除所有临时标记 tempMarkers.forEach(marker mapInstance.removeOverlay(marker)) tempMarkers [] // 清空点数组 drawingPoints [] }4. 进阶功能与性能优化技巧当你的地图上需要展示成百上千个标记点时性能问题就会凸显出来。直接添加大量Marker会导致页面卡顿、内存飙升。这时你需要了解百度地图的MarkerClusterer点聚合功能。它能把一定区域内密集的点聚合显示为一个簇点击簇可以展开。这不仅能大幅提升渲染性能也让地图视图更清晰。首先你需要引入点聚合库。注意这个库不是核心API的一部分需要单独引入。!-- 在引入百度地图API的script标签后再引入点聚合库 -- script typetext/javascript srchttps://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js/script然后在你的Vue组件中使用它import { onMounted } from vue onMounted(async () { // ... 初始化地图 mapInstance ... // 1. 模拟生成大量标记点数据 const markers [] for (let i 0; i 200; i) { const point new window.BMapGL.Point( 116.3 Math.random() * 0.5, // 在某个经纬度范围内随机生成 39.8 Math.random() * 0.5 ) const marker new window.BMapGL.Marker(point) markers.push(marker) } // 2. 创建点聚合器实例 // 参数地图实例标记点数组可选配置项 const markerClusterer new window.BMapLib.MarkerClusterer(mapInstance, { markers: markers, girdSize: 100, // 聚合计算时网格的像素大小默认60 maxZoom: 18, // 最大聚合级别大于此级别则不聚合 styles: [{ // 可以自定义聚合簇的图标样式 url: https://api.map.baidu.com/library/MarkerClusterer/1.2/images/m1.png, size: new window.BMapGL.Size(53, 52) }] }) // 你也可以动态添加或移除标记 // markerClusterer.addMarker(newMarker); // markerClusterer.removeMarker(oldMarker); })另一个常见的性能优化点是地图事件的销毁。在Vue组件中如果你为地图或覆盖物添加了事件监听器一定要在组件销毁前onUnmounted钩子中移除它们防止内存泄漏。虽然百度地图的部分事件在容器销毁后可能不会造成严重问题但养成良好习惯至关重要。对于自定义的、频繁触发的事件如mousemove务必手动移除。4.1 集成地理编码与逆地理编码服务除了显示地图我们经常需要处理地址和坐标之间的转换。百度地图提供了Geocoder地理编码和LocalSearch本地搜索等服务。例如用户输入一个地址我们需要将其转换为坐标并在地图上标出。// 地理编码地址 - 坐标 const geoCoder new window.BMapGL.Geocoder() geoCoder.getPoint(北京市海淀区上地十街10号, function(point) { if (point) { mapInstance.centerAndZoom(point, 16) const marker new window.BMapGL.Marker(point) mapInstance.addOverlay(marker) } else { alert(未找到该地址) } }, 北京市) // 第三个参数是所在城市用于提高解析精度 // 逆地理编码坐标 - 地址 mapInstance.addEventListener(click, function(e) { const pt e.latlng geoCoder.getLocation(pt, function(rs) { const address rs.address const infoWindow new window.BMapGL.InfoWindow(点击位置的地址是${address}) mapInstance.openInfoWindow(infoWindow, pt) }) })对于地点搜索LocalSearch非常强大。它可以搜索周边餐饮、酒店、公交站等并自动将结果以标记形式展示在地图上。// 创建本地搜索实例 const localSearch new window.BMapGL.LocalSearch(mapInstance, { renderOptions: { map: mapInstance, // 搜索结果直接渲染到地图上 autoViewport: true // 自动调整地图视野以包含所有结果 }, onSearchComplete: function(results) { // 搜索完成后的回调 if (localSearch.getStatus() window.BMAP_STATUS_SUCCESS) { console.log(找到, results.getNumPois(), 个结果) } } }) // 搜索“公园” localSearch.search(公园)在实际Vue项目中我建议将这些服务地图实例、Geocoder、LocalSearch等封装到一个独立的ComposableVue 3或MixinVue 2中实现逻辑复用和状态管理。例如创建一个useBaiduMap.js// composables/useBaiduMap.js import { ref, onUnmounted } from vue export function useBaiduMap(ak) { const mapInstance ref(null) const geocoder ref(null) const initMap (containerEl, centerPoint, zoom 15) { return new Promise((resolve) { // 动态加载脚本... // 初始化地图... mapInstance.value new window.BMapGL.Map(containerEl) mapInstance.value.centerAndZoom(new window.BMapGL.Point(...centerPoint), zoom) geocoder.value new window.BMapGL.Geocoder() resolve(mapInstance.value) }) } const addressToPoint (address, city) { return new Promise((resolve, reject) { if (!geocoder.value) reject(new Error(Geocoder未初始化)) geocoder.value.getPoint(address, (point) { point ? resolve(point) : reject(new Error(地址解析失败)) }, city) }) } onUnmounted(() { // 清理工作 }) return { mapInstance, initMap, addressToPoint } }然后在组件中优雅地使用script setup import { ref, onMounted } from vue import { useBaiduMap } from /composables/useBaiduMap const mapContainer ref(null) const { mapInstance, initMap, addressToPoint } useBaiduMap(你的AK) onMounted(async () { await initMap(mapContainer.value, [116.404, 39.915], 15) // 使用地图实例添加控件等... // 使用地理编码 try { const point await addressToPoint(清华大学, 北京市) console.log(坐标, point) } catch (err) { console.error(err) } }) /script这种封装方式让地图相关的逻辑变得清晰、可测试且易于在不同组件间共享是构建复杂地图应用的推荐架构。最后记得始终关注百度地图开放平台的官方文档更新API和服务可能会迭代新的功能和性能优化也会不断加入。多动手实践遇到问题善用浏览器的开发者工具查看网络请求和错误日志你就能越来越得心应手地在Vue项目中驾驭百度地图了。

相关文章:

Vue项目中集成百度地图API的实战指南与优化技巧

1. 从零开始:在Vue项目中引入百度地图API 如果你正在开发一个需要展示地理位置、规划路线或者标记兴趣点的Vue应用,那么集成一个地图组件几乎是绕不开的。百度地图作为国内主流的地图服务,其JavaScript API功能强大、文档齐全,对于…...

WSL2 网络配置全攻略:解决 localhost 代理、Docker 和局域网访问问题

WSL2 网络配置深度解析:从原理到实战,打通开发环境任督二脉 如果你和我一样,从纯粹的 Linux 或 macOS 开发环境迁移到 Windows,并拥抱了 WSL2,那么网络配置这块“硬骨头”你大概率啃过。那种在浏览器里 localhost:3000…...

微前端架构实战:从原理到框架选型

1. 微前端到底是什么?从“大泥球”到“乐高积木”的进化 如果你做过几年前端开发,大概率遇到过这样的项目:一个庞大的单体应用,代码库动辄几十万行,技术栈可能是五年前甚至更早的。每次改一个小功能都心惊胆战&#xf…...

Spring Boot 3.5.x 实战:SpringDoc 2 与 Swagger3 的深度集成与配置优化

1. 为什么在Spring Boot 3.5.x时代,我坚定地选择了SpringDoc 2 如果你和我一样,是从Spring Boot 2.x时代一路升级上来的老开发者,那你肯定对Swagger 2.x和它的老朋友springfox-boot-starter不陌生。当年,它几乎是Spring Boot项目生…...

ESP8684-WROOM-04C射频特性深度解析与工程落地指南

ESP8684-WROOM-04C 射频特性深度解析与工程落地指南射频性能是无线模组的核心竞争力,直接决定通信距离、抗干扰能力、功耗表现与系统稳定性。ESP8684-WROOM-04C 作为乐鑫新一代高集成度 Wi-Fi 6 Bluetooth 5.3 双模模组,其射频设计在保持小尺寸封装&…...

立创开源Type-C超声波切割刀DIY全解析:从STC8H驱动到GU-18脉冲变压器设计

立创开源Type-C超声波切割刀DIY全解析:从STC8H驱动到GU-18脉冲变压器设计 最近在捣鼓一些桌面小工具,想做一个能轻松切割3D打印支撑和纸张的超声波切割刀。市面上的成品要么太贵,要么不够小巧,于是决定自己动手做一个。这个项目从…...

立创EDA开源项目:ALL IN ONE全统一超高速HUB硬件设计与实现全解析

立创EDA开源项目:ALL IN ONE全统一超高速HUB硬件设计与实现全解析 最近在立创开源硬件平台上看到一个挺有意思的项目,叫“ALL IN ONE全统一超高速HUB”。这名字听起来就挺唬人的,点进去一看,好家伙,这哪里是个普通的US…...

【国家级等保2.0强制要求】:MCP 2.0消息完整性校验必须满足的4项密码学硬指标(附国密SM4-GMAC审计清单)

第一章:MCP 2.0消息完整性校验的等保2.0合规性定位与密码学基线解读MCP 2.0(Message Control Protocol 2.0)作为关键业务系统间安全通信的核心协议,其消息完整性校验机制直接关联《网络安全等级保护基本要求》(GB/T 22…...

次元画室教程:锁定“风格密码”,批量产出AE可用素材(附案例)

次元画室教程:锁定“风格密码”,批量产出AE可用素材(附案例) 1. 引言:从“单张美图”到“批量素材库”的思维转变 如果你是After Effects的深度用户,下面这个场景你一定不陌生:项目需要一个风…...

Linux网络驱动开发:PHY状态机与链路检测机制详解(附实战代码分析)

Linux网络驱动开发:PHY状态机与链路检测机制详解(附实战代码分析) 在嵌入式Linux网络驱动开发中,PHY芯片的管理是连接物理层与数据链路层的核心桥梁。对于许多中高级工程师而言,理解内核如何感知并响应网线插拔、协商速…...

ollama部署本地大模型|embeddinggemma-300m在金融研报相似度分析应用

ollama部署本地大模型|embeddinggemma-300m在金融研报相似度分析应用 金融分析师每天需要阅读大量研报,如何快速找到相似内容、发现关联信息?本文将手把手教你用ollama部署embeddinggemma-300m模型,构建金融研报智能分析系统。 1.…...

ESP32-P4 VDMA多块传输与低功耗中断驱动详解

ESP32-P4 VDMA 控制器深度解析:多块传输机制、低功耗设计与中断驱动配置实践1. VDMA 多块传输终止判定机制详解VDMA(Video Direct Memory Access)控制器在 ESP32-P4 中承担着高吞吐、低延迟的数据搬运任务,其核心能力之一在于对多…...

线程池核心参数?如何设置?

这句先记住。线程池核心参数决定了:线程池最多开多少线程?任务怎么排队?线程空闲多久回收?线程怎么创建?满了之后怎么办?一、线程池 7 个核心参数Java 里最常见的是 ThreadPoolExecutor:ThreadP…...

YOLOv6 安装及使用详细教程

前言 YOLOv6 是美团研发的轻量级目标检测算法,兼顾检测精度与推理速度,适配工业落地与学术入门场景。该算法针对工程化部署深度优化,环境配置简单、运行流程清晰,是零基础用户入门目标检测的优选方案。本文将手把手带你完成 YOLO…...

Windows安装OpenClaw龙虾(新手入门必备)

目录 一、准备工作(必做) 二、方案A:原生PowerShell一键安装(新手首选) 1. 打开管理员PowerShell 2. 解锁脚本执行权限(必做) 3. 一键安装OpenClaw 4. 验证安装 5. 初始化配置&#xff0…...

基于终端 ANSI 转义序列的“等离子体流体动画”

目录 创意项目:终端等离子体场 (Terminal Plasma) 代码设计的“极限”考量 挑战扩展方向 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 挑战开发极限,不仅是代码量的缩减,更是对算法、位…...

JVM面试题100道(含答案解析)

在Java后端开发面试中,JVM(Java Virtual Machine) 几乎是必问的核心知识点。 很多互联网公司(如大厂或中大型技术团队)在技术面试中都会重点考察 JVM内存模型、垃圾回收机制、类加载机制以及JVM调优能力。 本文整理了一…...

【杂谈】结构体的内存对齐与位段

目录 一、结构体内存对齐问题(节省时间) 1.什么是内存对齐 2.需要使用内存对齐的原因 3.内存对齐的规则 4.举例 5.小结 二、结构体实现位段操作(节省空间) 1.位域简介与使用原因 2.位域的定义与使用时的注意事项 3.举例 …...

前端开发 - this 指向问题(直接调用函数、对象方法、类方法)

一、直接调用函数 1、基本介绍非严格模式:this 为 window严格模式,this 为 undefined2、演示 function fn() {console.log(this); } fn();# 非严格模式下运行,输出结果Window {window: Window, self: Window, document: document, name: , lo…...

2026精选课题-基于springboot大学生社团管理系统的设计与实现

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/学生代理交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

智能电网无线通信中仅存在式被动侦察的基准数据集

大家读完觉得有帮助记得关注和点赞!!!摘要在智能电网通信中对仅存在式被动侦察进行基准测试具有挑战性,因为攻击者只接收信号,但附近的观察者仍然可以通过额外的阴影和多径效应改变传播,从而重塑信道相干性…...

Web安全实战:绕过__wakeup漏洞攻防解析

1. 从一道CTF题说起:为什么我的反序列化总被“叫醒”? 大家好,我是老张,一个在Web安全领域摸爬滚打了十来年的老兵。今天想和大家聊聊一个在PHP安全里既经典又有点“狡猾”的漏洞——__wakeup魔术方法的绕过。这事儿说起来&#x…...

Vue3+WebRtcServer实现海康监控rtsp流视频的跨域播放解决方案

1. 为什么你的海康监控视频在Vue3里播不出来? 最近好几个做安防项目的朋友都跟我吐槽同一个问题:他们在Vue3项目里想直接播放海康威视摄像头的RTSP视频流,结果要么黑屏,要么疯狂报跨域错误。浏览器控制台里一片红,全是…...

深入解析tile_images与tile_images_offset:图像拼接的灵活应用

1. 从“拼图游戏”到工业视觉:为什么你需要了解图像拼接 如果你玩过拼图游戏,或者用手机App把几张照片拼成一张长图,那你对“图像拼接”这个概念一定不陌生。在工业视觉和图像处理领域,这种需求同样普遍,甚至更为关键。…...

Ubuntu22.04下BBR与CUBIC拥塞控制算法的性能对比测试

1. 为什么我们要关心拥塞控制算法? 如果你用过家里的宽带,或者在公司里传过大文件,肯定遇到过这种情况:明明网速标称很高,但下载东西就是时快时慢,看视频也总在缓冲。很多时候,这口“锅”可能不…...

手把手教你玩转Nunchaku FLUX.1:从安装到出图,新手完整指南

手把手教你玩转Nunchaku FLUX.1:从安装到出图,新手完整指南 想试试用AI生成图片,但看到复杂的界面和参数就头疼?别担心,今天我来带你从零开始,一步步玩转Nunchaku FLUX.1 CustomV3这个强大的文生图工具。你…...

R提供了一些函数用于判断逻辑表达式的结果

下面内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文5241字)。 3章4节:R的逻辑运算和矩阵运算_逻辑判断矩阵在r语言中的应用-CSDN博客 逻辑运算和矩阵运算是R语言中两个重要的功能模块,前者用于逻辑判断和条件筛选&am…...

Linux下hadoop2.9.2单节点伪分布搭建完全教程

配置静态 IP 在实际应用中,由于我们使用的是 DHCP(Dynamic Host Configuration Protocol: 动态主机配置协议)服务器来分配的地址,那么每次重启DHCP 服务器 ip 地址有 可能是会变动的。 而我们用Linux 来搭建集群学习Ha…...

OpenClaw 技能插件开发实战:适配职业教育的 AI 实训案例

一、前言随着人工智能技术在职业教育领域的深度渗透,传统AI实训模式逐渐暴露出诸多痛点:实训内容脱离企业真实应用场景、学生上手门槛高、实训平台功能固化难以拓展、缺乏可落地的实战化开发任务,难以满足职教领域“岗课赛证”融合的人才培养…...

【Docker】Linux系统上卸载旧Docker、卸载Podman并重新安装Docker及配置国内镜像源

一、卸载 Podman 可以使用如下命令卸载 Podman dnf remove -y podman buildah 二、卸载旧版本 Docker 若系统中已存在旧版 Docker,请按以下步骤彻底卸载: 1.停止Docker服务 sudo systemctl stop docker 2. 卸载 Docker 相关软件包 sudo yum remov…...