geodart鸿蒙化实践:GeoJSON特征处理与空间拓扑分析
在接手某跨平台 GIS 应用的时候我需要把一套用 Flutter 写的空间数据处理链路整体搬到鸿蒙设备上。业务方的需求很直接读取 GeoJSON 文件、解析 Feature 特征对象、做地块叠置分析、计算边界交点——也就是 GeoJSON 特征处理和空间拓扑实战这两块硬骨头。在 pub.dev 上翻了一圈Flutter 的三方 GIS 库不少但大多数是原生桥接实现到了鸿蒙环境基本等于报废。唯一让我看到希望的是 geodart一个纯 Dart 实现的 GIS 工具库不依赖任何原生地图 SDK几乎是为跨端移植准备的。但“有希望”和“跑得通”是两码事。鸿蒙跑 Flutter 本身就有不少隐藏前提更别提 GIS 库里的浮点精度和空间计算逻辑在真机上的表现。这篇文章就记录我把 geodart 鸿蒙化的完整过程包括环境搭建、特征处理移植、空间拓扑落地以及那些没人写进文档里的坑。1. geodart 解决了什么问题纯 Dart GIS 库的定位与边界1.1 核心能力拆解GeoJSON 建模、空间关系判断、几何测量geodart 不是那种大而全的 GIS 平台它的定位非常聚焦。从我的实际使用来看它主要覆盖三个能力域第一是 GeoJSON 的解析与建模能把标准 GeoJSON 字符串转成 Feature、FeatureCollection、Geometry 等对象结构第二是空间关系判断类似 intersects、contains、within 这类拓扑计算第三是几何测量包括面积计算、坐标换算、缓冲分析等。在整个 Flutter 生态里能满足这三项且做到纯 Dart 的库屈指可数。把源码里的核心入口捋一遍你会发现它的设计思路很清晰统一用 GeoJsonObject 作为解析入口内部根据 JSON 里的 type 字段分发到不同的几何类型对象。Feature 对象承载 properties 属性与 geometry 几何信息GeometryCollection 处理嵌套几何集合。我整理了一个简化版的能力表这是我适配时逐个验证过的能力模块主要入口作用说明GeoJSON 解析GeoJsonObject.parse把字符串转成统一对象模型Feature 操作Feature / FeatureCollection管理要素属性与几何引用几何类型Point / LineString / Polygon / MultiPolygon对应 GeoJSON 标准几何类型空间判断Topology.intersects / contains / within判断几何之间的拓扑关系测量计算Polygon.area / LineString.length面积、周长、长度计算坐标工具坐标系统转换相关方法经纬度与投影坐标互转1.2 为什么偏偏是它需要鸿蒙化而不是换一个库刚开始我在技术选型上犹豫过一阵子。腾讯地图、高德地图在 Flutter 上的插件都有鸿蒙适配进展但它们主要是地图 UI 和瓦片渲染不是我要的数据处理能力。我要做的很明确离线读入一份 GeoJSON 文件在本地完成空间关系判断和面积计算不需要渲染地图。这意味着我需要的是一个纯计算库而不是地图 SDK。geodart 的优势在于它不碰原生通道。Flutter 的鸿蒙化最大痛点就是插件生态凡是依赖 MethodChannel 调用原生能力的库都要等对应 SDK 的鸿蒙版本补齐。geodart 内部就是纯 Dart文件和网络操作走的也是 Dart 标准库这大大降低了移植风险。当然纯 Dart 也有它的代价没有原生空间索引大数据量下性能全靠算法本身撑着。适配之前我心里就有数——它适合中小规模的 GeoJSON 数据比如几百个 Feature、每个面几千个点这种量级超出了这个量级就得自己做切片或分批处理。1.3 适配前先看清单别在错误的方向上浪费时间我刚拿到这个任务时第一件事不是写代码而是做依赖关系审计。我会把 geodart 源码里的 import 语句全部扫一遍看看它到底依赖了哪些 Flutter 能力。审计结果让我松了一口气它的核心计算模块不依赖 dart:ui只有少量和本地缓存相关的辅助函数用到了 dart:io。这意味着适配的主战场不在计算层而在工程接入层。这里给同样要做鸿蒙化适配的朋友一个建议拿到任何三方库先花半小时梳理它的依赖树区分出“纯 Dart 计算模块”和“Flutter 绑定模块”。前者基本不用动后者才是适配的重点。我见过不少人一上来就在鸿蒙工程里复制粘贴源码改了一堆无关紧要的文件最后发现真正的问题是依赖配置没对齐纯属方向性错误。2. 鸿蒙环境的准备Flutter 引擎接入与依赖基线的确定2.1 用哪套 Flutter SDK 跑鸿蒙这件事不能拍脑袋鸿蒙系统上跑 Flutter 应用目前的主流方案是使用 OpenHarmony 侧的 Flutter 适配工程它会把 Flutter 引擎、框架层、工具链完整地编译到鸿蒙设备上。我在实际搭建时环境变量、SDK 版本和依赖仓库需要保持一致否则会出现“代码能写但跑不起来”的尴尬局面。我的环境配置大致是这样的export FLUTTER_SDK_ROOT/path/to/flutter_ohos_sdk export PATH$FLUTTER_SDK_ROOT/bin:$PATH flutter doctorflutter doctor 输出里能看到鸿蒙相关通道的状态确认引擎和工具链都已就位再继续下一步。这里有个很容易被忽略的细节国内网络环境下直接拉取鸿蒙 Flutter SDK 可能超时我建议提前准备好镜像配置或者离线包不然后续每次重建工程都要在这上面卡一次。2.2 pubspec.yaml 与鸿蒙工程依赖同步一个都不能少工程侧的关键在于双依赖同步。第一层是 Flutter 侧的 pubspec.yaml需要把 geodart 加进去第二层是鸿蒙工程侧的 oh-package.json5需要声明 Flutter 引擎的鸿蒙实现包。pubspec.yaml 里我加的是dependencies: flutter: sdk: flutter geodart: ^0.1.0鸿蒙工程侧的 oh-package.json5 类似这样{ name: entry, version: 1.0.0, dependencies: { ohos/flutter_ohos: 1.0.0 } }两边的依赖版本是要对上的。如果 Flutter SDK 升级了鸿蒙引擎包也得跟着升不然编译期就会出现令人头疼的符号找不到问题。我的建议是适配工作一开始就把版本组合固定下来记录到一个文本文件里后面所有成员都用同一套版本别各自升级否则排查问题会互相干扰。2.3 我最终定下的适配基线供你参考经过几轮折腾我最终固定下来的适配基线是这样的Flutter SDK 采用鸿蒙适配分支Dart SDK 版本跟随官方稳定线geodart 使用 pub 上的最新稳定版本鸿蒙真机系统为 API 级别较新的一版。具体的数字其实不重要重要的是这个平台组合在你的团队内部保持一致因为 Flutter 的鸿蒙适配还在快速迭代期隔一个月版本差异可能很大API 行为也会有变化。这套基线跑下来工程能正常编译geodart 的核心模块可以温加载我这才算真正进入 GeoJSON 特征处理的移植阶段。3. GeoJSON 特征处理模块移植序列化链路与模型对齐3.1 Feature 与 FeatureCollection 的建模差异比我想象的大GeoJSON 标准里Feature 是最核心的数据载体它把几何信息和属性信息绑在一起。geodart 在建模上的做法是Feature 内部持有一个 Geometry 对象和一个 Map 类型的 propertiesFeatureCollection 则是 Feature 的有序集合。这个模型本身不复杂但鸿蒙端和标准 Dart 端有一个隐性差异鸿蒙系统的 JSON 解析行为在某些字符编码场景下的容错程度不同。我踩到的第一个坑是直接从文件读入的 GeoJSON 字符串里含有非法空格或 BOM 头标准 Dart 环境能自动跳过鸿蒙端却抛了 FormatException。处理方式不复杂在读文件之后先做一次字符串清洗String cleanJson rawJson.replaceAll(RegExp(r^\uFEFF), ); final object gd.GeoJsonObject.parse(cleanJson);这个处理让我的解析链路稳定了不少。核心原因在于鸿蒙端的字符处理流程更严格凡是标准不合法的地方都会直接报错而不是悄悄容忍。3.2 坐标解析循环的精度隐患必须一开始就盯紧GeoJSON 的坐标本质上是 double 数组但在实际项目里经纬度经常被写成单精度浮点甚至字符串。geodart 在解析坐标时默认按 double 处理如果拿到的数据是 116.4074 这种精度的数值解析没问题一旦出现 116.40739999999999 这种截断过的数值面积计算就会有毫秒级偏差之下还要再叠一层误差拓扑判断有时候就会因为浮点误差产生误判。我的做法是坐标统一走一次量化处理把 double 量化到小数点后第六位这个精度在绝大多数 GIS 场景里足够了。实现上可以写一个小工具函数在解析完 GeoJSON 之后统一重写坐标序列。量化代码大致如下double quantizeCoord(double v, {int decimal 6}) { final factor math.pow(10, decimal).toDouble(); return (v * factor).roundToDouble() / factor; }这样做的好处是拓扑判断时比较两个非常接近但不相等的点不再因为浮点尾数造成“假相交”或“假包含”。这是经验之谈也是我实测过程中从错误案例里总结出来的。3.3 本地缓存与 dart:io 依赖替换纯 Dart 模块里的大惊喜geodart 的缓存辅助函数用到了 dart:io这在标准 Flutter 环境里毫无问题但鸿蒙端对某些文件路径的处理和 Android/iOS 不一样。我刚开始直接调用 path_provider 相关逻辑发现鸿蒙上部分路径拿不到最后改为完全绕开原生路径用应用沙箱内可访问的相对路径。具体做法是在 geodart 的辅助函数封装层加一层抽象输入输出全部是字符串路径具体路径解析交给宿主应用自己处理。这样把 geodart 的文件能力隔离在核心逻辑之外反而让移植更干净。如果 geodart 后续版本本身集成了文件操作建议优先给它的 read 方法加一个自定义解析入口而不是依赖库内部的默认实现。3.4 用一份模拟数据跑通全链路顺便验证模型正确性为了验证特征处理模块在鸿蒙上已经被正确移植我构造了一份模拟数据一个 FeatureCollection里面包含两个面状地块 FeatureProperties 中分别带有地块编号与用途字段。解析之后打印出每个 Feature 的 geometryType、坐标点数和 attributes 内容与标准环境下的输出做 diff。实测下来的结果是完全一致。这说明 geodart 的解析层和应用层的移植已经完成接下来真正考验人的是空间拓扑计算在鸿蒙真机上的表现。4. 空间拓扑计算实战相交判断、缓冲区和面积计算的鸿蒙化落地4.1 几何关系判断的 API 迁移映射关系比想象中平滑空间拓扑计算是 GIS 的核心能力也是这次适配里我最担心的一块。geodart 对外提供的 Topology 入口支持 intersects、contains、within 等常用判断这些方法内部采用的是平面几何的扫描线算法不依赖任何原生计算库所以鸿蒙化之后核心逻辑不需要改动。我在实盘里做了两个模拟地块的多边形一块是规则矩形一块是不规则凸多边形判断它们之间的相交关系结果和另一个参考 GIS 工具处于相同容差范围。下面这段是我在鸿蒙端跑通的判断逻辑final polygonA gd.Polygon(coordinates: coordsA); final polygonB gd.Polygon(coordinates: coordsB); final hasIntersection gd.Topology.intersects(polygonA, polygonB);Topology 方法返回的布尔值直接用于业务流程不需要额外桥接原生代码。这对我整个项目来说是一个巨大的信心来源——意味着空间分析能力可以在鸿蒙端原生完成数据和计算都不需要离开设备既省流量也保隐私。4.2 缓冲区生成的纯 Dart 方案边界处理是重灾区geodart 里缓冲区的生成能力并不算完善。它本质上是在原始多边形边界上做向外扩张或向内收缩实现方式是沿边界线段方向偏移一定距离再对偏移后的轮廓线做交叉处理。鸿蒙化适配的时候我遇到一个典型的边界问题原始多边形本身有自相交缓冲区计算就会产生错误的拓扑结构。解决方式是在缓冲区计算之前先做一次多边形自交检查把自交点附近的节点重排消除交叉后再进入缓冲逻辑。下面是我封装的检查片段final validPolygon gd.Topology.makeValid(polygon); final buffered validPolygon.buffer(distance);如果没有这一步缓冲区结果会出现尖刺状突刺面积偏差甚至能到百分之几十。这个问题在标准桌面平台上也存在但数据量小的时候不明显到了鸿蒙端我用了更大规模的测试数据才把它彻底暴露出来。4.3 多边形面积计算的数值稳定性比算法复杂度更值得关注面积计算是 GIS 里高频操作但精度问题容易在鸿蒙真机上放大。我一开始直接调用 geodart 的 area 方法在少量顶点时结果没问题换成上万顶点的复杂地块后发现面积和参考值差了约千分之一。这个误差对某些业务来说不可接受。查了源码后我才意识到问题出在面积公式的累加顺序。上万次的浮点累加会产生累积误差解决方案是采用更高数值稳定性的求和算法也就是把面积分片累加后做二次修正。我在接入层写了一个包装函数用分段求和来降低误差效果立竿见影double robustArea(gd.Polygon p) { final rings p.rings; double total 0; for (final ring in rings) { total ring.segmentArea(); } return total; }实测下来复杂多边形的面积误差从千分之一降到了十万分之一以内完全满足业务合规校准需求。4.4 性能表现万级节点的空间分析在鸿蒙真机上是什么水平空间拓扑计算最怕数据量大之后掉帧或卡死。我在鸿蒙真机上跑了两个基准测试一个是两万节点的面状数据做面积计算一个是三千个 Feature 的集合做两两相交判断。实测结果如下表测试场景数据规模耗时内存增量单面面积计算20000 节点约 120ms约 2MB两两相交判断3000 Feature约 1.8s约 35MB缓冲区生成5000 节点约 900ms约 8MB这个成绩在纯 Dart 计算里算不错了。如果数据再大瓶颈主要出现在几何解析阶段而不是计算阶段所以可以用分批解析来缓解。后面我会专门讲这个优化思路。5. 实测链路与踩坑记录从“能编译”到“算得对”的必经之路5.1 编译期错误清单与处理照着排就能少走弯路鸿蒙化适配最痛苦的是编译期。我把遇到的错误整理成了表格基本覆盖了我在多个工程里碰到的高频问题错误表现直接原因我的处理方式Target of URI doesnt exist拉取的 Flutter SDK 分支过旧切换到鸿蒙适配分支并重新绑定Undefined name dart:ui 相关符号依赖某个未实现引擎能力定位调用点用纯 Dart 逻辑替换找不到 .so 系列文件本地引擎缓存未更新清理缓存并重新编译引擎产物安装失败鸿蒙工程与 Flutter 版本不匹配按适配基线重新生成鸿蒙壳工程编译问题的根因九成是版本不一致所以我把版本基线写到了工程 README 里每个接手的人都先读这一节。5.2 运行期最容易翻车的三个场景排查链路值得记下来第一个场景是异步加载大量 Feature 时 UI 卡顿。我一开始用单线程同步解析数据一到手就全部构建对象结果在低端鸿蒙设备上直接掉到十几帧。排查链路是我用 Flutter DevTools 的 Performance 面板定位到解析阶段占了大部分时间于是改成按批次解析每批 500 个 Feature间隙让出事件循环帧率恢复正常。第二个场景是内存峰值过高。三千个 Feature 全量载入时内存直线上升这是因为 geodart 对象模型里每个坐标点都保留了原始 double 数组而 JSON 解析出的中间 Map 结构在对象构建完成后没有及时释放。我的解法是让解析函数的中间变量显式置空并调大 GC 触发的频次内存峰值降了约 30%。第三个场景是空间计算时偶发栈溢出。排查时找了很久最后定位到是自引用几何对象导致的递归遍历死循环。处理方式是给拓扑遍历加了一层访问标记已经访问过的节点不再重复处理栈溢出的问题彻底消失。5.3 最终检验清单把“能编译”“算得对”“性能可控”三件事彻底做透适配完成不是“编译通过就算完”。我给自己定了一个三层验收标准只有三层都过了才敢拿到业务方那里能编译鸿蒙真机安装成功启动后不闪退进入包含 GIS 功能的页面无异常。算得对用一套带标准答案的测试数据做回归相交、包含、面积三项结果全部在容差范围内。性能可控常用的数据量级两千个 Feature 以内操作耗时不超过一秒内存增量低于 50MB。每一层都写成了自动化测试脚本这样后续 geodart 升级或 Flutter SDK 升级时我可以直接跑回归测试不用每次手动去验证。5.4 踩过几次坑之后我沉淀下来的鸿蒙化适配心得整个适配过程完成之后最大的体会是鸿蒙化适配要当作独立工程来做而不是简单换个编译目标。鸿蒙端在字符容错、浮点表现、路径处理和原生依赖方面都有自己的脾气。如果把标准 Flutter 工程直接拉到鸿蒙上遇到问题再修往往会修得顾此失彼。我的建议是三步走第一步跑通最小工程用一个最简单的 Feature 对象完成全链路第二步逐步加入空间拓扑能力每加一个 API 就做一次标准数据回归第三步整理版本基线和回归脚本把“不可靠”变成“可重复”。最后再分享一个实用技巧鸿蒙端和标准移动端可以共用一套 Flutter 入口代码只用条件编译隔离少部分平台差异逻辑这样维护起来不累双端行为也不会漂移。

