Vue.js 高德地图热力图实战:从点位散落到密度可读
简介这份资源面向使用 Vue.js 做前端地图可视化的开发者聚焦高德地图热力图Heatmap的集成与数据渲染适合已掌握 Vue 基础、需要快速落地热点分布展示场景的中级开发者参考。压缩包内仅 1 个 PDF 文件约 40KB以图文与代码片段形式完整呈现实现思路。内容围绕引入高德地图 JSAPI、配置地图容器、初始化地图实例、检测浏览器 canvas 支持、从接口拉取经纬度与计数字段并转换数据格式、加载 AMap.Heatmap 插件、设置半径与渐变色及 setDataSet 等关键环节展开同时给出官方示例数据结构与文档链接便于对照调试。已有 789 人学习可作为地图可视化项目的排错与实现参考。1. 用 vue.js 高德地图实现热点图从「点位散落」到「密度可读」的那一步很多做数据可视化的前端都遇到过这个场景后台返回几千条带经纬度的业务点位直接铺在地图上就是一片密密麻麻的针尖看不出哪里密、哪里疏业务方一句「能不能看出热点区域」就把需求甩过来了。这时候 vue.js 配合高德地图的热力图能力就是最省事的落地方案——它不需要你自建瓦片服务也不用引入额外的 WebGL 渲染库靠官方 JS API 里的热力图层就能把离散点位聚合成一张可读的密度图。这篇文章面向的是已经能在 Vue 项目里跑起一张基础地图、但还没把热力图调明白的前端我会把加载、数据格式、参数调优、性能边界和踩过的坑一次讲透让你照着能复现出一张颜色过渡自然、缩放不糊的热力图。2. 热力图在 Vue 里到底怎么挂上去加载器、容器与图层三件事热力图不是高德地图默认就有的能力它属于「可视化图层」这一类扩展需要单独引入插件脚本。很多人第一次翻车就翻在这里地图能显示但AMap.HeatMap是 undefined控制台报「不是一个构造函数」。原因不是代码写错而是插件没加载完就去 new 了。2.1 先想清楚为什么用官方热力图层而不是自己画在选型阶段常见做法有三种一是用 Canvas 自己按点位画径向渐变再叠加二是用第三方大数据可视化库的 heatmap 扩展三是直接用高德官方的AMap.HeatMap。自己画的好处是完全可控坏处是缩放级别变化时你得自己重算像素半径和透明度地图一拖动就容易出现色块错位第三方库能力强但和高德底图的坐标系、缩放事件对接又是一层适配成本。官方热力图层本质上是把「点位 → 网格 → 颜色映射」这套逻辑封装好了它内部按当前缩放级别把经纬度投影到屏幕网格统计每个网格的点数再按你给的radius和gradient做模糊和着色。你只需要喂数据、调参数。对于「几千到几万点位、要快速看出密度分布」这类需求它是投入产出比最高的选择。代价是自定义能力有限比如你想按某个权重字段而不是单纯计数来着色就得走AMap.HeatMap的3D模式或者干脆自己实现。2.2 用 amap/amap-jsapi-loader 在 Vue 3 里按需加载现在主流做法是用官方加载器amap/amap-jsapi-loader它能保证插件加载完成后再回调避免时序问题。先装依赖npm install amap/amap-jsapi-loader --save然后在组件里这样初始化。注意plugins数组里必须显式写上AMap.HeatMap不写的话地图能出来但热力图构造不出来// HeatMap.vue import { onMounted, onUnmounted, ref, shallowRef } from vue import AMapLoader from amap/amap-jsapi-loader const mapRef ref(null) // 地图容器 DOM const map shallowRef(null) // 地图实例用 shallowRef 避免深度响应式拖慢性能 const heatmap shallowRef(null) // 热力图实例 onMounted(async () { const AMap await AMapLoader.load({ key: 你的Web端Key, // 必须是 Web端(JS API) 类型的 Key version: 2.0, // 2.0 是当前稳定主版本 plugins: [AMap.HeatMap] // 关键热力图插件必须在这里声明 }) map.value new AMap.Map(mapRef.value, { zoom: 11, center: [116.397, 39.909], // 初始中心点 viewMode: 2D // 热力图在 2D 下表现最稳 }) // 实例化热力图先给一组空数据占位 heatmap.value new AMap.HeatMap(map.value, { radius: 25, opacity: [0, 0.8], gradient: { 0.4: blue, 0.6: cyan, 0.7: lime, 0.8: yellow, 1.0: red } }) }) onUnmounted(() { // 组件销毁时一定要手动清理否则地图实例和事件监听会残留 heatmap.value?.setDataSet({ data: [] }) map.value?.destroy() })逻辑上分三步加载器把地图和插件一起拉下来new AMap.Map建底图new AMap.HeatMap建图层。参数上radius是每个点的模糊半径像素opacity是透明度区间gradient是颜色断点。这里有个容易忽略的点shallowRef而不是ref因为地图实例内部结构很深用ref会把它整个变成响应式代理缩放拖动时性能会明显掉帧这是血泪经验。2.3 数据格式与 setDataSet 的正确调用姿势热力图只认一种数据格式{ lng, lat, count }的数组count是权重不传默认按 1 计。后台返回的往往是{ longitude, latitude, value }这种字段名需要做一层映射。数据量大的时候映射本身也要注意别在渲染主线程里做太重的事。// 把后台原始数据转成热力图需要的格式 function normalize(rawList) { return rawList.map(item ({ lng: Number(item.longitude), lat: Number(item.latitude), count: Number(item.value) || 1 // 权重缺省给 1避免 NaN 导致整层不渲染 })).filter(p !Number.isNaN(p.lng) !Number.isNaN(p.lat)) } // 数据到位后更新不要重新 new 一个热力图 function updateHeatmap(rawList) { const data normalize(rawList) heatmap.value.setDataSet({ data, max: 100 // 可选手动指定权重上限控制颜色映射的饱和点 }) }setDataSet是增量更新入口重复调用不会重建图层这是它比「销毁再 new」高效的地方。max参数很关键如果你不指定它会取当前数据集里的最大值作为颜色映射的顶点导致每次数据一变颜色标准就漂移同一张图前后对比会失真。我一般会按业务经验固定一个max比如单网格点数的 95 分位这样颜色深浅才有可比性。3. 让热力图「好看又能读」radius、gradient 与 max 的调参逻辑热力图调参是玄学重灾区同一份数据参数差一点观感天差地别。核心就三个旋钮radius控制模糊范围gradient控制颜色语义max控制饱和点。下面把每个参数的取值逻辑和联动关系讲清楚。3.1 radius 不是越大越好它和缩放级别的联动关系radius的单位是像素它决定每个点向周围扩散多远。设小了点位之间连不成片看起来还是散点设大了整张图糊成一片热点边界消失。经验值是在 zoom 11 左右的城市级视图下radius取 20 到 30 比较合适如果点位本身很稀疏可以适当加大到 40。但这里有个坑radius是固定像素值不随缩放自动变化。用户从城市级放大到街道级时同样的 25 像素覆盖的地理范围变小了热力图会显得越来越「碎」。常见做法是监听zoomchange事件按缩放级别动态调整 radius// 根据缩放级别动态调整 radius让视觉密度保持稳定 map.value.on(zoomchange, () { const zoom map.value.getZoom() // zoom 越大地理范围越小radius 相应调小 const dynamicRadius Math.max(12, 40 - (zoom - 10) * 4) heatmap.value.setOptions({ radius: dynamicRadius }) })这段逻辑的意思是以 zoom 10 为基准每放大一级 radius 减 4 像素下限 12 像素防止太小。setOptions是热力图更新配置的接口改 radius 不需要重建图层。具体系数要按你的数据密度试没有万能值但「缩放越大半径越小」这个方向是确定的。3.2 gradient 颜色断点怎么配才符合直觉gradient是一个对象键是 0 到 1 的归一化权重值是颜色。它的语义是「权重达到这个比例时显示什么颜色」。默认配置往往偏冷业务上通常希望「越热越红」。一个符合直觉的配置是低权重蓝、中权重黄绿、高权重红断点颜色语义0.2#3288bd稀疏区冷色打底0.5#66c2a5过渡区青绿0.7#fee08b次密集区暖黄0.9#f46d43密集区橙红1.0#d53e4f核心热点正红配置时要注意两点一是断点必须覆盖到 1.0否则最高权重区域可能没有颜色二是断点之间的间距不要拉得太开否则颜色过渡会出现明显的色带断层看起来像贴了几块色卡。我一般会保证相邻断点间隔不超过 0.2。3.3 max 与 opacity 的配合解决「一片红」和「看不见」两个极端max决定哪个权重值对应颜色断点的 1.0。如果max设得比实际最大权重还小那所有超过它的点都会被压成最红整张图一片红失去层次如果max设得太大所有点都挤在低权重区整张图偏蓝看不出热点。正确做法是先统计数据的权重分布取一个略高于 90 分位的值。opacity是[最小值, 最大值]的数组控制图层整体透明度。它和max是配合关系当底图信息很重要比如要看清路网时把 opacity 上限压到 0.6 左右让热力图半透明叠加当热力图是主角时可以到 0.8 甚至 0.9。注意 opacity 下限一般设 0让稀疏区完全透明避免整张图蒙一层灰。// 按数据分布自动估算 max避免颜色标准漂移 function estimateMax(data) { const counts data.map(d d.count).sort((a, b) a - b) const idx Math.floor(counts.length * 0.9) // 取 90 分位 return counts[idx] || 1 } heatmap.value.setOptions({ max: estimateMax(data), opacity: [0, 0.75] })这段代码先排序再取 90 分位作为max能有效避免个别极端大值把整体颜色拉爆。setOptions同时改 max 和 opacity 是允许的一次调用完成。4. 数据量上到几万条之后性能、聚合与降级的实战处理热力图在几千点位时很轻松但数据量上到几万甚至十几万问题就来了页面卡顿、拖动掉帧、首次渲染要等好几秒。这一章讲怎么在 Vue 里把大数据量的热力图跑顺。4.1 为什么几万点位会卡从 setDataSet 的内部开销说起setDataSet每次调用都会触发一次完整的网格重算和重绘。如果你在数据流里频繁调用它比如 WebSocket 每来一条就更新一次主线程会被反复占用。卡顿的根源通常不是热力图本身算得慢而是调用太频繁加上数据没做预处理。解决思路有两个方向一是减少调用频率用防抖把多次更新合并成一次二是减少单次数据量在服务端或前端先做网格聚合把「一万个原始点」压成「几百个网格中心点 权重」。后者对性能提升最明显因为热力图本来就是在做密度统计你提前聚合不会损失太多视觉信息。4.2 前端网格聚合把一万个点压成几百个网格聚合的逻辑是按一个固定的经纬度步长把地图切成格子落在同一格的点合并成一个权重累加。步长越小越精确越大越省性能。城市级视图下0.01 度左右的步长约 1 公里通常够用。// 按经纬度网格聚合点位降低 setDataSet 的数据量 function gridAggregate(points, step 0.01) { const grid new Map() for (const p of points) { // 用步长取整作为网格 key const key ${Math.floor(p.lng / step)}_${Math.floor(p.lat / step)} if (grid.has(key)) { grid.get(key).count p.count } else { grid.set(key, { lng: p.lng, lat: p.lat, count: p.count }) } } return Array.from(grid.values()) } // 使用先聚合再喂给热力图 const aggregated gridAggregate(normalize(rawList), 0.01) heatmap.value.setDataSet({ data: aggregated, max: estimateMax(aggregated) })step是核心参数它直接决定聚合后的数据量。0.01 度在纬度方向约 1.1 公里经度方向随纬度变化。如果你的点位集中在很小的区域step 要相应调小否则所有点会被聚成一个热力图就变成一个孤零零的色块。判断标准是聚合后数据量控制在原始数据的 5% 到 20% 之间比较理想。4.3 用防抖合并高频更新避免拖动时反复重绘即使做了聚合如果数据更新很频繁还是要加一层防抖。Vue 里可以用一个简单的定时器实现也可以用现成的工具函数。关键是保证「最后一次更新一定生效」别把尾调用丢了。// 简易防抖300ms 内的多次更新只执行最后一次 let timer null function debouncedUpdate(rawList) { clearTimeout(timer) timer setTimeout(() { const data gridAggregate(normalize(rawList), 0.01) heatmap.value.setDataSet({ data, max: estimateMax(data) }) }, 300) }300ms 是个经验值太短起不到合并效果太长会让用户觉得数据「反应慢」。如果数据是用户主动触发的比如点了筛选按钮就不该防抖要立即更新否则交互会显得迟钝。区分「高频流式更新」和「用户主动操作」这两类场景是性能优化的前提。5. 避坑与排查热力图不显示、颜色不对、缩放错位的常见原因这一章是我在实际项目里踩过的坑按「现象 → 原因 → 解决」整理遇到问题可以对照排查。5.1 地图出来了但热力图完全不显示现象底图正常控制台没有明显报错但热力图区域一片空白。原因通常是三个之一插件没在plugins里声明导致AMap.HeatMap为 undefined数据里lng/lat是字符串或 NaN 导致投影失败max设成了 0 或负数导致颜色映射异常。解决先在控制台打印typeof AMap.HeatMap确认是 function再检查数据里有没有Number()转换最后确认max是正数。我一般会在setDataSet前加一行console.log(data.length, data[0])一眼就能看出数据对不对。5.2 颜色全红或全蓝没有层次现象整张图要么一片红要么一片蓝看不出密度差异。原因基本是max没设对。全红说明max太小所有点权重都超过饱和点全蓝说明max太大所有点都挤在低权重区。解决用前面estimateMax的思路按分位数动态算max或者手动打印一下权重的最大值和平均值把max设在两者之间偏上的位置。注意max是随数据集变化的别写死一个常量。5.3 缩放后热力图和底图对不上、色块漂移现象拖动或缩放地图后热力图的色块位置和实际点位对不上或者色块明显滞后。原因通常是热力图实例被 Vue 的响应式系统代理了导致内部状态更新异常也可能是你在zoomchange里改 radius 太频繁重绘跟不上。解决地图和热力图实例一律用shallowRef或普通变量存不要用refzoomchange里的setOptions加一层节流比如 100ms 一次别每帧都调。5.4 组件切换后内存泄漏、地图残留现象在单页应用里来回切换路由切几次之后页面变卡或者旧地图的 DOM 还残留在页面上。原因是地图实例没销毁事件监听没解绑。解决在onUnmounted里先heatmap.setDataSet({ data: [] })清空数据再map.destroy()销毁地图同时把zoomchange等事件监听一并移除。Vue 3 的onUnmounted是唯一可靠的清理时机别指望组件卸载后 GC 自动回收地图实例持有大量 DOM 和 WebGL 上下文不手动销毁一定会泄漏。5.5 移动端触摸拖动时热力图闪烁现象在手机上拖动地图热力图会闪一下或者短暂消失。原因是移动端触摸事件触发频率高zoomchange和moveend里如果做了重计算会和渲染抢主线程。解决把 radius 动态调整的逻辑从zoomchange挪到moveend或zoomend只在操作结束后算一次同时把聚合和setDataSet放到requestAnimationFrame里让浏览器在下一帧统一处理。6. 进阶用 3D 热力图和权重字段做出更有信息量的密度图基础热力图只按点数着色但业务上经常需要「按某个指标加权」比如不同点位的订单金额不同你希望金额高的区域更红。这时候有两个方向一是用count字段直接传加权值前面已经用过二是开启AMap.HeatMap的 3D 模式让高度也参与表达。3D 模式的关键参数是height和3D开关。开启后热力图会以柱状高度表现权重视觉冲击力更强但性能开销也更大数据量建议控制在两万以内。配置方式是在初始化时加3D: { height: 50 }或者用setOptions动态切换。要注意 3D 模式下radius的语义会变模糊范围和高度的配合需要重新调我一般会把 radius 调小一点让柱体更清晰。另一个进阶技巧是「分层热力图」把不同类别的点位拆成多个热力图实例用不同的 gradient 叠加比如一类用蓝绿系、一类用红黄系这样能在一张图上同时看出两类数据的分布和重叠区域。代价是每个实例都要单独维护数据和生命周期代码复杂度上升适合类别少两到三类且重叠分析有明确业务价值的场景。验证热力图效果好不好我的习惯是拿同一份数据在三个缩放级别各截一张图对比热点位置是否一致、颜色层次是否稳定。如果某个级别下热点「跳」到了别的位置多半是 radius 或 max 没调好。这个自检动作花不了几分钟但能挡掉大部分上线后才发现的问题。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

BarTender条码标签打印实战:Seagull驱动与数据库序列打印指南

BarTender条码标签打印实战:Seagull驱动与数据库序列打印指南

简介:BarTender 使用说明书.doc 围绕条码标签设计与打印软件 BarTender,系统介绍了 Seagull 打印机驱动的优势、内嵌字体与 Windows 字体对比、字体下载方法,以及类 Windows 友好界面操作、自定义工具箱、图像导出、背景和口令设置等基础功能…

2026/10/17 12:06:40 阅读更多 →
Altium Designer官方60天试用申请流程与PCB设计实战体验

Altium Designer官方60天试用申请流程与PCB设计实战体验

最近圈子里不少人都在聊Altium官方放出的"全新产品免费试用60天、注册即享"这个活动。很多做硬件设计的朋友问我:这个试用值不值得申请,申请流程麻不麻烦,试用期内能用到什么功能,和正版授权有什么区别。我正好这段时间…

2026/10/17 12:05:40 阅读更多 →
ThingsBoard-GateWay Modbus串口接入实战:modbus.json配置与排错指南

ThingsBoard-GateWay Modbus串口接入实战:modbus.json配置与排错指南

如果你正手拿一台带串口的工业设备,准备把它上面的Modbus RTU数据接到ThingsBoard平台,那么在ThingsBoard-GateWay上配置modbus串口总线,几乎是你绕不开的一步。我前前后后给好几组现场设备做过这类接入,最深的感受是:…

2026/10/17 12:05:40 阅读更多 →

最新新闻

Visual Studio Debug/Release 自动切换库路径与DLL拷贝方案

Visual Studio Debug/Release 自动切换库路径与DLL拷贝方案

1. 这个需求到底在解决什么问题做过Windows平台C开发的人,大概率都遇到过这样一个场景:你写了一个基础库,编译出来两个版本——Debug版和Release版,分别放在Debug/和Release/两个目录下。然后你有一个上层应用工程,开发…

2026/10/17 13:13:21 阅读更多 →
电商数仓实战:从数据分层到核心指标计算全解析

电商数仓实战:从数据分层到核心指标计算全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:13:21 阅读更多 →
牛顿法全解析:从切线逼近到二阶收敛的工程实践

牛顿法全解析:从切线逼近到二阶收敛的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:13:21 阅读更多 →
Linux下NAT配置全解析:从原理到iptables实战与排错

Linux下NAT配置全解析:从原理到iptables实战与排错

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:13:21 阅读更多 →
JavaWeb核心原理与实战笔记:Servlet、会话管理与过滤器详解

JavaWeb核心原理与实战笔记:Servlet、会话管理与过滤器详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:13:21 阅读更多 →
MediaPipe Pose+OpenCV实时健身动作评估系统

MediaPipe Pose+OpenCV实时健身动作评估系统

1. 这不是“加个滤镜”的AR,而是一套能实时纠正你深蹲姿势的视觉教练最近在某高校实验室带一个跨平台体感交互项目时,团队里三位刚接触计算机视觉的同学反复问同一个问题:“MediaPipe Pose到底能不能用在真实健身场景里?它和OpenC…

2026/10/17 13:12:21 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →