gis-view-webgl2 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +17 -14
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.d.ts +252 -37
  4. package/dist/index.js +1 -1
  5. package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +79 -0
  6. package/docs/GisView.md +53 -53
  7. package/docs/ai/06-/344/274/232/350/257/235/347/264/242/345/274/225/344/270/216/345/244/215/346/237/245/346/226/271/346/263/225.md +66 -0
  8. package/docs/api/index.html +22 -8
  9. package/docs/demos/ApiCoverageDemo.vue +1 -1
  10. package/docs/demos/ConnectDemo.vue +114 -3
  11. package/docs/demos/ExtensionDemo.vue +69 -12
  12. package/docs/demos/MinimapDemo.vue +62 -16
  13. package/docs/demos/SearchFilterDemo.vue +13 -11
  14. package/docs/demos/api-index.js +26 -21
  15. package/docs/demos/demos.js +1 -1
  16. package/docs/demos/gis-view-demo/GisViewDemoCardHeader.vue +1 -0
  17. package/docs/demos/gis-view-demo/GisViewDemoStage.vue +25 -16
  18. package/docs/demos/gis-view-demo/panels/OpsPanels.vue +2 -2
  19. package/docs/demos/gis-view-demo/useGisViewDemo.js +36 -25
  20. package/docs/index.html +41 -4
  21. package/docs/internals/13-/351/271/260/347/234/274/345/233/276.md +6 -5
  22. package/docs/internals/16-01-/344/274/230/345/214/226/344/270/216/345/217/226/350/210/215-/344/270/212.md +5 -3
  23. package/docs/internals/18-/346/200/247/350/203/275/345/256/236/346/265/213/344/270/216WebGPU/350/257/204/344/274/260.md +12 -0
  24. package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +29 -6
  25. package/docs/manual/04-/344/272/213/344/273/266/344/270/216/345/233/236/350/260/203.md +7 -6
  26. package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +24 -3
  27. package/docs/manual/09-/351/200/232/351/201/223/344/270/216/345/244/232/345/233/236/347/272/277.md +1 -1
  28. package/docs/manual/10-/351/200/232/351/201/223/347/274/226/350/276/221/344/270/216/346/226/260/345/242/236.md +423 -3
  29. package/docs/manual/14-/350/247/206/345/233/276/344/270/216/347/255/233/351/200/211.md +169 -62
  30. package/docs/manual/15-/345/257/274/345/207/272/344/270/216/351/233/206/346/210/220.md +32 -3
  31. package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +12 -8
  32. package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +13 -9
  33. package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +156 -12
  34. package/docs/manual/19-/350/257/273/346/225/260/344/270/216/346/213/226/346/213/275/351/242/204/350/247/210.md +3 -3
  35. package/docs/manual/21-/350/257/264/346/230/216/344/270/216/345/270/270/350/247/201/351/227/256/351/242/230.md +11 -5
  36. package/docs/steps/README.md +8 -8
  37. package/docs/steps/selftest-demos.html +173 -12
  38. package/docs/steps/selftest-docs.html +33 -4
  39. package/docs/steps/selftest-features.html +91 -10
  40. package/docs/steps/selftest-full.html +315 -12
  41. package/docs/steps/selftest-perf.html +39 -1
  42. package/docs/steps/selftest-scale.html +98 -0
  43. package/docs/steps/selftest-select.html +90 -0
  44. package/package.json +1 -1
@@ -330,3 +330,82 @@
330
330
  - **性能优化**:`measurePointSpacing()` 去掉并列距离时的中点距离比较,减少规则网格下的重复计算;`reflowChannelWidths()` 为单组通道增加宽度未变时的快路径,直接跳过车道布局与回线路径重建,多组通道仍走完整重排。10 万点微基准由 **34.933 ms** 降至 **27.572 ms**,约提升 **21%**。
331
331
  - **核心文件**:`src/gis-view/utils.js`、`src/gis-view/engine.js`、`docs/demos/ApiCoverageDemo.vue`、`docs/demos/demos.js`、`docs/demos/gis-view-demo/panels/ViewPanels.vue`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`docs/manual/03` / `07` / `08` / `09` / `14` / `16` / `17` / `18`、`docs/steps/selftest-demos.html`、`docs/steps/selftest-scale.html`、`docs/steps/README.md`、`docs/internals/16-03-优化与取舍-下.md`、根 `README.md` 与 `docs/demos/api-index.js`(生成物)。
332
332
  - **验证**:`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(实例成员 **253**、options **95**、数据字段 **249**)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过;14 个自测页共 **2225 条通过 / 0 失败**,其中 `selftest-demos.html` **333 PASS / 0 FAIL**、`selftest-scale.html` **109 PASS / 0 FAIL / 6 DIAG**。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-22-增量接口能力-demoapi-细节与-fitspacing-中心修正)。
333
+
334
+ ## 2026-10-23 增量(「修改.txt」四条:focusOn 缩放 / 四类搜索 / 筛选选中保留 / 参数说明)
335
+
336
+ 本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `修改.txt`:① 检查 `focusOn` 对线路 / 通道是否仍默认放大,若有则取消;② `search` 增加与 `focusOn` 对应的目标类型;③ 排查筛选为何会取消选中,筛选应只隐藏;④ 把方法与参数说明补细。
337
+
338
+ - **focusOn 缩放核对**:现有四类目标(节点 / 线路 / 通道 / 分组)都已解析成真实 `bounds` 后走同一条 `zoomToBounds`,线路与通道没有额外倍率;本轮不改行为,只补自测逐位比较 `focusOn` 与同一份 `bounds` 的 `zoomToBounds` 比例。
339
+ - **四类搜索**:`scope` 新增 `groups`,并接受与 `focusOn` 一致的单数别名 `point` / `line` / `channel` / `group`;省略或写错时四类全搜。结果新增 `groups`,分组命中带 `channelIndex` / `groupId` / `groupIndex` 与轻量 `item`,`bounds` 按整组范围计算,可直接交给 `focusOn` / `selectFeatures`。同步、`searchAsync`、Worker 与结果回填四条路共用同一口径;分组快照随分组范围请求交给 Worker,改过分组后不会用旧快照匹配。
340
+ - **筛选取消选中**:根因是引擎的 `isKeyAlive()` 查 `pointByIndex` / `lineByIndex`,这两个索引只含可见要素,筛选隐藏被误判成删除,整份重排时把选中集清掉。改为查原始 `points` / `lines` 数组后,筛选只隐藏显示、不删数据、不清空选中集;被隐藏的选中项在条件放宽 / 清空后恢复,且不会补发选中变更。要删除仍走 `removePoints` / `removeLines`。
341
+ - **参数与文档**:补齐 `types.d.ts` 的搜索范围 / 分组命中说明与筛选注释,手册 `14` / `16` / `17` / `18` / `21` 写清四类 scope、别名、`result.groups`、分组命中字段、`focusOn` 不额外放大,以及筛选只隐藏;根 `README.md` 与 `src/gis-view/README.md` 同步当前口径。`SearchFilterDemo` 增加分组搜索入口与提示。
342
+ - **核心文件**:`src/gis-view/search.js`、`src/gis-view/search.worker.js`、`src/gis-view/search-runner.js`、`src/gis-view/create.js`、`src/gis-view/engine.js`、`src/gis-view/types.d.ts`、`docs/demos/SearchFilterDemo.vue`、`docs/steps/selftest-features.html`、`docs/steps/selftest-demos.html`、`docs/manual/14` / `16` / `17` / `18` / `21`、根 `README.md`、`src/gis-view/README.md`、`docs/demos/api-index.js`(生成物)、`docs/AI对话汇总.md` 与 `docs/ai/06-会话索引与复查方法.md`。
343
+ - **验证**:`selftest-features.html` **666** 条、`selftest-demos.html` **334** 条、`selftest-docs.html` **130** 条,三页共 **1130** 条通过 / 0 失败;`npx tsc --noEmit`、`node --check`(三个搜索文件)、`npm run check:docs`(253 个实例成员 / 95 个 options / 249 个数据字段)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。公开实例成员、options 与主数据字段计数未变。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-23-增量修改txt四条focuson-缩放--四类搜索--筛选选中保留--参数说明)。
344
+
345
+ ## 2026-10-23 增量(「问题.txt」四条:SVG 描边 / 文档表格 / selectTrigger / 筛选删除)
346
+
347
+ 本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① 导出 SVG 时节点图标异常、只剩纯白;② 文档页面的参数表格渲染错误;③ 选中默认单击、可配置双击选中,并暴露双击事件;④ 筛选可配置为删除或隐藏。
348
+
349
+ - **SVG 节点描边**:根因是 `resolvePointWithBase()` 没把解析出来的 `strokeColor` 放进节点条目,`paintResolvedPoint()` 也没写回 `entry.strokeColor`,SVG 符号里的 `currentStrokeColor` 因此回落成白色。现在两处都带上实际描边色,规则 / 状态样式同样生效,`currentColor` 仍取填充色。
350
+ - **文档参数表格**:`docs/index.html` 的表格 `parseRow()` 改为逐字符扫描,反引号代码段里的 `|` 不再拆列,`\|` 还原成单元格内的普通竖线;修复联合类型(如导出格式的 `'image/png' | 'image/jpeg' | 'svg'`)被拆成多列。自测补了带反引号联合类型的表格夹具。
351
+ - **`selectTrigger`**:新增组件与引擎选项,缺省 `'click'` 保持第一次单击选中;`'dblClick'` 下第一下只发 `onClick`,第二次(320ms / 6px 内)才选中、清空或取反,并同时发 `onClick`(`action.double: true`)与 `onDblClick`。也收 `doubleClick` / `double` 别名;Ctrl / `multiSelect` 在双击模式第二下取反,`onClick.action.type` 为 `toggleSelect`。运行时 `updateOptions({ selectTrigger })` 只走表现快路径并清空上一次点击序列;单击模式的 Ctrl / `multiSelect` 取反保持旧口径,不额外发点击 / 双击事件。
352
+ - **筛选删除**:`filter.mode` 支持 `'hide'`(缺省)/ `'remove'`。`remove` 按筛选结果先删线路、再删节点,无 id 线路用删除前下标;删除集合就是筛选结果,不再按 `lineFollowsNode` 二次扩圈。中间 `removePoints` / `removeLines` 数据变更与 `onFilter` 被抑制,只发一条 `dataChange('filterRemove')` 和最终一次 `onFilter`,删完隐藏集合回到空。事件载荷新增 `mode` / `pointIndexes` / `removedPoints` / `removedLineItems`(其余 `lineIndexes` / `removedLineIndexes` / `lineIds` / `count` / `removedLines` / `removedChannels` 继续保留),`points` / `lines` / `channels` 仍是删除后的最新数据。
353
+ - **历史与初始时序**:一次 remove 只落一步历史;撤销恢复数据时通过 `suppressRemoval` 阻止仍生效的 remove 条件再次删除,重做不补发第二条 `filterRemove`。同步初始筛选在 `ready` 前删完;初始筛选走 Worker 时删除与 `onFilter` 在异步结果回来后才发生。顺带修正 `history.js` 的 `spliceEntries()` 一次撤销多条删除时的下标偏移,多条线路恢复后保持原顺序。
354
+ - **核心文件**:`src/gis-view/point.js`、`engine.js`、`create.js`、`filter.js`、`history.js`、`types.d.ts`、`docs/index.html`、`docs/steps/selftest-select.html` / `selftest-scale.html` / `selftest-docs.html` / `selftest-demos.html`、`docs/manual/03` / `04` / `08` / `14` / `15` / `16` / `17` / `18` / `21`、`README.md`、`src/gis-view/README.md`、`docs/GisView.md`、`docs/steps/README.md`、`docs/demos/api-index.js`(生成物)与本轮 aimd。
355
+ - **验证**:`selftest-select.html` **69**、`selftest-docs.html` **131**、`selftest-scale.html` **119**、`selftest-actions.html` **96**、`selftest-demos.html` **334**、`selftest-data.html` **103**、`selftest-features.html` **666**,相关 7 页共 **1518** 条通过 / 0 失败(`selftest-scale` 另有 6 条 DIAG 耗时读数)。`npx tsc --noEmit`、五个源码文件的 `node --check`、`node docs/steps/gen-api-index.mjs` 与 `--check`、`npm run check:docs`(253 个实例成员 / 250 个方法 / 250 个数据字段 / 96 个 options)、`npm run build`、`git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-23-增量问题txt四条svg-描边--文档表格--selecttrigger--筛选删除)。
356
+
357
+ ## 2026-10-23 增量(「修改.txt」四项:focusOn 缺省居中 / 文档互跳 / 扩展命令 / 性能优化)
358
+
359
+ 本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `修改.txt`:① 节点 / 线路 / 通道的 `focusOn` 表现不一致,缺省应只居中、放大必须手动设置;② 增加文档互跳,并解决方法速查左栏点击后右侧滚动过慢;③ 继续增加组件的可扩展能力与灵活性并提供 demo;④ 优化组件交互与方法性能。
360
+
361
+ - **focusOn 缺省口径**:`focusOn(target, options)` 现在缺省只 `centerOn`,不再自动 `zoomToBounds`;只有 `zoom: true` 才按目标范围适配,`scale` 优先于 `zoom`,`center: true` 保留为显式居中。节点、线路、通道、分组与批量目标共用同一口径;演示页里原先依赖自动适配的定位都改成显式 `zoom: true`。
362
+ - **文档互跳与左栏跳转**:API 速查顶栏增加文档中心 / 实例方法 / 参数速查 / 逐方法示例四个深链,每个主题分组标题增加对应手册章节链接;左栏跳转由平滑滚动改为 `behavior: 'auto'`,长页面不再缓慢滚过整屏,并暴露 `__gisApi.scrollToGroup()` 供自测与宿主复用。
363
+ - **扩展能力与 demo**:新增实例命令 `registerCommand` / `executeCommand` / `listCommands`。命令表按视图隔离,同名后注册覆盖、注销函数幂等且不会误删后注册的同名命令;上下文冻结为 `{ view, name }`,执行结果区分成功值与未注册 / 非法名字 / handler 异常,`destroy()` 清空命令表。`ExtensionDemo` 补齐插件、自定义图元、条件运算符、导出格式、WebGL 自定义层与实例命令六类扩展点。
364
+ - **交互与方法性能**:定向补丁只在改动可能影响筛选结果时重跑筛选;只改展示字段时沿用原结果,`id` / 坐标 / `from` / `to` / `visible` 与函数 / 自定义运算符条件保持保守重跑。引擎新增定向的通道 / 分组范围测量,`focusOn` 不再为一段范围复制整页通道几何;事件总线在只有一条订阅时直接调用,省掉每次事件分发的快照数组。本轮没有做可信的性能基准,不提供加速倍数。
365
+ - **核心文件**:`src/gis-view/create.js`、`engine.js`、`events.js`、`types.d.ts`、`docs/api/index.html`、`docs/demos/ExtensionDemo.vue`、`docs/demos/SearchFilterDemo.vue`、`docs/demos/ApiCoverageDemo.vue`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`docs/demos/gis-view-demo/panels/OpsPanels.vue`、`docs/demos/gis-view-demo/GisViewDemoCardHeader.vue`、`docs/demos/demos.js`、`docs/demos/api-index.js`(生成物)、`README.md`、`src/gis-view/README.md`、`docs/GisView.md`、`docs/index.html`、`docs/manual/08` / `14` / `15` / `16` / `17` / `18` / `19`、`docs/steps/README.md`、`docs/steps/selftest-features.html` / `selftest-demos.html` / `selftest-docs.html` 与本轮 aimd。
366
+ - **验证**:`selftest-features.html` **672** 条、`selftest-demos.html` **337** 条、`selftest-docs.html` **134** 条,三页共 **1143** 条通过 / 0 失败;`node --check src/gis-view/create.js`、`npx tsc --noEmit`、`npm run build`、`node docs/steps/gen-api-index.mjs`、`npm run check:docs`(**256** 个实例成员 = **253** 个方法 + 3 个属性 / **96** 个 options / **16** 个分组 / **250** 个数据字段)与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-23-增量修改txt四项focuson-缺省居中--文档互跳--扩展命令--性能优化)。
367
+
368
+ ## 2026-10-23 增量(「问题.txt」五项:鹰眼图回线居中 / 动态位置 / backgroundStyle / 主图样式 / 外部挂载)
369
+
370
+ 本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① 取消通道回线后双回线只显示上面一根,应在两根中间显示;② 支持动态移动整个鹰眼图;③ 检查 `backgroundStyle` 是否生效;④ 沿用主图规则后节点尺寸与图标要和主图一致;⑤ 支持把鹰眼图单独挂到外部 `div`。
371
+
372
+ - **回线居中代表线**:`channelCircuits: false` 不再按偏移挑最靠中间的成员线;`collectMinimapData()` 取该通道分组当前可见的回线,顶点数一致时逐顶点取平均再画一根。双回线落在两线正中,三回线落在中间线,只剩一根时仍画它自己;路径结构不一致时保守回退第一条可见成员。
373
+ - **动态位置**:新增 `minimap.offset: [x, y]`,相对 `position` 指定的角移动整张鹰眼图,`x` 正数向右、`y` 正数向下,四个角语义统一;`updateOptions({ minimap: { ...old, offset } })` 即时生效,配合新增的 `getMinimapElement()` 可绑定自定义整图拖动。
374
+ - **backgroundStyle**:显式设置 `backgroundStyle` 时由容器接管底色,画布不再铺主图的不透明底色,只画继承 / 独立的图片与 GeoJSON;不写时保持原行为,想要完全透出宿主可写 `transparent`。
375
+ - **沿用主图样式**:`inheritRules` 开启时,节点半径取自引擎最终 `getPointStyle()` 尺寸(圆形按 `CIRCLE_AREA_FACTOR` 还原实际直径),并沿用主图的符号、层级与图标填充 / 描边色。圆、方、图片、SVG 与自定义图元都能显示;异步解码完成的符号会在后续帧补画。
376
+ - **外部挂载**:新增 `minimap.container`,接受元素或 CSS 选择器,把同一根鹰眼图节点移至外部宿主,`position` / `margin` / `offset` 相对该宿主计算;选择器找不到时回落主视图根节点。运行时切换容器只移动节点、不重建画布,`destroy()` 会清理挂载。
377
+ - **核心文件**:`src/gis-view/minimap.js`、`src/gis-view/create.js`、`src/gis-view/engine.js`、`src/gis-view/types.d.ts`、`docs/steps/selftest-full.html`、`docs/internals/13-鹰眼图.md`、`docs/manual/03` / `09` / `14` / `16` / `17` / `18` / `21`、`README.md`、`src/gis-view/README.md`、`docs/GisView.md`、`docs/index.html`、`docs/steps/README.md`、`docs/steps/selftest-docs.html` / `selftest-demos.html`、`docs/demos/api-index.js`(生成物)与本轮 aimd。
378
+ - **验证**:`selftest-full.html` **85** 条、`selftest-docs.html` **134** 条、`selftest-demos.html` **337** 条,三页共 **556** 条通过 / 0 失败。新增 5 条鹰眼图断言覆盖居中代表线、显式底色让画布透明、主图尺寸与 SVG 图标、外部容器挂载、`offset` 动态位移及换容器复用节点。`npx tsc --noEmit`、`node --check`(minimap / create / engine)、`node docs/steps/gen-api-index.mjs --check`、`npm run check:docs`(**257** 个实例成员 = **254** 个方法 + 3 个属性 / **96** 个 options / **250** 个数据字段 / **16** 个分组)、`npm run build` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-23-增量问题txt五项鹰眼图回线居中--动态位置--backgroundstyle--主图样式--外部挂载)。
379
+
380
+ ## 2026-10-23 增量:鹰眼图缩放联动与新增通道示例节点
381
+
382
+ 本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `修改.txt` 五项与 `问题.txt` 三项:`修改.txt` ①沿用主图规则后节点要按鹰眼图与主图的比例缩小;②`dragAction: 'box'` 不依赖缩放开关;③新增跟随主图缩放的模式且与手动缩放互斥;④demo 展示指定起点新增,并让 `commitAddChannel` 可直接接收本次新增的通道 / 线路对象;⑤草稿示例点严格落在节点中心、可显隐 / 配样式,示例线路可压到真实节点下面。`问题.txt` ①`auto` 范围随相机收窄改为默认关闭的开关;②补鹰眼图拖拽 demo;③继承节点按主图与小图的视口尺寸比例缩放,不按主图放大倍数缩放。
383
+
384
+ - **鹰眼节点尺寸与范围**:`collectMinimapData()` 给继承主图尺寸的节点打 `inheritSize`;`inheritedSizeFactor()` 取小图与主图 `getViewport()` 的 CSS 宽、高较小比例,只随两边视口尺寸变化,不随主图 `/` 小图相机倍数漂移。`extentFollowCamera` 默认 `false`,`extent: 'auto'` 固定用「可见数据 ∪ 底图」;只有显式打开后才允许相机落入其中一份时按正在看的那一份收窄。
385
+ - **缩放三态与拖拽**:`zoomable` 统一为 `false` / `true` / `'follow'` 三态互斥:手动缩放、跟随主图、关闭;`followZoomScale` 是主图相对基准倍数的指数(`0` 不跟随、`1` 同倍率),`zoom` 在跟随模式作为基准倍数,`setMinimapZoom` / `zoomMinimapBy` 不抢主图控制权。`dragAction: 'box'` 在缩放关闭时也能直接框选,只有手动缩放才用 Ctrl / ⌘ 切换平移与框选;Demo 提供框选 / 平移两种整图拖拽演示。
386
+ - **新增通道对象入参**:`commitAddChannel` 兼容旧 `resolution`,也可直接传 `GisViewChannel` / `GisViewLine`,或 `{ channel, line, lines, resolution, ... }` 包装对象。对象中的端点、id、名称、路径、分组、样式与业务字段优先,缺省字段继续沿用草稿;直接线路对象除 `COMMIT_LINE_KEYS` 外的颜色 / 线宽 / 线型 / 业务字段都汇入 `lineProps`,直接通道对象支持 `lineIds` / `groups` / `lineProps` / `channelProps`,不会被容器写法误判。
387
+ - **草稿示例点与层级**:`channelDraftStyle.dots` 支持 `false` / `true` / 样式对象,统一设置 `show` / `size` / `color` / `shape`,`from` / `to` 可分别覆盖颜色、尺寸、圆点或方点;示例点固定画在真正点中的节点中心,不受多回线偏移影响。`layer: 'below-points'` 把示例线、箭头与 `customDraw` 画在真实节点之前(端点示例点仍最后画),默认 `above` 保持原层级;草稿 buffer / VAO 一并补上销毁。
388
+ - **Demo 与文档**:`ConnectDemo` 增加指定起点、示例点显隐 / 尺寸 / 形状 / 分端颜色、示例线层级和线路 / 通道对象直传;`MinimapDemo` 增加关闭 / 手动 / 跟随三态、跟随指数、范围开关、框选 / 平移拖拽演示,旧的 `minimapZoomable` 写法统一换成三态配置。同步根 `README.md`、`docs/manual/03` / `10` / `14` / `16` / `17` / `18` / `21`、`docs/internals/13-鹰眼图.md`、`docs/steps/README.md` 与 `docs/demos/api-index.js`(生成物)。
389
+ - **核心文件**:`src/gis-view/minimap.js`、`src/gis-view/create.js`、`src/gis-view/engine.js`、`src/gis-view/types.d.ts`、`docs/demos/ConnectDemo.vue`、`MinimapDemo.vue`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`GisViewDemoStage.vue`、`docs/steps/selftest-full.html`、`selftest-demos.html`、上述手册 / 内部文档与本轮 aimd。
390
+ - **验证**:`selftest-full.html` **86** 条、`selftest-features.html` **672** 条、`selftest-demos.html` **349** 条、`selftest-docs.html` **134** 条,四页共 **1241** 条通过 / 0 失败;新增断言覆盖继承节点不随主图放大、视口尺寸变化重铺、范围开关默认关闭与显式开启、三态跟随、关闭缩放时框选、对象直传与草稿示例点。`npx tsc --noEmit`、`node --check`(minimap / create / engine)、`node docs/steps/gen-api-index.mjs --check`、`npm run check:docs`(**257** 个实例成员 = **254** 个方法 + 3 个属性 / **96** 个 options / **250** 个数据字段 / **43** 个事件 / **17** 个功能开关)、`npm run build` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-23-增量鹰眼图缩放联动与新增通道示例节点)。
391
+
392
+ ## 2026-10-23 增量:鹰眼图继承要素尺寸与地图缩放解耦
393
+
394
+ 本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt` 三项:① 鹰眼图的范围跟随相机改为默认关闭;② 补鹰眼图拖拽 demo;③ 澄清「节点随主视图缩放」只指沿用主图规则时的节点 / 线路尺寸。复核确认 ① / ② 已在当前工作树实现,本轮补齐 ③:继承节点 / 线路按「小图视口 ÷ 主图视口」的较小比例缩放,独立于主图相机倍数和鹰眼图自身倍数;主图放大不改变它们,鹰眼图自身放大时才由 `pointZoomScale` / `lineZoomScale` 联动。
395
+
396
+ - **继承线宽**:`line.js` 的 `resolveLineStyleInto()` 记录样式链原始宽度 `baseWidth`(不含热力倍数 / 整体倍数 / 缩放联动),`engine.js` 新增内部 `getLineStyle(index)` 快照;`create.js` 在沿用主图线路时写入 `entry.width` 并标记 `inheritWidth`,与节点的 `inheritSize` 走同一份视口比例。
397
+ - **缩放拆层**:`minimap.js` 对继承节点使用 `pointSizeScale × pointZoomScale × inheritedSizeFactor()`,对继承线路使用 `lineWidthScale × lineZoomScale × inheritedSizeFactor()`;`pointMapZoomScale` / `lineMapZoomScale` 只作用于小图自有规则 / 样式。点 / 线路缓存键同步包含各自系数,没有继承线路时继承系数固定为 1。
398
+ - **Demo 与文档**:`MinimapDemo` 默认切到沿用主图,拆分节点 / 线路整体倍数与小图缩放指数控件,并保留框选 / 平移拖拽演示;主 demo 在沿用模式下禁用「节点跟主图 / 线路跟主图」并更新提示。同步 `types.d.ts` 注释、根 `README.md`、`src/gis-view/README.md`、`docs/manual/03` / `14`、`docs/internals/13-鹰眼图.md`,重新生成 `docs/demos/api-index.js`。
399
+ - **核心文件**:`src/gis-view/line.js`、`src/gis-view/engine.js`、`src/gis-view/create.js`、`src/gis-view/minimap.js`、`src/gis-view/types.d.ts`、`docs/demos/MinimapDemo.vue`、`docs/demos/gis-view-demo/GisViewDemoStage.vue`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`docs/steps/selftest-full.html`、`docs/steps/selftest-demos.html` 与本轮文档。
400
+ - **验证**:`selftest-full.html` **92** 条、`selftest-features.html` **672** 条、`selftest-demos.html` **351** 条、`selftest-docs.html` **134** 条,四页共 **1249** 条通过 / 0 失败;新增 8 条断言覆盖继承线路 / 节点在主图放大时尺寸不变、`pointSizeScale` / `lineWidthScale` 对继承要素生效、小图自身放大按 `pointZoomScale` / `lineZoomScale` 联动,以及 demo 两个独立整体倍数控件。`npx tsc --noEmit`、`node --check`(minimap / create / engine / line)、`node docs/steps/gen-api-index.mjs --check`、`npm run check:docs`(**257** 个实例成员 = **254** 个方法 + 3 个属性 / **96** 个 options / **250** 个数据字段 / **43** 个事件 / **17** 个功能开关)、`npm run build` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-23-增量鹰眼图继承要素尺寸与地图缩放解耦)。
401
+
402
+ ## 2026-10-23 增量(「修改.txt」三项:commitAddChannel 文档 / 传参示例 / 线路半跳过)
403
+
404
+ 本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `修改.txt` 三项:① 说明 `commitAddChannel` 有哪些传参、支持哪些写法;② 把方法用法、传参和示例写详细;③ 继续优化组件性能。
405
+
406
+ - **`commitAddChannel` 入参口径**:手册 `10` 的「对象直传」扩写为五种写法:无参、旧 resolution、直接线路对象、直接通道对象(必须有 `lineIds`)、容器(`channel` / `line` / `lines` / `lineData` / `lineItems` / `channelGroups` / `group` / `channelProps` / `lineProps` / `resolution`)。明确草稿只支持 `from`、没有 `to`;`line` 缺省是独立线路,`lines` 才是成员回线表;空数组沿用草稿;直接通道的 `id` 只是通道 id,回线 id 来自 `lineIds`;直接通道自己的 `lineProps` 生效,容器里的 `channel.lineProps` 不合并;分组优先级 `channelGroups > group > channel.groups`;并进已有通道 / 分组要用容器并显式写 `resolution`。
407
+ - **示例与错误说明**:`ready` 里的方案读数不能整条回传,统一只取 `{ type, groupId, groupIndex, channelId }` 子集;删除“整条 option 可直接提交”的旧示例。`groups[].lineIds` 写了本次未生成的 id 改为 warning + 按成员表调和,不再列为失败原因;返回结果的 `channelIndex` 改为“成功时为通道下标、独立线路为 -1,失败通常不返回,事件载荷按 -1 兜底”。同步扩写 `18` 的逐方法示例(五种写法、只给 `channel.lineIds`、容器逐条字段、空数组、端点 / 路由覆盖、并组、连续提交、结果读取),并细化 `16` / `17` 与 `types.d.ts` 的 JSDoc。
408
+ - **线路半跳过**:`engine.js` 在节点半跳过成立后,再核对线路数组与通道声明逐元素同引用、隐藏集合 / 通道车道输入 / 线路与状态样式快照未变,且没有追加补点补线;命中时跳过 `resolveLines`、线路索引、虚线槽位、层序与线路包围盒重算,直接复用上一轮线路半包围盒。追加补线与拖点 / 拐点 / 通道骨架等增量改线会把新路径并进缓存;没有可信读数时记 `lineHalfOutOfSync`,下一轮放弃跳过。`selftest-perf.html` 新增 3 条断言:同一批点线连交 5 次条数与线路实例数不变、通道声明未变时回线派生折线原样保留、换通道骨架时线路几何必须重推。
409
+ - **实测**:20000 点 / 8000 线同一批对象回灌 5 次取中位,**14.3 ms → 6.3 ms**(优化后 5.6 / 6.3 / 6.3 / 6.4 / 10.7 ms)。
410
+ - **核心文件**:`src/gis-view/engine.js`、`src/gis-view/types.d.ts`、`docs/manual/10` / `16` / `17` / `18`、`docs/steps/selftest-perf.html`、`docs/internals/16-01-优化与取舍-上.md`、`docs/internals/18-性能实测与WebGPU评估.md`、`docs/demos/api-index.js`(生成物)、本轮 aimd。
411
+ - **验证**:`node --check`(engine / create)、`node docs/steps/gen-api-index.mjs`、`npm run check:docs`(**257** 个实例成员 = **254** 个方法 + 3 个属性 / **96** 个 options / **250** 个数据字段 / **43** 个事件 / **17** 个功能开关)、五页自测 `full 92` + `features 672` + `demos 351` + `docs 134` + `perf 167` = **1416** 条通过 / 0 失败、`npx tsc --noEmit`、`npm run build` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-23-增量修改txt三项commitaddchannel-文档--传参示例--线路半跳过)。
package/docs/GisView.md CHANGED
@@ -1,53 +1,53 @@
1
- # GisView
2
-
3
- `GisView` 是一套不依赖任何第三方图形库的 WebGL2 矢量视图:渲染层是原生 WebGL2(GLSL ES 3.00 + 实例化绘制),交互层只有指针与滚轮,界面只内置可选的小地图(配 `minimap` 才有,见「鹰眼图」),其余全靠使用方。它没有 Vue 组件形态,用 `createGisView(dom, options)` 把画布直接挂到传入的 DOM 上,宽高默认跟随容器。
4
-
5
- 控制面板、读数面板、图例这类视图工具都不内置:组件只提供画布与实例方法,样式和布局完全由使用方决定,后续改样式不需要等待组件升级。数据侧该有的都给了:按属性筛选(点被过滤时绑定线路与通道一起消失,大数据量走 Web Worker)、按属性批量配色换符号、节点标签与点 / 线 / 通道的悬浮提示,都可以通过 options 或实例方法配置。
6
-
7
- **这份手册按主题拆成了 21 章,正文在 [`docs/manual/`](manual/) 下**:找方法先看 [16 实例方法总表](manual/16-实例方法总表.md),查参数跳 [17 参数速查](manual/17-参数速查.md),要能直接复制的调用看 [18 逐方法示例](manual/18-逐方法示例.md);只想先跑起来看 [01 快速开始](manual/01-快速开始.md)。
8
-
9
- - 想在页面上按方法名搜、直接看示例:打开 [API 速查(方法 + 示例)](api/index.html)(清单就是从 17 / 18 两章生成的;支持深浅主题、左侧分组跟随与 `#成员名` 深链);要边改边跑用 [调试演示页](playground/index.html)。
10
- - 「某个特性怎么实现、为什么这么做」看 [GisView 实现原理](GisView实现原理.md);数据的标准写法与五套口径看 [数据格式](数据格式.md)。
11
- - 复制 / 合并 / 通道分组 / 拐点要接真实后端:请求头、body、成功响应、409 / 500、幂等与前端重试流程看 [编辑接口协议](接口协议.md);成功响应怎么落到本地数据(`idMap` 改写、合并对账、分组 / 拐点覆盖、409 局部恢复)见其中的「前端落地映射」。
12
- - 后端 DTO 与内置列名不一致时,不必改组件:用 `defineExportFormat`(或底层的 `registerExportFormat`)注册一个同步导出格式,把标准文档映射成自己的表结构,见 [自定义导出格式](manual/15-导出与集成.md#自定义导出格式后端-dto)。
13
- - 想照着源码从零写一遍看 [从 0 到完整的实现](从0到完整的实现.md);逐文件的教程与自测页在 [docs/steps](steps/README.md)(页面:[docs/steps/index.html](steps/index.html))。
14
-
15
- ## 手册目录
16
-
17
- | 章 | 讲什么 |
18
- | --- | --- |
19
- | [01 快速开始](manual/01-快速开始.md) | 引入与最小示例:装什么、怎么把画布挂到 DOM 上 |
20
- | [02 坐标与数据](manual/02-坐标与数据.md) | 世界坐标 / 经纬度映射、相机与像素、数据字段全表 |
21
- | [03 配置项(options)](manual/03-配置项.md) | 全部 options 的总表与逐个详解(默认值、落点、相关开关) |
22
- | [04 事件与回调](manual/04-事件与回调.md) | 回调清单、事件订阅、两层功能开关、配置提醒 |
23
- | [05 画质与批量更新](manual/05-画质与批量更新.md) | quality 四档与自动升降;batch 把一批改动作一次提交 |
24
- | [06 数据与场景更新](manual/06-数据与场景更新.md) | 整份换数据 / 增量追加 / 加载完成回调 / 按方法新增要素 / 历史 |
25
- | [07 指针与要素编辑](manual/07-指针与要素编辑.md) | 点击与样式、指针事件全字段、光标、拖拽点、复制 / 合并 / 删除 |
26
- | [08 选中与拐点](manual/08-选中与拐点.md) | 选中与拖动的层级、框选、接口选中、线路拐点的增删改 |
27
- | [09 通道与多回线](manual/09-通道与多回线.md) | 通道的数据结构、createChannels 批量生成、分组与选中模式 |
28
- | [10 通道编辑与新增](manual/10-通道编辑与新增.md) | 分组拐点的增删、右键交互框、新增通道的草稿流程、改名与增删回线 |
29
- | [11 样式与规则](manual/11-样式与规则.md) | 点配置、线配置、条件语言(筛选 / 规则 / 标签共用)与批量样式规则 |
30
- | [12 标签与装饰](manual/12-标签与装饰.md) | 节点 / 线路标签、标签拖动与编辑、节点与线路装饰、动态装饰器草稿、悬浮提示 |
31
- | [13 动效与图元](manual/13-动效与图元.md) | 热力图、动画效果、线路方向箭头、贴图预热与自定义图元 |
32
- | [14 视图与筛选](manual/14-视图与筛选.md) | 筛选、搜索定位、初始视图与缩放范围、背景层、鹰眼图、近义入口 |
33
- | [15 导出与集成](manual/15-导出与集成.md) | 导出图片 / 选中节点 / 数据、自定义导出格式,插件、自建界面与键盘交互 |
34
- | [16 实例方法总表](manual/16-实例方法总表.md) | 按功能分组的实例方法主表(找方法从这一章开始) |
35
- | [17 参数速查(逐个方法)](manual/17-参数速查.md) | 253 个成员逐个列全:参数、默认值与返回 |
36
- | [18 逐方法示例(复制就能跑)](manual/18-逐方法示例.md) | 每个成员一段可复制的调用示例(API 速查页读的就是这一章) |
37
- | [19 读数与拖拽预览](manual/19-读数与拖拽预览.md) | 自建界面常用的读数 / 定位方法;拖拽落点预览 |
38
- | [20 性能与大数据](manual/20-性能与大数据.md) | 十万级数据的开关与实测、WebGPU 取舍、渲染后端开关 |
39
- | [21 说明与常见问题](manual/21-说明与常见问题.md) | 边界与口径、FAQ、类型定义索引 |
40
-
41
- ## 快速跳转(按任务)
42
-
43
- - **上手**:[引入](manual/01-快速开始.md#引入) · [基础用法](manual/01-快速开始.md#基础用法) · [坐标与数据](manual/02-坐标与数据.md)
44
- - **配置与回调**:[options 总表](manual/03-配置项.md#options) · [回调](manual/04-事件与回调.md#回调) · [功能开关](manual/04-事件与回调.md#功能开关)
45
- - **通道**:[通道与多回线](manual/09-通道与多回线.md) · [通道编辑与新增](manual/10-通道编辑与新增.md) · [分组拐点](manual/10-通道编辑与新增.md#分组拐点把某一组拉走)
46
- - **样式**:[点配置](manual/11-样式与规则.md#点配置) · [线配置](manual/11-样式与规则.md#线配置) · [条件语言](manual/11-样式与规则.md#条件语言) · [批量样式规则](manual/11-样式与规则.md#批量样式规则)
47
- - **标签与动效**:[节点标签](manual/12-标签与装饰.md#节点标签) · [线路标签](manual/12-标签与装饰.md#线路标签) · [标签优化](manual/12-标签与装饰.md#标签显示优化开关labeloptimize) · [扩展图形](manual/12-标签与装饰.md#扩展图形graphic) · [节点装饰](manual/12-标签与装饰.md#节点上的装饰图片--svg) · [线路装饰](manual/12-标签与装饰.md#线路上的装饰图片--svg) · [手动删除装饰](manual/12-标签与装饰.md#手动删除装饰) · [动态装饰器](manual/12-标签与装饰.md#动态装饰器草稿) · [动画效果](manual/13-动效与图元.md#动画效果effects) · [自定义图元](manual/13-动效与图元.md#自定义图元)
48
- - **视图**:[筛选](manual/14-视图与筛选.md#筛选) · [搜索与定位](manual/14-视图与筛选.md#搜索与定位) · [适应视图的节点间距](manual/14-视图与筛选.md#适应视图的节点间距fitspacing) · [背景层](manual/14-视图与筛选.md#背景层) · [鹰眼图](manual/14-视图与筛选.md#鹰眼图)
49
- - **导出与集成**:[导出数据](manual/15-导出与集成.md#导出数据) · [自定义导出格式](manual/15-导出与集成.md#自定义导出格式后端-dto) · [插件](manual/15-导出与集成.md#插件) · [自建界面](manual/15-导出与集成.md#自建界面)
50
- - **查方法**:[实例方法总表](manual/16-实例方法总表.md) · [参数速查](manual/17-参数速查.md) · [逐方法示例](manual/18-逐方法示例.md) · [读数与拖拽预览](manual/19-读数与拖拽预览.md)
51
- - **概念与排查**:[大数据展示模式(denseMode)](manual/20-性能与大数据.md#大数据展示模式densemode) · [大数据量](manual/20-性能与大数据.md#大数据量) · [常见问题](manual/21-说明与常见问题.md#常见问题) · [类型定义索引](manual/21-说明与常见问题.md#类型定义索引)
52
-
53
- > 本页也可以从文档中心(`docs/index.html`)打开:左侧清单里 `GisView.md` 是这一页,下面紧跟着 21 章手册。
1
+ # GisView
2
+
3
+ `GisView` 是一套不依赖任何第三方图形库的 WebGL2 矢量视图:渲染层是原生 WebGL2(GLSL ES 3.00 + 实例化绘制),交互层只有指针与滚轮,界面只内置可选的小地图(配 `minimap` 才有,见「鹰眼图」),其余全靠使用方。它没有 Vue 组件形态,用 `createGisView(dom, options)` 把画布直接挂到传入的 DOM 上,宽高默认跟随容器。
4
+
5
+ 控制面板、读数面板、图例这类视图工具都不内置:组件只提供画布与实例方法,样式和布局完全由使用方决定,后续改样式不需要等待组件升级。数据侧该有的都给了:按属性筛选(默认只隐藏,也可显式从数据删除;点被过滤时绑定线路与通道一起消失,大数据量走 Web Worker)、按属性批量配色换符号、节点标签与点 / 线 / 通道的悬浮提示,都可以通过 options 或实例方法配置。
6
+
7
+ **这份手册按主题拆成了 21 章,正文在 [`docs/manual/`](manual/) 下**:找方法先看 [16 实例方法总表](manual/16-实例方法总表.md),查参数跳 [17 参数速查](manual/17-参数速查.md),要能直接复制的调用看 [18 逐方法示例](manual/18-逐方法示例.md);只想先跑起来看 [01 快速开始](manual/01-快速开始.md)。
8
+
9
+ - 想在页面上按方法名搜、直接看示例:打开 [API 速查(方法 + 示例)](api/index.html)(清单就是从 17 / 18 两章生成的;支持深浅主题、左侧分组跟随与 `#成员名` 深链);要边改边跑用 [调试演示页](playground/index.html)。
10
+ - 「某个特性怎么实现、为什么这么做」看 [GisView 实现原理](GisView实现原理.md);数据的标准写法与五套口径看 [数据格式](数据格式.md)。
11
+ - 复制 / 合并 / 通道分组 / 拐点要接真实后端:请求头、body、成功响应、409 / 500、幂等与前端重试流程看 [编辑接口协议](接口协议.md);成功响应怎么落到本地数据(`idMap` 改写、合并对账、分组 / 拐点覆盖、409 局部恢复)见其中的「前端落地映射」。
12
+ - 后端 DTO 与内置列名不一致时,不必改组件:用 `defineExportFormat`(或底层的 `registerExportFormat`)注册一个同步导出格式,把标准文档映射成自己的表结构,见 [自定义导出格式](manual/15-导出与集成.md#自定义导出格式后端-dto)。
13
+ - 想照着源码从零写一遍看 [从 0 到完整的实现](从0到完整的实现.md);逐文件的教程与自测页在 [docs/steps](steps/README.md)(页面:[docs/steps/index.html](steps/index.html))。
14
+
15
+ ## 手册目录
16
+
17
+ | 章 | 讲什么 |
18
+ | --- | --- |
19
+ | [01 快速开始](manual/01-快速开始.md) | 引入与最小示例:装什么、怎么把画布挂到 DOM 上 |
20
+ | [02 坐标与数据](manual/02-坐标与数据.md) | 世界坐标 / 经纬度映射、相机与像素、数据字段全表 |
21
+ | [03 配置项(options)](manual/03-配置项.md) | 全部 options 的总表与逐个详解(默认值、落点、相关开关) |
22
+ | [04 事件与回调](manual/04-事件与回调.md) | 回调清单、事件订阅、两层功能开关、配置提醒 |
23
+ | [05 画质与批量更新](manual/05-画质与批量更新.md) | quality 四档与自动升降;batch 把一批改动作一次提交 |
24
+ | [06 数据与场景更新](manual/06-数据与场景更新.md) | 整份换数据 / 增量追加 / 加载完成回调 / 按方法新增要素 / 历史 |
25
+ | [07 指针与要素编辑](manual/07-指针与要素编辑.md) | 点击与样式、指针事件全字段、光标、拖拽点、复制 / 合并 / 删除 |
26
+ | [08 选中与拐点](manual/08-选中与拐点.md) | 选中与拖动的层级、框选、接口选中、线路拐点的增删改 |
27
+ | [09 通道与多回线](manual/09-通道与多回线.md) | 通道的数据结构、createChannels 批量生成、分组与选中模式 |
28
+ | [10 通道编辑与新增](manual/10-通道编辑与新增.md) | 分组拐点的增删、右键交互框、新增通道的草稿流程、改名与增删回线 |
29
+ | [11 样式与规则](manual/11-样式与规则.md) | 点配置、线配置、条件语言(筛选 / 规则 / 标签共用)与批量样式规则 |
30
+ | [12 标签与装饰](manual/12-标签与装饰.md) | 节点 / 线路标签、标签拖动与编辑、节点与线路装饰、动态装饰器草稿、悬浮提示 |
31
+ | [13 动效与图元](manual/13-动效与图元.md) | 热力图、动画效果、线路方向箭头、贴图预热与自定义图元 |
32
+ | [14 视图与筛选](manual/14-视图与筛选.md) | 筛选、搜索定位、初始视图与缩放范围、背景层、鹰眼图、近义入口 |
33
+ | [15 导出与集成](manual/15-导出与集成.md) | 导出图片 / 选中节点 / 数据、自定义导出格式,插件、自建界面与键盘交互 |
34
+ | [16 实例方法总表](manual/16-实例方法总表.md) | 按功能分组的实例方法主表(找方法从这一章开始) |
35
+ | [17 参数速查(逐个方法)](manual/17-参数速查.md) | 257 个成员逐个列全:参数、默认值与返回 |
36
+ | [18 逐方法示例(复制就能跑)](manual/18-逐方法示例.md) | 每个成员一段可复制的调用示例(API 速查页读的就是这一章) |
37
+ | [19 读数与拖拽预览](manual/19-读数与拖拽预览.md) | 自建界面常用的读数 / 定位方法;拖拽落点预览 |
38
+ | [20 性能与大数据](manual/20-性能与大数据.md) | 十万级数据的开关与实测、WebGPU 取舍、渲染后端开关 |
39
+ | [21 说明与常见问题](manual/21-说明与常见问题.md) | 边界与口径、FAQ、类型定义索引 |
40
+
41
+ ## 快速跳转(按任务)
42
+
43
+ - **上手**:[引入](manual/01-快速开始.md#引入) · [基础用法](manual/01-快速开始.md#基础用法) · [坐标与数据](manual/02-坐标与数据.md)
44
+ - **配置与回调**:[options 总表](manual/03-配置项.md#options) · [回调](manual/04-事件与回调.md#回调) · [功能开关](manual/04-事件与回调.md#功能开关)
45
+ - **通道**:[通道与多回线](manual/09-通道与多回线.md) · [通道编辑与新增](manual/10-通道编辑与新增.md) · [分组拐点](manual/10-通道编辑与新增.md#分组拐点把某一组拉走)
46
+ - **样式**:[点配置](manual/11-样式与规则.md#点配置) · [线配置](manual/11-样式与规则.md#线配置) · [条件语言](manual/11-样式与规则.md#条件语言) · [批量样式规则](manual/11-样式与规则.md#批量样式规则)
47
+ - **标签与动效**:[节点标签](manual/12-标签与装饰.md#节点标签) · [线路标签](manual/12-标签与装饰.md#线路标签) · [标签优化](manual/12-标签与装饰.md#标签显示优化开关labeloptimize) · [扩展图形](manual/12-标签与装饰.md#扩展图形graphic) · [节点装饰](manual/12-标签与装饰.md#节点上的装饰图片--svg) · [线路装饰](manual/12-标签与装饰.md#线路上的装饰图片--svg) · [手动删除装饰](manual/12-标签与装饰.md#手动删除装饰) · [动态装饰器](manual/12-标签与装饰.md#动态装饰器草稿) · [动画效果](manual/13-动效与图元.md#动画效果effects) · [自定义图元](manual/13-动效与图元.md#自定义图元)
48
+ - **视图**:[筛选](manual/14-视图与筛选.md#筛选) · [搜索与定位](manual/14-视图与筛选.md#搜索与定位) · [适应视图的节点间距](manual/14-视图与筛选.md#适应视图的节点间距fitspacing) · [背景层](manual/14-视图与筛选.md#背景层) · [鹰眼图](manual/14-视图与筛选.md#鹰眼图)
49
+ - **导出与集成**:[导出数据](manual/15-导出与集成.md#导出数据) · [自定义导出格式](manual/15-导出与集成.md#自定义导出格式后端-dto) · [插件](manual/15-导出与集成.md#插件) · [实例命令](manual/15-导出与集成.md#实例命令) · [六类扩展点怎么选](manual/15-导出与集成.md#六类扩展点怎么选) · [自建界面](manual/15-导出与集成.md#自建界面)
50
+ - **查方法**:[实例方法总表](manual/16-实例方法总表.md) · [参数速查](manual/17-参数速查.md) · [逐方法示例](manual/18-逐方法示例.md) · [读数与拖拽预览](manual/19-读数与拖拽预览.md)
51
+ - **概念与排查**:[大数据展示模式(denseMode)](manual/20-性能与大数据.md#大数据展示模式densemode) · [大数据量](manual/20-性能与大数据.md#大数据量) · [常见问题](manual/21-说明与常见问题.md#常见问题) · [类型定义索引](manual/21-说明与常见问题.md#类型定义索引)
52
+
53
+ > 本页也可以从文档中心(`docs/index.html`)打开:左侧清单里 `GisView.md` 是这一页,下面紧跟着 21 章手册。
@@ -327,6 +327,72 @@
327
327
  - **核心文件**:`src/gis-view/utils.js`、`src/gis-view/engine.js`、`docs/demos/ApiCoverageDemo.vue`、`docs/demos/demos.js`、`docs/demos/gis-view-demo/panels/ViewPanels.vue`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`docs/manual/03` / `07` / `08` / `09` / `14` / `16` / `17` / `18`、`docs/steps/selftest-demos.html`、`docs/steps/selftest-scale.html`、`docs/steps/README.md` 与 `docs/demos/api-index.js`(生成物)。
328
328
  - **验证**:`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(253 个实例成员 / 95 个 options / 249 个数据字段)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过;14 个自测页共 2225 条通过 / 0 失败,其中 `selftest-demos.html` 333 PASS、`selftest-scale.html` 109 PASS / 0 FAIL / 6 DIAG。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-22-增量接口能力-demoapi-细节与-fitspacing-中心修正)。
329
329
 
330
+ ### 2026-10-23 增量(「修改.txt」四条:focusOn 缩放 / 四类搜索 / 筛选选中保留 / 参数说明)
331
+
332
+ 本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `修改.txt`:核对 `focusOn` 对线路 / 通道是否额外放大、让 `search` 支持与 `focusOn` 对应的类型、排查筛选为何取消选中、补细方法与参数说明。
333
+
334
+ - **focusOn 缩放**:四类目标本来就统一解析成 `bounds` 后走 `zoomToBounds`,线路 / 通道 / 分组没有类型专属倍率;本轮不加功能代码,只补自测证明缺省比例与显式 `zoomToBounds` 完全一致。
335
+ - **四类搜索**:`scope` 新增 `groups`,并支持 `point` / `line` / `channel` / `group` 单数别名;`result.groups` 与 `hits` 带分组命中,分组项给出 `channelIndex` / `groupId` / `groupIndex` 和轻量 `item`,其 `bounds` 可直接用于 `focusOn`,也能交给 `selectFeatures` 选中整组回线。Worker 路径随分组请求接收当前轻量快照,异步与同步结果保持一致。
336
+ - **筛选只隐藏**:根因是 `isKeyAlive()` 用只含可见要素的 `pointByIndex` / `lineByIndex` 判断存活,筛选隐藏被当成删除并清理选中集;现在查原始 `points` / `lines`,被隐藏的选中项保留,清空条件后恢复,且不额外发选中变更。
337
+ - **文档与验证**:手册 `14` / `16` / `17` / `18` / `21`、根 `README.md`、`src/gis-view/README.md` 与类型注释同步四类 scope、分组命中、`focusOn` 缩放口径和筛选语义。`selftest-features.html` 662 → **666**、`selftest-demos.html` 333 → **334**、`selftest-docs.html` **130**,三页共 **1130** 条通过 / 0 失败;`npx tsc --noEmit`、`node --check`、`npm run check:docs`(253 个实例成员 / 95 个 options / 249 个数据字段)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-23-增量修改txt四条focuson-缩放--四类搜索--筛选选中保留--参数说明)。
338
+
339
+ ### 2026-10-23 增量(「问题.txt」四条:SVG 描边 / 文档表格 / selectTrigger / 筛选删除)
340
+
341
+ 本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:SVG 导出节点图标只剩白色、文档参数表格渲染错误、选中支持单击 / 双击并可监听双击、筛选支持删除或隐藏。
342
+
343
+ - **SVG 描边**:`point.js` 在解析条目里补 `strokeColor`、在就地重解析时写回,SVG 符号的 `currentStrokeColor` 取节点实际描边色,不再回落白色。
344
+ - **文档表格**:`docs/index.html` 的表格拆列改为识别反引号代码段与 `\|`,代码里的联合类型不再被竖线拆成多列。
345
+ - **`selectTrigger`**:缺省 `'click'`;`'dblClick'` 第一下只发 `onClick`,第二下才应用选中 / 清空 / 取反并同时发 `onClick`(`double: true`)与 `onDblClick`。运行时切换清空双击序列;单击模式的 Ctrl / `multiSelect` 取反保持旧口径。
346
+ - **筛选 remove**:`filter.mode: 'hide' | 'remove'`。`remove` 先删线路再删节点、支持无 id 线路,抑制中间数据变更与 `onFilter`,只发一条 `filterRemove` 与最终一次 `onFilter`;载荷提供 `pointIndexes` / `removedPoints` / `removedLineItems` 等删除项。一次删除一步历史,撤销恢复数据但不会被仍生效的 remove 条件再次删除,重做不补发事件;同步初始删除先于 `ready`,Worker 初始筛选则等结果回来后再删。另修 `history.js` 多条删除一次撤销时的下标偏移。
347
+ - **文档与验证**:手册 `03` / `04` / `08` / `14` / `15` / `16` / `17` / `18` / `21`、根 `README.md`、`src/gis-view/README.md`、`docs/GisView.md` 与 `docs/steps/README.md` 同步选项、事件、删除语义、SVG 描边和计数。相关 7 个自测页共 **1518** 条通过 / 0 失败;`npx tsc --noEmit`、`node --check`、`npm run check:docs`(253 个实例成员 / 250 个方法 / 250 个数据字段 / 96 个 options)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-23-增量问题txt四条svg-描边--文档表格--selecttrigger--筛选删除)。
348
+
349
+ ### 2026-10-23 增量(「修改.txt」四项:focusOn 缺省居中 / 文档互跳 / 扩展命令 / 性能优化)
350
+
351
+ 本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `修改.txt`:检查节点 / 线路 / 通道的 `focusOn` 缩放差异并让缺省只居中、增加文档互跳并解决左栏滚动过慢、继续增加扩展能力并补 demo、优化组件交互与方法性能。
352
+
353
+ - **focusOn 缺省居中**:`focusOn(target, options)` 缺省只 `centerOn`,显式 `zoom: true` 才 `zoomToBounds`;`scale` 优先于 `zoom`,`center: true` 保留为显式居中。节点、线路、通道、分组与批量目标共用同一口径,demo 中原先依赖自动适配的定位改为显式 `zoom: true`。
354
+ - **文档互跳与左栏跳转**:`docs/api/index.html` 顶栏增加文档中心 / 实例方法 / 参数速查 / 逐方法示例深链,每个分组标题增加对应手册章节链接;左栏跳转改为 `scrollIntoView({ behavior: 'auto', block: 'start' })`,并暴露 `__gisApi.scrollToGroup()`,长页面不再平滑滚过整屏。
355
+ - **扩展能力与 demo**:新增 `registerCommand` / `executeCommand` / `listCommands`;命令按视图隔离,同名覆盖、注销幂等且旧卸载函数不会误删后注册的命令,`context` 冻结为 `{ view, name }`,异常走 `onError` 并以 `{ ok: false, reason }` 返回,`destroy()` 清空命令表。`ExtensionDemo` 现有插件、图元、条件运算符、导出格式、WebGL 自定义层与实例命令六类扩展点。
356
+ - **性能优化**:定向补丁只在改动可能影响筛选结果时重跑筛选,展示字段直接沿用原结果,`id` / 坐标 / `from` / `to` / `visible` 与函数 / 自定义运算符条件保守重跑;引擎新增按当前状态直接测量通道 / 分组范围的方法,`focusOn` 不再复制整页通道几何;事件总线在单订阅者时省掉快照数组。未做可信性能基准,不报告加速倍数。
357
+ - **核心文件**:`src/gis-view/create.js`、`engine.js`、`events.js`、`types.d.ts`、`docs/api/index.html`、`docs/demos/ExtensionDemo.vue`、`SearchFilterDemo.vue`、`ApiCoverageDemo.vue`、`gis-view-demo/useGisViewDemo.js`、`gis-view-demo/panels/OpsPanels.vue`、`gis-view-demo/GisViewDemoCardHeader.vue`、`demos.js`、`api-index.js`(生成物)、`README.md`、`src/gis-view/README.md`、`docs/GisView.md`、`docs/index.html`、`docs/manual/08` / `14` / `15` / `16` / `17` / `18` / `19`、`docs/steps/README.md`、`docs/steps/selftest-features.html` / `selftest-demos.html` / `selftest-docs.html` 与本轮 aimd。
358
+ - **验证**:`selftest-features.html` **672** 条、`selftest-demos.html` **337** 条、`selftest-docs.html` **134** 条,三页共 **1143** 条通过 / 0 失败;`node --check src/gis-view/create.js`、`npx tsc --noEmit`、`npm run build`、`node docs/steps/gen-api-index.mjs`、`npm run check:docs`(256 个实例成员 = 253 个方法 + 3 个属性 / 96 个 options / 16 个分组 / 250 个数据字段)与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-23-增量修改txt四项focuson-缺省居中--文档互跳--扩展命令--性能优化)。
359
+
360
+ ### 2026-10-23 增量(「问题.txt」五项:鹰眼图回线居中 / 动态位置 / backgroundStyle / 主图样式 / 外部挂载)
361
+
362
+ 本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:取消通道回线后双回线应居中、支持动态移动鹰眼图、确认 `backgroundStyle` 生效、沿用主图后节点尺寸与图标一致、支持挂到外部 `div`。
363
+
364
+ - **回线居中**:`create.js` 的 `averageMinimapPaths()` 在当前可见成员间逐顶点平均,`channelCircuits: false` 只画一根居中代表线;双回线位于两线中间,三回线落在中间线,成员只剩一条时原样保留,路径结构不一致时保守回退第一条可见路径。
365
+ - **动态位置与外部挂载**:`minimap.offset` 使用统一的正向右 / 正向下位移,`updateOptions` 可即时移动;`minimap.container` 支持元素或选择器,`syncAttachment()` 只移动同一根节点;新增 `getMinimapElement()` 供宿主绑定整图拖动。宿主需要定位上下文,选择器失效时回落主视图根节点。
366
+ - **backgroundStyle 与主图样式**:显式 `backgroundStyle` 时画布不再铺不透明主图底色,保留图片 / GeoJSON;`inheritRules` 的节点尺寸与符号改为取主图最终 `getPointStyle()` 结果,圆形用 `CIRCLE_AREA_FACTOR` 还原,图片 / SVG / 自定义图元支持异步加载后补画。
367
+ - **文档与验证**:同步手册 `03` / `09` / `14` / `16` / `17` / `18` / `21`、`docs/internals/13-鹰眼图.md`、根 `README.md`、`src/gis-view/README.md`、`docs/GisView.md` 与文档索引;`selftest-full.html` 增加 5 条断言。`selftest-full.html` **85** 条、`selftest-docs.html` **134** 条、`selftest-demos.html` **337** 条,三页共 **556** 条通过 / 0 失败;`npx tsc --noEmit`、`node --check`(minimap / create / engine)、`node docs/steps/gen-api-index.mjs --check`、`npm run check:docs`(**257** 个实例成员 = **254** 个方法 + 3 个属性 / **96** 个 options / **250** 个数据字段 / **16** 个分组)、`npm run build` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-23-增量问题txt五项鹰眼图回线居中--动态位置--backgroundstyle--主图样式--外部挂载)。
368
+
369
+ ### 2026-10-23 增量:鹰眼图缩放联动与新增通道示例节点
370
+
371
+ 本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `修改.txt` 五项与 `问题.txt` 三项:沿用主图规则后节点按鹰眼图 / 主图比例缩放、`box` 拖拽不再依赖缩放、增加与手动缩放互斥的跟随主图模式、`commitAddChannel` 直接接收新增对象、草稿示例点居中且可配、`auto` 范围跟相机改为默认关闭、补鹰眼图拖拽 demo,以及继承节点按两边视口尺寸而不是主图放大倍数缩放。
372
+
373
+ - **鹰眼图**:`minimap.js` 的 `inheritedSizeFactor()` 改用两边 CSS 视口宽高的较小比例,`inheritSize` 节点不再跟主图相机倍数变化;`extentFollowCamera` 默认 `false`,`extent: 'auto'` 默认保持「数据 ∪ 底图」;`zoomable` 三态为 `false` / `true` / `'follow'`,`followZoomScale` 控制跟随指数,手动缩放与跟随互斥,跟随档不接受 `setMinimapZoom` / `zoomMinimapBy` 抢控制;`dragAction: 'box'` 在关闭缩放时也可用。
374
+ - **新增通道**:`commitAddChannel` 增加对象入参,直接给通道 / 线路或 `{ channel, line, lines, ... }` 均可;对象字段优先、缺省续用草稿,直接线路的业务字段与样式透传到 `lineProps`,直接通道支持 `lineIds` / `groups` / `lineProps` / `channelProps`。草稿示例点固定在真实节点中心,`dots` 支持显隐 / 分端样式 / 尺寸 / 圆方形状,`channelDraftStyle.layer` 可设 `'below-points'` 让示例线压在真实节点下面。
375
+ - **Demo 与文档**:`ConnectDemo` 展示指定起点、示例点样式与对象直传;`MinimapDemo` 展示三态缩放、跟随指数、范围开关与框选 / 平移拖拽。同步 `README.md`、`docs/manual/03` / `10` / `14` / `16` / `17` / `18` / `21`、`docs/internals/13-鹰眼图.md`、`docs/steps/README.md` 和 `docs/demos/api-index.js`。
376
+ - **验证**:`selftest-full.html` **86** 条、`selftest-features.html` **672** 条、`selftest-demos.html` **349** 条、`selftest-docs.html` **134** 条,四页共 **1241** 条通过 / 0 失败;`npx tsc --noEmit`、`node --check`(minimap / create / engine)、`node docs/steps/gen-api-index.mjs --check`、`npm run check:docs`(257 个实例成员 / 96 个 options / 250 个数据字段 / 43 个事件 / 17 个功能开关)、`npm run build` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-23-增量鹰眼图缩放联动与新增通道示例节点)。
377
+
378
+ ### 2026-10-23 增量:鹰眼图继承要素尺寸与地图缩放解耦
379
+
380
+ 本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt` 三项:范围跟随相机默认关闭、补鹰眼图拖拽 demo、澄清继承节点 / 线路的尺寸语义。前两项已在当前工作树实现;本轮完成第三项,把继承尺寸与主图相机倍数彻底解耦。
381
+
382
+ - **继承线宽**:`resolveLineStyleInto()` 新增 `baseWidth`,`engine.getLineStyle(index)` 返回样式链原始线宽;`collectMinimapData()` 在未配自有 `lineRules` 时写入继承线宽并标记 `inheritWidth`,与节点的 `inheritSize` 一样乘两边 CSS 视口的较小比例。
383
+ - **缩放口径**:继承节点 = `pointSizeScale × 小图自身缩放指数 × 视口比例`,继承线路 = `lineWidthScale × 小图自身缩放指数 × 视口比例`;主图缩放不进入这两条公式,`pointMapZoomScale` / `lineMapZoomScale` 只作用于小图自有规则 / 样式。点 / 线路缓存键同步拆分这些系数,避免继承尺寸与主图倍数错误互相失效。
384
+ - **Demo 与文档**:`MinimapDemo` 默认沿用主图,提供节点 / 线路各自的整体倍数与小图缩放指数控件,保留框选 / 平移拖拽演示;主 demo 在沿用模式下禁用地图倍数联动。同步类型注释、根 `README.md`、`src/gis-view/README.md`、手册 `03` / `14`、内部文档 `13` 与生成的 `docs/demos/api-index.js`。
385
+ - **验证**:`selftest-full.html` **92** 条、`selftest-features.html` **672** 条、`selftest-demos.html` **351** 条、`selftest-docs.html` **134** 条,四页共 **1249** 条通过 / 0 失败;`npx tsc --noEmit`、`node --check`(minimap / create / engine / line)、`node docs/steps/gen-api-index.mjs --check`、`npm run check:docs`(257 个实例成员 / 96 个 options / 250 个数据字段 / 43 个事件 / 17 个功能开关)、`npm run build` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-23-增量鹰眼图继承要素尺寸与地图缩放解耦)。
386
+
387
+ ### 2026-10-23 增量(「修改.txt」三项:commitAddChannel 文档 / 传参示例 / 线路半跳过)
388
+
389
+ 本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `修改.txt` 三项:说明 `commitAddChannel` 的传参与写法、把方法用法和示例写详细、继续优化组件性能。
390
+
391
+ - **文档**:手册 `10` 补齐五种入参(无参 / 旧 resolution / 直接线路 / 直接通道 / 容器)、精确字段优先级与并组限制;明确草稿只认 `from`(没有 `to`)、直接通道 `id` 不是回线种子、`line` 与 `lines` 语义不同、空数组沿用草稿、容器不合并 `channel.lineProps`、方案读数只能取 `{ type, groupId, groupIndex, channelId }` 子集。`18` 增加逐项示例,`16` / `17` 与 `types.d.ts` 同步参数说明。
392
+ - **性能**:`engine.js` 新增线路半跳过;命中时复用上一轮线路解析结果与包围盒,跳过 `resolveLines` 及索引 / 虚线 / 层序 / 包围盒几趟。追加补线与增量改线维护线路半包围盒,`lineHalfOutOfSync` 负责失效兜底。20000 点 / 8000 线原样回灌中位 **14.3 → 6.3 ms**。
393
+ - **自测与文档**:`selftest-perf.html` 新增 3 条断言,锁住原样回灌、通道声明未变沿用派生折线、换骨架必须重推几何;性能页 **167** 条通过。性能记录同步到内部文档 `16-01` 的 16.37 与 `18` 的第十六轮。
394
+ - **验证**:五页自测 full **92** / features **672** / demos **351** / docs **134** / perf **167**,合计 **1416** 条通过 / 0 失败;`node --check`、`node docs/steps/gen-api-index.mjs`、`npm run check:docs`(257 个实例成员 / 96 个 options / 250 个数据字段 / 43 个事件 / 17 个功能开关)、`npx tsc --noEmit`、`npm run build` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-23-增量修改txt三项commitaddchannel-文档--传参示例--线路半跳过)。
395
+
330
396
  ## 六、怎么自己复查
331
397
 
332
398
  会话文件是逐行 JSON,不用整份读 —— 只挑两种行解析就够:`session_meta` 行里的 `payload.cwd` 认项目,`payload.type === 'user_message'` 行里的 `payload.message` 是用户原话:
@@ -432,7 +432,7 @@
432
432
  @media (max-width: 980px) {
433
433
  .hero { grid-template-columns: 1fr; }
434
434
  .topbar .tools { gap: 4px; }
435
- .tools a:nth-of-type(2) { display: none; }
435
+ .tools .doc-jump:not(:first-of-type), .tools .mobile-hide { display: none; }
436
436
  }
437
437
  #content { padding-bottom: 20px; }
438
438
  .api-group { margin: 0 0 30px; scroll-margin-top: 86px; }
@@ -451,6 +451,9 @@
451
451
  }
452
452
  .api-group > h2 b { margin-left: auto; padding: 2px 8px; border-radius: 999px; background: var(--card-2); font: 500 11px/1.6 ui-monospace, Consolas, monospace; }
453
453
  .group-index { color: var(--accent); font: 600 11px/1 ui-monospace, Consolas, monospace; letter-spacing: 0.04em; }
454
+ .group-manual { margin-left: auto; padding: 2px 7px; border: 1px solid var(--line); border-radius: 6px; color: var(--dim); font-size: 11px; text-decoration: none; }
455
+ .group-manual:hover { border-color: var(--accent); color: var(--accent); }
456
+ .api-group > h2 b { margin-left: 0; }
454
457
  .api-member {
455
458
  margin: 0 0 12px;
456
459
  padding: 16px 18px 17px;
@@ -551,10 +554,14 @@
551
554
  <span class="search-icon" aria-hidden="true">⌕</span>
552
555
  <input id="search" type="search" placeholder="搜索方法 / 参数 / 配置项(Ctrl+K)" />
553
556
  </label>
557
+ <a class="doc-jump" data-doc-jump="center" href="../index.html#GisView.md">文档中心</a>
558
+ <a class="doc-jump" data-doc-jump="methods" href="../index.html#manual/16-实例方法总表.md">实例方法</a>
559
+ <a class="doc-jump" data-doc-jump="params" href="../index.html#manual/17-参数速查.md">参数速查</a>
560
+ <a class="doc-jump" data-doc-jump="examples" href="../index.html#manual/18-逐方法示例.md">逐方法示例</a>
554
561
  <button id="theme-btn" type="button" title="跟随系统 / 浅色 / 深色 轮换(与文档中心共用选择)">主题:跟随系统</button>
555
562
  <button id="clear" type="button">清空</button>
556
- <a href="../playground/index.html">调试页 ↗</a>
557
- <a href="../../index.html" target="_blank" rel="noreferrer">Vue 演示 ↗</a>
563
+ <a class="mobile-hide" href="../playground/index.html">调试页 ↗</a>
564
+ <a class="mobile-hide" href="../../index.html" target="_blank" rel="noreferrer">Vue 演示 ↗</a>
558
565
  </div>
559
566
  </header>
560
567
  <main>
@@ -612,7 +619,7 @@
612
619
  "",
613
620
  "// 2. 改数据 / 改视角 / 读读数:都在左侧这 " + API_SUMMARY.members + " 个成员里",
614
621
  "view.updateLine('l1', { color: '#f00', width: 3 })",
615
- "view.focusOn('b', { padding: 60, select: true })",
622
+ "view.focusOn('b', { zoom: true, padding: 60, select: true })",
616
623
  "const snapshot = view.snapshotScene()"
617
624
  ].join('\n')
618
625
 
@@ -727,6 +734,11 @@
727
734
  ${member.examples.map(exampleHtml).join('\n')}
728
735
  </article>`
729
736
 
737
+ /** 文档中心的深链是 `#文件~小节`:从每张卡片直接跳回手册对应章节 */
738
+ const headingSlug = text => String(text).toLowerCase().replace(/[^\p{L}\p{N} -]/gu, '').replace(/ /g, '-')
739
+ const manualUrl = (file, slug = '') => `../index.html#${encodeURIComponent(file + (slug ? `~${slug}` : ''))}`
740
+ /** 左侧分组跳转用即时滚动:整页很长,平滑滚动要走好几秒 */
741
+ const scrollToGroup = node => node?.scrollIntoView({ behavior: 'auto', block: 'start' })
730
742
  let groupIndex = 0
731
743
  for (const section of API_SECTIONS) {
732
744
  const group = document.createElement('section')
@@ -734,7 +746,8 @@
734
746
  group.id = `group-${groupIndex}`
735
747
  group.dataset.group = String(groupIndex)
736
748
  const groupNumber = String(groupIndex + 1).padStart(2, '0')
737
- group.innerHTML = `<h2><span class="group-index">${groupNumber}</span><span>${escapeHtml(section.title)}</span><b>${section.items.length} 个</b></h2>` + section.items.map(memberHtml).join('\n')
749
+ const groupManual = manualUrl('manual/17-参数速查.md', headingSlug(section.title))
750
+ group.innerHTML = `<h2><span class="group-index">${groupNumber}</span><span>${escapeHtml(section.title)}</span><a class="group-manual" data-manual-group="${escapeHtml(section.title)}" href="${escapeHtml(groupManual)}">参数速查 ↗</a><b>${section.items.length} 个</b></h2>` + section.items.map(memberHtml).join('\n')
738
751
  root.appendChild(group)
739
752
  const side = document.createElement('button')
740
753
  side.type = 'button'
@@ -743,7 +756,7 @@
743
756
  side.innerHTML = `<span>${escapeHtml(section.title)}</span><b>${section.items.length}</b>`
744
757
  side.addEventListener('click', () => {
745
758
  setActiveGroup(String(groupIndex))
746
- group.scrollIntoView({ behavior: 'smooth', block: 'start' })
759
+ scrollToGroup(group)
747
760
  })
748
761
  sideList.appendChild(side)
749
762
  sideButtons.set(String(groupIndex), side)
@@ -756,7 +769,7 @@
756
769
  const optionsGroup = document.createElement('section')
757
770
  optionsGroup.className = 'api-group'
758
771
  optionsGroup.id = 'options'
759
- optionsGroup.innerHTML = `<h2><span class="group-index">${String(groupIndex + 1).padStart(2, '0')}</span><span>options</span><b>${API_OPTIONS.length} 个</b></h2><div class="option-table"><div class="option-head" role="row"><span>字段</span><span>类型</span><span>默认值</span><span>说明</span></div><div id="option-list"></div></div>`
772
+ optionsGroup.innerHTML = `<h2><span class="group-index">${String(groupIndex + 1).padStart(2, '0')}</span><span>options</span><a class="group-manual" data-manual-group="options" href="${escapeHtml(manualUrl('manual/03-配置项.md', 'options'))}">配置项手册 ↗</a><b>${API_OPTIONS.length} 个</b></h2><div class="option-table"><div class="option-head" role="row"><span>字段</span><span>类型</span><span>默认值</span><span>说明</span></div><div id="option-list"></div></div>`
760
773
  root.appendChild(optionsGroup)
761
774
  const optionList = optionsGroup.querySelector('#option-list')
762
775
  for (const option of API_OPTIONS) {
@@ -774,7 +787,7 @@
774
787
  sideOption.innerHTML = `<span>options</span><b>${API_OPTIONS.length}</b>`
775
788
  sideOption.addEventListener('click', () => {
776
789
  setActiveGroup('options')
777
- optionsGroup.scrollIntoView({ behavior: 'smooth', block: 'start' })
790
+ scrollToGroup(optionsGroup)
778
791
  })
779
792
  sideList.appendChild(sideOption)
780
793
  sideButtons.set('options', sideOption)
@@ -945,6 +958,7 @@
945
958
  state,
946
959
  setQuery,
947
960
  select: selectMember,
961
+ scrollToGroup: key => scrollToGroup(key === 'options' ? optionsGroup : members.find(entry => entry.node.closest('.api-group')?.dataset.group === String(key))?.node.closest('.api-group')),
948
962
  theme: () => themeMode,
949
963
  setTheme,
950
964
  cycleTheme,
@@ -399,7 +399,7 @@ const focusTarget = (target, label) => {
399
399
  if (!current) {
400
400
  return
401
401
  }
402
- current.focusOn(target, { padding: 64, maxZoom: 20 })
402
+ current.focusOn(target, { zoom: true, padding: 64, maxZoom: 20 })
403
403
  const camera = current.getCamera()
404
404
  focusReadout.value = `${label}:scale ${camera.scale.toPrecision(5)} · 中心 [${camera.center.map(value => Number(value).toFixed(3)).join(', ')}]`
405
405
  refreshSelection()