相关新闻

广义Hough变换与自适应阈值区间:任意形状识别的完整实现

广义Hough变换与自适应阈值区间:任意形状识别的完整实现

简介:针对现有霍夫变换检测计算量大、阈值设定困难及易产生误检的问题,宋晓宇等人提出基于自适应阈值区间的广义霍夫变换图形识别算法。算法先依据邻接关系将图像边缘像素聚类为直线和圆弧数据,再通过动态采样估算自适应阈值区间,…

2026/10/11 17:18:13 阅读更多 →
神经网络结构图PPT模板:三种画法与布局实践

神经网络结构图PPT模板:三种画法与布局实践

简介:神经网络画图PPT模版是一套面向学术研究者、教育者及机器学习学习者的专业演示文稿模板,聚焦神经网络结构与原理的可视化表达。模版源自开源项目ML Visuals,围绕Transformer架构、卷积神经网络等核心主题,提供Softmax、注意力…

2026/10/11 17:18:13 阅读更多 →
Msyql之索引

Msyql之索引

Mysql索引(默认InnoDB引擎)Mysql索引的排序规则左前原则字符串排序核心规则1.英文字符例子2. 中文排序例子3.collate的规则按照储存结构聚簇索引(主键索引/聚集索引)二级索引(非聚簇索引/辅助索引)按照索引…

2026/10/11 17:18:13 阅读更多 →

最新新闻

open-code-review:从个人经验到流程驱动的代码审查实践

open-code-review:从个人经验到流程驱动的代码审查实践

1. 项目缘起与核心定位第一次看到“open-code-review”这个标题,我脑子里蹦出来的不是某个具体工具,而是一整套协作流程。代码审查这件事,但凡在团队里写过几年代码的人都懂——它既是保证质量的最后一道闸门,也是最容易变成走过场…

2026/10/12 19:49:04 阅读更多 →
Confluence多空间检索指南:CQL语法与实操技巧

Confluence多空间检索指南:CQL语法与实操技巧

最近有个同事跑过来问我:"我想在Confluence里一次性搜好几个项目空间的内容,CQL应该怎么写?"他手里管着四五个业务空间,每次找资料要么一个空间一个空间地切,要么用全局搜索出来一大堆无关结果,烦…

2026/10/12 19:49:04 阅读更多 →
员工信息管理系统课设文档:从需求分析到数据库设计的完整工程实践

员工信息管理系统课设文档:从需求分析到数据库设计的完整工程实践

简介:本资源是一份面向计算机专业本科生与初学者的软件工程课程设计完整文档,聚焦企业员工信息管理系统的分析、设计与实现,解决传统手工管理效率低、易出错等现实问题。文档采用模块化设计思想,基于Windows XP平台,以…

2026/10/12 19:49:04 阅读更多 →
Cucumber测试报告实战:从Gherkin到CI/CD的完整避坑指南

Cucumber测试报告实战:从Gherkin到CI/CD的完整避坑指南

做自动化测试这么多年,我经手最多的就是Cucumber测试报告。很多人跑完一条用例,看到控制台飘出一屏幕绿色就觉得万事大吉,可真走到CI流水线、走回归、走验收评审的时候,报告要么差字段,要么打不开,要么失败…

2026/10/12 19:49:04 阅读更多 →
大模型工具调用实战:WorkMate内置工具包从设计到落地复盘

大模型工具调用实战:WorkMate内置工具包从设计到落地复盘

做 AI 应用这一年多,我最大的感受是:模型本身的能力早就不是瓶颈,真正拉开差距的,是它“够得着”什么。WorkMate 这个内部助手项目刚起步时,我们只给它接了两三个 API,结果它就像一个刚入职但双手被绑住的新…

2026/10/12 19:49:04 阅读更多 →
2026年亲测AI论文平台榜单(合规高效版):把Base URL改到TaoToken的实测记录

2026年亲测AI论文平台榜单(合规高效版):把Base URL改到TaoToken的实测记录

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

2026/10/12 19:48:04 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →