gis-view-webgl2 0.1.2 → 0.1.4
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.
- package/README.md +21 -14
- package/dist/gis-view.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +421 -76
- package/dist/index.js +1 -1
- package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +151 -0
- package/docs/GisView.md +4 -4
- 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 +137 -0
- package/docs/api/index.html +23 -9
- package/docs/demos/ApiCoverageDemo.vue +644 -0
- package/docs/demos/ChannelDemo.vue +14 -12
- package/docs/demos/ClusterDemo.vue +251 -0
- package/docs/demos/CopyMergeDemo.vue +3 -4
- package/docs/demos/EventDemo.vue +3 -3
- package/docs/demos/ExtensionDemo.vue +69 -12
- package/docs/demos/GisViewDemo.vue +64 -8809
- package/docs/demos/SearchFilterDemo.vue +13 -11
- package/docs/demos/api-index.js +58 -47
- package/docs/demos/demos.js +34 -17
- package/docs/demos/gis-view-demo/GisViewDemoCardHeader.vue +29 -0
- package/docs/demos/gis-view-demo/GisViewDemoDialogs.vue +82 -0
- package/docs/demos/gis-view-demo/GisViewDemoFooter.vue +16 -0
- package/docs/demos/gis-view-demo/GisViewDemoHeading.vue +16 -0
- package/docs/demos/gis-view-demo/GisViewDemoPanelStack.vue +71 -0
- package/docs/demos/gis-view-demo/GisViewDemoStage.vue +219 -0
- package/docs/demos/gis-view-demo/demo.css +1230 -0
- package/docs/demos/gis-view-demo/demoContext.js +12 -0
- package/docs/demos/gis-view-demo/panels/DataPanels.vue +303 -0
- package/docs/demos/gis-view-demo/panels/OpsPanels.vue +174 -0
- package/docs/demos/gis-view-demo/panels/StylePanels.vue +561 -0
- package/docs/demos/gis-view-demo/panels/ViewPanels.vue +396 -0
- package/docs/demos/gis-view-demo/useGisViewDemo.js +6188 -0
- package/docs/format/07-/344/272/213/344/273/266/350/275/275/350/215/267/344/270/216/347/244/272/344/276/213/346/225/260/346/215/256.md +3 -2
- package/docs/index.html +41 -4
- package/docs/internals/16-03-/344/274/230/345/214/226/344/270/216/345/217/226/350/210/215-/344/270/213.md +1 -1
- package/docs/manual/02-/345/235/220/346/240/207/344/270/216/346/225/260/346/215/256.md +3 -2
- package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +104 -16
- package/docs/manual/04-/344/272/213/344/273/266/344/270/216/345/233/236/350/260/203.md +15 -14
- package/docs/manual/07-/346/214/207/351/222/210/344/270/216/350/246/201/347/264/240/347/274/226/350/276/221.md +40 -3
- package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +50 -3
- package/docs/manual/09-/351/200/232/351/201/223/344/270/216/345/244/232/345/233/236/347/272/277.md +6 -2
- 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 +39 -7
- package/docs/manual/12-/346/240/207/347/255/276/344/270/216/350/243/205/351/245/260.md +13 -4
- package/docs/manual/13-/345/212/250/346/225/210/344/270/216/345/233/276/345/205/203.md +3 -0
- package/docs/manual/14-/350/247/206/345/233/276/344/270/216/347/255/233/351/200/211.md +121 -49
- package/docs/manual/15-/345/257/274/345/207/272/344/270/216/351/233/206/346/210/220.md +37 -3
- package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +17 -8
- package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +45 -25
- package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +91 -20
- 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
- package/docs/manual/20-/346/200/247/350/203/275/344/270/216/345/244/247/346/225/260/346/215/256.md +25 -1
- 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 -8
- package/docs/steps/README.md +17 -11
- package/docs/steps/selftest-actions.html +3 -5
- package/docs/steps/selftest-demo.html +27 -18
- package/docs/steps/selftest-demos.html +409 -32
- package/docs/steps/selftest-docs.html +33 -4
- package/docs/steps/selftest-effects.html +200 -0
- package/docs/steps/selftest-features.html +603 -21
- package/docs/steps/selftest-labels.html +74 -0
- package/docs/steps/selftest-perf.html +293 -20
- package/docs/steps/selftest-scale.html +150 -29
- package/docs/steps/selftest-select.html +90 -0
- package/docs/steps/step-10-full.js +1 -1
- package/docs/steps/step-12-events.js +1 -1
- package/package.json +1 -1
|
@@ -20,6 +20,27 @@
|
|
|
20
20
|
- **「拐点 / 分组跟后端怎么对接」**:[04 的超长会话](ai/04-重要问答选(二):交互性能与数据.md)(配套 demo `?demo=backend`)。
|
|
21
21
|
- **「某一轮到底改了什么」**:先看 [06 的会话索引](ai/06-会话索引与复查方法.md),再翻 [实现原理的逐轮记录](internals/15-01-逐轮记录-新增与修复.md)。
|
|
22
22
|
|
|
23
|
+
## 2026-10-21 增量:点聚合与大数据展示
|
|
24
|
+
|
|
25
|
+
这一轮仍是现有会话的继续增量,没有新建会话归档,因此不改 06 的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① 继续优化 gis-view 性能,保证大数据下的交互与渲染流畅性;② 为组件的全面性与功能性增加能力并补 Demo。本轮选择补**点聚合**,只改变展示与基于展示的拾取 / 快照 / 导出,不改原始 `points`、选中集或 `getData()`。
|
|
26
|
+
|
|
27
|
+
- **聚合配置与算法**:新增 `pointCluster?: boolean | GisViewPointClusterOptions`,`true` 使用缺省档;半径按 CSS 像素夹在 8 ~ 500(缺省 60),`minPoints` 最小为 2,`maxZoom` 为相对基准比例的上限(0 表示不限)。`cluster.js` 用固定屏幕网格只查相邻 9 格,成员用 `Int32Array` 链表串起,十万级建组仍是 O(n);平移复用成员,缩放、配置、数据或编辑状态变化才在下一帧开画前重算。
|
|
28
|
+
- **展示与拾取边界**:被聚合收起的原始点会从普通点批次、标签、拾取、框选、涟漪、装饰和导出中统一排除,聚合圆走独立批次并叠加数量文字;单成员保持原样。选中、拖动、合并和复制预览中的点强制单成员,不会被旁边的聚合圆吞掉。点击聚合圆只发 `clusterClick` / `onClusterClick`,载荷含 `count` / `pointIds` / `bounds`,不触发普通 `click`,也不选中内部节点。
|
|
29
|
+
- **读数与导出**:`getClusters()` 返回当前展示组(含 `count: 1` 的单成员),`getPointCluster()` 返回 `{ enabled, radius, minPoints, maxZoom, active }`;`getStats()` 增加 `clusterCount` / `clusterPointCount` / `clusterMs`,`listPoints({ visibleOnly: true })` 会跳过被聚合收起的成员、传 `false` 仍列全。PNG / SVG 导出与矢量快照都按当前聚合展示绘制圆和数量文字,原始数据与业务导出保持原语义。
|
|
30
|
+
- **Demo 与性能入口**:`docs/demos/ClusterDemo.vue` 注册为 `?demo=cluster`(性能组),可现场切换 2 千 / 1.2 万 / 6 万 / 10 万点,调开关、半径、最少点数与 `maxZoom`,重建或适应当前数据,并展示聚合耗时、圆数与点击载荷。
|
|
31
|
+
- **核心文件**:`src/gis-view/cluster.js`(新增)、`src/gis-view/engine.js`、`src/gis-view/create.js`、`src/gis-view/overlay.js`、`src/gis-view/svg.js`、`src/gis-view/events.js`、`src/gis-view/gis-view.css`、`src/gis-view/types.d.ts`、`docs/demos/ClusterDemo.vue`、`docs/demos/demos.js`、`docs/steps/selftest-perf.html`、`docs/steps/selftest-demos.html`、`docs/manual/03` / `04` / `16` / `17` / `18` / `20`、`docs/GisView.md`、`docs/steps/README.md`、根 `README.md`、`src/gis-view/README.md` 与 `docs/demos/api-index.js`(生成物)。
|
|
32
|
+
- **验证**:`selftest-perf.html` 新增 19 条聚合断言(归一化、1.2 万点建组与统计、原始数据不变、`visibleOnly` 排除成员、拾取 `type=cluster`、点击语义、`maxZoom` 展开、关闭恢复),136 → **155** 条 / 0 失败;`selftest-demos.html` 新增 8 条,297 → **305** 条 / 0 失败;`selftest-docs.html` 130 条,全部 14 个自测页共 **2121** 条通过 / 0 失败。`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(**251** 个成员 / **248** 个方法 / **247** 个数据字段 / **93** 个 options / **18** 个功能开关 / **43** 个事件 / **16** 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-21-增量大数据展示与点聚合)。
|
|
33
|
+
|
|
34
|
+
## 2026-10-21 增量:大数据性能收口与 Canvas 标签模式
|
|
35
|
+
|
|
36
|
+
这一轮仍是现有会话的继续增量,没有新建会话归档,因此不改 06 的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① 继续优化 gis-view 性能,确保大数据下的交互与渲染;② 标签已有 `auto` / `dom`,新增 `canvas` 渲染方式。
|
|
37
|
+
|
|
38
|
+
- **模式扩展**:顶层 `labelRender` 从 `'auto' | 'dom'` 扩为 `'auto' | 'canvas' | 'dom'`。`auto` 保持原行为:只在强制显示档下,节点层 / 线路层各自达到 **1024** 条可画布纯文本才自动画布化;显式 `canvas` 不受数量阈值限制,优化档与密集档也使用画布。
|
|
39
|
+
- **优化策略不绕过**:`canvas` 仍遵守 `maxCount` / `when` / `scanLimit` / `overlapMode` 等配置。优化档的避让碰撞框、节点换锚点与线路沿线换位直接取画布记录的文字宽高,不创建、也不读取标签 DOM;需要 DOM 的 `html: true`、函数返回元素、可拖拽 / 可编辑与 Canvas 画不全的样式继续逐条建节点,可与画布混排。
|
|
40
|
+
- **性能收口**:画布文字测量按「字体 + 样式 + 文案」缓存(上限 8192 项),1100 条同文案不用逐条 `measureText`;平移、缩放、拖节点 / 线路与悬停半径变化的连续重绘用 `requestAnimationFrame` 合并到下一帧;绘制前按视口剔除屏外标签,旋转标签按外接圆并计入整层平移;销毁时取消尚未执行的画布帧。线路画布标签换位后同步刷新 `lineLabelMeta`,函数内容无法保证文字同步时保守放弃沿线回退。
|
|
41
|
+
- **核心文件**:`src/gis-view/overlay.js`、`src/gis-view/create.js`、`src/gis-view/types.d.ts`、`docs/steps/selftest-labels.html`、`docs/manual/03-配置项.md`、`docs/manual/12-标签与装饰.md`、`docs/manual/20-性能与大数据.md`、`docs/steps/README.md`、根 `README.md`、`src/gis-view/README.md` 与 `docs/demos/api-index.js`(生成物)。只扩展已有 option 的合法值,没有增删实例成员 / options / 数据字段,计数保持 **249 / 246 / 245 / 92**。
|
|
42
|
+
- **验证**:`selftest-labels.html` 新增 4 条断言(1100 条同文案 `measureText` ≤ 2 次、同一任务连续 5 次缩放只重绘 1 ~ 2 次、显式画布在优化档遵守 `maxCount: 200`、6 条线路标签全部进画布且 DOM 为 0),161 → **165** 条 / 0 失败;14 个自测页共 **2101** 条通过 / 0 失败。`node --check`、`npx tsc --noEmit`、`npm run check:docs`(249 个成员 / 246 个方法 / 245 个数据字段 / 92 个 options / 18 个功能开关 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。
|
|
43
|
+
|
|
23
44
|
## 2026-10-20 增量:装饰位置来源与吸附关系解耦
|
|
24
45
|
|
|
25
46
|
这一轮仍是现有会话的继续增量,没有新建会话归档,因此不改 06 的 39 条会话统计。需求原话来自仓库根目录的 `修改.txt`:① 修改装饰 Demo,吸附方式只有「跟随 / 固定」,跟随也能选鼠标位置,固定也能选与跟随一样的设置,两种方式的区别只是落地后跟随或固定,可添加的位置完全一样;② 继续检查组件有没有可简化优化的地方,可以破坏原有语义。
|
|
@@ -213,3 +234,133 @@
|
|
|
213
234
|
- **demo 与后端**:`docs/demos/ChannelDemo.vue` 增加选中模式、拖动模式下拉和「准备两分组拐点」按钮;通道拐点后端请求同时提交 `path` 与 `waypointOffsets`,协议文档 `docs/接口协议.md` 的 5.1 / 5.2 / 6.3 与后端落库清单同步说明两段必须一起落库、一起返回。
|
|
214
235
|
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/create.js`、`src/gis-view/types.d.ts`、`docs/demos/ChannelDemo.vue`、`docs/steps/selftest-features.html`、`docs/steps/selftest-demos.html`、`docs/manual/02` / `03` / `08` / `09` / `10` / `21`、`docs/format/03` / `04`、`docs/接口协议.md`、`docs/steps/README.md`、根 `README.md`、`src/gis-view/README.md` 与 `docs/demos/api-index.js`(生成物)。
|
|
215
236
|
- **验证**:`selftest-features.html` 新增 8 条(3 条 Ctrl 加点高亮范围 + 5 条 `vertex` 偏移 / 邻点 / 分组隔离 / 导出路由),603 → **611** 条 / 0 失败;`selftest-demos.html` 新增 1 条,296 → **297** 条 / 0 失败;`selftest-labels` 161、`selftest-docs` 130,四页共 **1199** 条通过 / 0 失败。`node --check`、`npx tsc --noEmit`、`npm run check:docs`(249 个成员 / 246 个方法 / 245 个数据字段 / 92 个 options / 18 个功能开关 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-21-增量修改txt两条ctrl-加点高亮范围--分组拐点拖动模式)。
|
|
237
|
+
|
|
238
|
+
## 2026-10-21 增量:动效、热力图与鹰眼图性能
|
|
239
|
+
|
|
240
|
+
本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① 继续优化组件和性能;② 优化动画效果和性能;③ 优化热力图效果和性能;④ 优化鹰眼图效果和性能。
|
|
241
|
+
|
|
242
|
+
- **动画**:`engine.js` 为配了动点的线路单独维护 `lineEffectRuns` / `lineEffectRunByIndex`,`updateLineEffects()` 每帧不再遍历全部 `resolvedLines`;线路路径就地变化时同步重算该条总长、包围盒与每个动点的 `motion.total`,拖动端点 / 拐点或通道骨架重排后仍按新弧长采样。多层阴影槽位合并成一次 `bufferSubData`。
|
|
243
|
+
- **热力图**:`heatmap.js` 新增 `styleKey()` / `weightKey()`,`updateOptions({ heatmap })` 区分色带 / 尺寸 / 字段 / 值域变化:只改 `density.opacity`、`layer` 不重采也不重烤,换色带 / 核参数复用采样重烤,字段 / 值域变化才重新采样。`engine.js` 维护要素采样缓存与几何脏标记;`updatePoint` / `updateLine` 只在坐标、权重或通道宽度变化时标脏,追加节点 / 线路、拖点、拖拐点、通道骨架变化都会补标记;拖动期间延迟到停手统一补烤。密度场关闭时也记账,重新开启不会复用旧要素。
|
|
244
|
+
- **鹰眼图**:`minimap.js` 将线路放进独立离屏层 `lineLayer` / `lineContext`,缓存键覆盖尺寸、范围、投影、倍率与样式;`create.js` 的 `collectMinimapData()` 复制路径时顺路记录线路包围盒,完全在小图视野外的线路不投影、不建路径。`applyLayout()` 仅在像素尺寸实际变化时重设 canvas 尺寸,点层缓存键补上 `ratio`,线路层合成时临时开启平滑、画点层前恢复。
|
|
245
|
+
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/heatmap.js`、`src/gis-view/minimap.js`、`src/gis-view/create.js`、`docs/steps/selftest-effects.html`、`docs/steps/selftest-perf.html`、`docs/steps/selftest-demos.html`、`docs/manual/13-动效与图元.md`、`docs/manual/14-视图与筛选.md`、`docs/manual/20-性能与大数据.md`、`docs/steps/README.md`。
|
|
246
|
+
- **验证**:`selftest-effects.html` 83 → **87** 条、`selftest-perf.html` 155 → **162** 条、`selftest-demos.html` 305 → **308** 条;14 个自测页共 **2135** 条通过 / 0 失败。`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(251 个成员 / 248 个方法 / 247 个数据字段 / 93 个 options / 18 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。公开 API 未变,`minimap.getPaintStats()` 只供自测,不进入公开接口。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-21-增量动效热力图与鹰眼图性能)。
|
|
247
|
+
|
|
248
|
+
## 2026-10-22 增量:动效、热力图与鹰眼图显示优化
|
|
249
|
+
|
|
250
|
+
本轮仍是现有会话的继续增量,没有新建会话归档,因此不改 06 的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① 优化动画显示效果;② 优化热力图显示效果;③ 优化鹰眼图显示效果。
|
|
251
|
+
|
|
252
|
+
- **动画**:`engine.js` 为线路动点增加独立拖尾批次,按 28 CSS 像素折算世界距离并拆成 4 段线性渐隐;拖尾颜色跟随动点、线宽逐段收细,每帧随弧长重写专用缓冲,不再因高倍缩放把世界长度误判成零。绘制顺序压在线路与圆头之上、节点涟漪与图标之下,拖影不会被节点盖住。
|
|
253
|
+
- **热力图**:`density.js` 的平滑 / 分档色带统一写预乘 alpha;`shaders.js` 的图片片元着色器新增 `u_premultiplied`,整层不透明度同时作用于 RGB;`engine.js` 的密度场改用 `ONE / ONE_MINUS_SRC_ALPHA` 合成。LINEAR 过滤在透明外缘不再混入黑色,外圈保持原色相淡出。
|
|
254
|
+
- **鹰眼图**:`minimap.js` 的节点像素改为按像素中心到圆 / 方边界的覆盖率写入,并对重叠节点做 source-over 合成,小节点和高分屏下不再出现硬锯齿;线路端点补 `lineCap = 'round'`,折线接头与主视图圆头观感一致。
|
|
255
|
+
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/density.js`、`src/gis-view/shaders.js`、`src/gis-view/minimap.js`、`docs/steps/selftest-effects.html`、`docs/steps/selftest-perf.html`、`docs/steps/selftest-demos.html`。
|
|
256
|
+
- **验证**:`selftest-effects.html` 87 → **88** 条、`selftest-perf.html` 162 → **163** 条、`selftest-demos.html` 308 → **309** 条;14 个自测页共 **2138** 条通过 / 0 失败。`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(251 个成员 / 248 个方法 / 247 个数据字段 / 93 个 options / 18 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。公开 API 与文档计数均未变。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-22-增量动效热力图与鹰眼图显示优化)。
|
|
257
|
+
## 2026-10-22 增量:移除 zoomScaleAuto 并新增 fitSpacing
|
|
258
|
+
|
|
259
|
+
本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① `zoomScaleAuto` 有什么用、能否删除;② 远处孤立节点撑大包围盒后主体节点过挤,增加开关与最小节点间距参数,按间距调整内部比例。
|
|
260
|
+
|
|
261
|
+
- **移除自适应比例开关**:确认 `zoomScaleAuto` 只是给没写的 `pointZoomScale` / `lineZoomScale` 兜底成 `1`,无法解决「多一个远处节点就把主体压小」的问题,因此连同 `zoomExponent` 与指数 `null` 哨兵一起删除;联动指数恢复缺省 `0`,显式写多少就按多少算。`getZoomBaseScale()` / `setZoomBaseScale()` 保留。
|
|
262
|
+
- **新增 fitSpacing**:`fitSpacing?: boolean | GisViewFitSpacingOptions`,`true` 等价于 `{ minDistance: 24, maxZoom: 0 }`。普通适应后按筛选 / 隐藏后可见节点的最近正中心距反推比例,`maxZoom` 为正数时限制相对普通适应比例的倍数,`0` 表示不限且仍受 `maxScale` 约束。相机中心改用可见节点 x / y 中位数,远处孤立点允许落到视口外;只在首次默认适应与 `fitView()` 生效,显式 `initialView.scale` / `zoom` 优先。`updateOptions({ fitSpacing })` 不移动相机,需要再调 `fitView()`。
|
|
263
|
+
- **实现与 demo**:`utils.js` 的 `measurePointSpacing()` 用 y 序相邻点上界、x 序扫描与比较预算求最近正距离,避免全量 O(n²) 并跳过重合坐标;`engine.js` 把调整串进默认适应与 `fitView()`,`create.js` 把 `fitSpacing` 归入展示类热更新。`GisViewDemo.vue` 的样式面板增加开关、最小中心距与最大放大输入,修改后即时 `fitView()` 便于对照。
|
|
264
|
+
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/utils.js`、`src/gis-view/create.js`、`src/gis-view/types.d.ts`、`docs/demos/GisViewDemo.vue`、`docs/steps/selftest-scale.html`、`docs/steps/README.md`、`docs/GisView.md`、`docs/api/index.html`、`docs/demos/api-index.js`(生成物)、`docs/manual/02` / `03` / `14` / `16` / `17` / `18` / `21`、`docs/internals/16-03-优化与取舍-下.md`。
|
|
265
|
+
- **验证**:14 个自测页共 **2138** 条通过 / 0 失败;其中 `selftest-scale.html` 输出 113 条结果,**107 PASS / 0 FAIL / 6 DIAG**;新增的 6 条 `fitSpacing` 断言全部通过(配置回显 / 孤立点下提高比例且忽略重合点 / 中位中心 / 24px 屏幕间距 / `maxZoom` 上限 / 关闭恢复),关键读数 `0.0224 → 0.24`、中心 `[50, 50]`、间距 `24`、上限 `0.0224 → 0.0448`、关闭恢复 `0.0224`。`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(251 个实例成员 / 93 个 options / 247 个数据字段)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-22-增量移除-zoomscaleauto-并新增-fitspacing)。
|
|
266
|
+
|
|
267
|
+
## 2026-10-22 增量:fitSpacing 居中修正与 GisViewDemo 拆分
|
|
268
|
+
|
|
269
|
+
本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① 优化 `fitSpacing` 的放大效果,按两个最近节点的最小距离处理并居中;② 把 `GisViewDemo.vue` 拆分成多个组件,放进一个文件夹。
|
|
270
|
+
|
|
271
|
+
- **fitSpacing**:`measurePointSpacing()` 在求最近正中心距时同时记住这一对节点,返回 `{ distance, center }`,`center` 改为最近节点对的中点;`engine.js` 仍按 `minDistance / distance` 提高比例,但相机中心落到这对节点的中点。重合坐标不参与、远处孤立点允许出屏,`maxZoom` / `maxScale` 与显式 `initialView.scale` / `zoom` 的优先级不变。
|
|
272
|
+
- **Demo 拆分**:`docs/demos/GisViewDemo.vue` 只保留入口编排与 `provide`,新目录 `docs/demos/gis-view-demo/` 收纳 `useGisViewDemo.js`(状态与动作)、`demoContext.js`、`demo.css`、页头 / 说明 / 面板栈 / 舞台 / 弹框 / 页脚组件,以及 `panels/` 下的 `ViewPanels` / `StylePanels` / `DataPanels` / `OpsPanels`。面板按原页签分组,DOM 类名与 `data-demo` 钩子保持不变。
|
|
273
|
+
- **兼容与样式**:根组件 `setupState` 继续暴露 `viewRef`、`channelReadyPayload` 和既有自测读取的 demo 读数;舞台容器仍用字符串模板 ref,避免 ref 自动解包成 `null`。原 scoped 样式移到 `demo.css` 并统一加 `.gis-view-demo` 命名空间,Teleport 弹层增加同名容器,避免污染其他演示。
|
|
274
|
+
- **文档**:同步 `docs/manual/03` / `14`、`docs/steps/README.md`、`src/gis-view/types.d.ts` 与 `docs/steps/selftest-scale.html`;`selftest-scale` 增加最近节点对中点与居中放大断言,`docs/steps/README.md` 记为 114 条(108 PASS + 6 DIAG)。
|
|
275
|
+
- **验证**:`selftest-scale.html` **108 PASS / 0 FAIL / 6 DIAG**(114 条结果);14 个自测页共 **2139** 条通过 / 0 失败(`selftest-demo` 132、`selftest-demos` 309)。`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(251 个实例成员 / 248 个方法 / 247 个数据字段 / 93 个 options / 18 个功能开关 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-22-增量fitspacing-居中修正与-gisviewdemo-拆分)。
|
|
276
|
+
|
|
277
|
+
## 2026-10-22 增量:fitSpacing 居中、级联高亮与 forward
|
|
278
|
+
|
|
279
|
+
本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① 优化 `fitSpacing`,放大时围绕中心;② 新增独立级联高亮,点节点亮自身、直连线路与另一端节点,点线路 / 通道亮两端,可只亮节点或同时亮线路,样式独立配置并能读取当前高亮;③ 线路新增 `forward`,默认 `true`,写 `false` 时装饰、方向箭头和动画反向;④ 合并 `onContextMenu` / `onChannelContextMenu`,只保留 `onContextMenu` 并补齐类型。工作区未发现随附的参考图片,本轮按问题文本实现。
|
|
280
|
+
|
|
281
|
+
- **fitSpacing**:`utils.js` 的 `measurePointSpacing()` 在最近正中心距出现并列时(规则网格最常见),优先选择「节点对中点离数据中心最近」的一对;数据中心取所有可见节点 x / y 的中位数,不会被远处孤立点拉偏。非并列时仍是最近节点对,相机仍居中到选中节点对的中点,`minDistance` / `maxZoom` / `maxScale` 与显式 `initialView` 口径不变。
|
|
282
|
+
- **级联高亮**:`engine.js` 新增独立于选中集的 `cascadeHighlight` 状态。`true` 等价于 `{ scope: 'both' }`,对象支持 `scope: 'points' | 'both'`、`pointStyle`、`lineStyle`、`clearOnEmptyClick`、`enabled`;点节点亮自身、直连线路和另一端节点,点线路 / 通道回线只亮两端节点。新增 `onCascadeHighlight`、总线事件 `cascadeHighlight` 与只读方法 `getCascadeHighlight()`,三者与内部读数同源;点空白、关开关、来源被删 / 隐藏或数据刷新后失效时自动收掉。级联样式不依赖选中 / 悬停样式;显式选中样式仍优先,未配置选中样式时不会把级联样式吞掉。
|
|
283
|
+
- **线路 forward**:`GisViewLine.forward?: boolean` 默认 `true`,表示从 `from` / `path[0]` 走向 `to` / `path[last]`。写 `false` 时装饰位置与朝向、静态方向箭头、线路动点与拖尾都反向;它与 `effect.reverse` / `direction.reverse` 是异或关系,且不改写 `path`。`line.js` 的路径定位与 `effect.js` 的弧长采样统一接收有效方向,`updateLine({ forward })` 即时生效。
|
|
284
|
+
- **右键统一**:`onContextMenu(payload, event)` 成为唯一右键回调,取消 `onChannelContextMenu` / `channelContextMenu` 与 `channelMenu` 功能开关。命中通道回线时仍走同一条回调,载荷顶层保留 `lineId` / `lineIndex`,并附 `channelContext`(组数 / 当前分组 / 分组列表 / 可用交互);`action.target` 为 `channel`、`action.data` 为通道定义。功能开关由 18 降到 17,ChannelDemo / GisViewDemo / EventDemo 与路径步骤页同步改读统一载荷。
|
|
285
|
+
- **文档与自测**:同步 `README.md`、`src/gis-view/README.md`、`docs/GisView.md`、`docs/manual/02` / `03` / `04` / `07` / `10` / `14` / `16` / `17` / `18` / `21`、`docs/format/07`、`docs/steps/README.md`;重新生成 `docs/demos/api-index.js`。新增断言覆盖 `fitSpacing` 并列居中、级联节点 / 线路 / 通道 / 空白 / scope / 独立样式 / 开关与快照、`forward` 默认值与四种反向组合、统一右键的 `channelContext`。
|
|
286
|
+
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/create.js`、`src/gis-view/line.js`、`src/gis-view/effect.js`、`src/gis-view/utils.js`、`src/gis-view/types.d.ts`、`src/gis-view/features.js`、`src/gis-view/events.js`、`src/gis-view/README.md`、`docs/demos/**`、`docs/manual/**`、`docs/format/07-事件载荷与示例数据.md`、`docs/steps/selftest-{features,effects,scale,actions,demos,docs}.html`、`docs/steps/README.md`、根 `README.md`。
|
|
287
|
+
- **验证**:14 个自测页共 **2160** 条通过 / 0 失败(`selftest-features` 621、`selftest-effects` 96、`selftest-demos` 309、`selftest-scale` 115 条结果 = 109 PASS + 6 DIAG);`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(252 个成员 / 249 个方法 / 248 个数据字段 / 94 个 options / 17 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-22-增量fitspacing-居中级联高亮与-forward)。
|
|
288
|
+
|
|
289
|
+
## 2026-10-22 增量(「问题.txt」三条:合并样式说明 / 级联高亮 Demo / 筛选后的通道宽度)
|
|
290
|
+
|
|
291
|
+
本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:① 说明「合并样式」是什么、有什么用;② 把上一轮的点击级联高亮补进 Demo;③ 排查 `setFilter` 为什么有时会让仍在显示的通道宽度发生变化。工作区未发现随附的参考图片,第 ③ 条按问题文字和现有锚点逻辑复现。
|
|
292
|
+
|
|
293
|
+
- **合并样式说明**:确认它不是额外配置或新 API,而是 `mergePoints()` 合并后最终写进保留节点的 `size` 与 `symbol`:尺寸取双方较大值,图标优先目标节点;需要自定义时改写 `merge.createItem()` 返回值或 `payload.item`。Demo 的合并读数加上「合并样式:」前缀,并在复制与合并面板补了规则与改写入口提示。
|
|
294
|
+
- **级联高亮 Demo**:综合示例的「视图 · 交互 → 交互开关与快捷键」面板新增级联高亮开关、「节点 + 直连线路 / 只亮节点」范围下拉、`getCascadeHighlight()` 读数与 `onCascadeHighlight` 载荷展示;可现场切换并确认它与选中集独立。
|
|
295
|
+
- **筛选后的通道宽度**:根因是 `channelNodeWidthFor()` 只从 `pointByIndex` 取节点外框,被 `setFilter` 隐藏的端点不在该表里,于是单端隐藏时改按另一端尺寸取宽,两端都隐藏时退回默认 `width`。`engine.js` 现在通过 `filteredAnchorIndexById` 补取被筛锚点,并用按数据下标缓存的外框尺寸走同一条「点自身 > 规则 > pointStyle」样式链(保留热力倍率,不叠临时的悬停 / 选中状态);数据、样式链或隐藏集合变化时清缓存。只有节点真删除或 `visible: false` 才按没有节点处理。
|
|
296
|
+
- **核心文件**:`src/gis-view/engine.js`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`docs/demos/gis-view-demo/panels/ViewPanels.vue`、`docs/manual/07-指针与要素编辑.md`、`docs/manual/09-通道与多回线.md`、`docs/manual/14-视图与筛选.md`、`docs/steps/selftest-features.html`、`docs/steps/selftest-demos.html`、`docs/steps/README.md`。
|
|
297
|
+
- **验证**:`selftest-features.html` 621 → **625** 条、`selftest-demos.html` 309 → **314** 条、`selftest-docs.html` **130** 条,三页全部通过 / 0 失败;`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(252 个成员 / 249 个方法 / 248 个数据字段 / 94 个 options / 17 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。公开 API 与文档计数均未变。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-22-增量问题txt三条合并样式说明--级联高亮-demo--筛选后的通道宽度)。
|
|
298
|
+
|
|
299
|
+
## 2026-10-22 增量(「问题.txt」四条:筛选恢复 / focusOn 类型 / 程序化选中 / 线路跟随开关)
|
|
300
|
+
|
|
301
|
+
本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的最新 `问题.txt`:① 修复通道被筛选后重新出现时的错位;② 让 `focusOn` 能明确聚焦节点 / 线路 / 通道 / 分组,并统一放大比例;③ 补齐节点、线路、通道、分组与拐点的程序化选中;④ 新增线路是否跟随节点的开关。工作区未发现随附参考图片,第 ① 条按问题文字与真实 `new.json` 临时复现验证。
|
|
302
|
+
|
|
303
|
+
- **筛选恢复后的通道**:`engine.js` 在线路解析完成、成员线宽表更新之后调用 `reflowChannelWidths(channels)`,按最新线宽重算通道偏移与回线路径;筛选隐藏再恢复时不再沿用筛掉成员期间的旧切点间距。真实 `new.json` 临时复现页 3/3 PASS,临时页验证完已删除。
|
|
304
|
+
- **focusOn 类型与缩放**:`focusOn` 支持显式 `type: 'point' | 'line' | 'channel' | 'group'`;字符串 / 数字仍按「先节点、再线路」兼容,同 id 用 `type` 消歧;通道可写 `{ channelId }` 或显式 `type: 'channel'`,分组写 `{ type: 'group', channelId?, groupId }`,全局唯一 `groupId` 可省略通道。四类目标都解析成范围后交给 `zoomToBounds`,没有单独放大倍率。
|
|
305
|
+
- **程序化选中**:`selectFeatures` 支持分组写法(`type: 'group'` 与全局唯一 `groupId`)。新增 `selectWaypoint('line-1', 2)` / `{ lineIndex, pathIndex }` / `{ lineId, pathIndex }` / `null`,有效拐点会同时选中所在线路;找不到线路或可编辑拐点时不会凭空选中拐点。
|
|
306
|
+
- **线路跟随节点**:新增 `lineFollowsNode`,默认 `true`。关闭后隐藏、删除、筛选只影响节点,线路 / 通道停在最后一个已知坐标与解析尺寸;筛选未显式写 `cascade` 时默认不级联,显式 `cascade` 始终优先。`updateOptions` 动态切换会按新口径重算当前筛选,并支持 true → false → true 的状态恢复。
|
|
307
|
+
- **核心文件**:`src/gis-view/create.js`、`src/gis-view/engine.js`、`src/gis-view/filter.js`、`src/gis-view/filter-runner.js`、`src/gis-view/filter.worker.js`、`src/gis-view/types.d.ts`、`docs/steps/selftest-features.html`、`docs/steps/selftest-demos.html`、`docs/steps/selftest-docs.html`、`docs/manual/03` / `08` / `09` / `14` / `16` / `17` / `18`、`docs/demos/api-index.js`(生成物)、根 `README.md`、`src/gis-view/README.md` 与 `docs/steps/README.md`。
|
|
308
|
+
- **验证**:`selftest-features.html` **662** 条、`selftest-demos.html` **314** 条、`selftest-docs.html` **130** 条,共 **1106** 条通过 / 0 失败;`npx tsc --noEmit`、`npm run check:docs`(实例成员 **253** = 方法 **250** + 属性 3,options **95**,数据字段 **249**)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-22-增量问题txt四条筛选恢复--focuson-类型--程序化选中--线路跟随开关)。
|
|
309
|
+
|
|
310
|
+
## 2026-10-22 增量:预指定通道起点、导出范围、级联触发与筛选宽度
|
|
311
|
+
|
|
312
|
+
本轮仍是现有会话的继续增量,没有新建会话归档,因此不改 06 的 39 条会话统计。需求原话来自仓库根目录的 `问题.txt`:第 0 条让 `beginAddChannel` 可以直接指定起点;第 1 条让 `exportImage` 支持当前视口 / 全部内容;第 2 条要求把方法与配置项的参数写到逐项可读;第 3 条要求级联样式只作用于邻接项、直接选中仍走 select,并让框选 / 多选各自决定是否触发级联;第 4 条继续排查筛选后的通道宽度。
|
|
313
|
+
|
|
314
|
+
- **预指定起点**:`GisViewChannelDraftOptions` 新增 `from?: GisViewPointRef`。引擎按 id、被筛锚点、数字下标依次解析,合法时草稿直接进入 `phase: 'from'`,下一次点节点只选终点;`continueAddChannel({ from })` 也支持换起点,优先级为显式 `from` > 连续新增的 `chain` 上一段终点。找不到节点时草稿不开始并报 warning,原有两次点击流程不变。
|
|
315
|
+
- **导出范围**:`GisViewExportImageOptions` 新增 `scope: 'viewport' | 'all'` 与 `padding`。`'viewport'` 保持原行为;`'all'` 保存当前相机,临时 `zoomToBounds(engine.getBounds(), padding)` 后重排标签 / 扩展图形,PNG 与 SVG 都按该视角出图,`finally` 恢复相机、标签、图形层与鹰眼图。非法 `scope` 直接抛错。
|
|
316
|
+
- **级联样式与触发**:直接选中的节点 / 线路只走 select / multiSelect / boxSelect 对应的样式,没配就保持普通外观,不再回落到悬停或级联样式;级联的 `pointStyle` / `lineStyle` 只作用于邻接项。新增 `triggerOnClick`(缺省 `true`)、`triggerOnMultiSelect`(缺省 `true`)、`triggerOnBoxSelect`(缺省 `false`);关掉的路径只改选中集并收掉旧级联,框选打开时按整框命中项取邻接并集,`origin` 取第一个命中项。
|
|
317
|
+
- **筛选后的通道宽度**:通道锚点宽度缓存改为 `channelAnchorSpans`,可见节点与被筛节点统一走「点自身 > 规则 > pointStyle」的中性尺寸链并保留热力倍率,不再混入悬停 / 选中 / 框选 / 级联的临时尺寸。`updatePoint` 显式失效对应缓存;`setFilter` 隐藏单端、双端或叠加选中样式时,仍显示的通道与保留的分组回线保持原宽度和车道。
|
|
318
|
+
- **参数文档**:同步 `docs/manual/03` / `07` / `10` / `15` / `16` / `17` / `18`,补全 `cascadeHighlight` 子字段、`GisViewChannelDraftOptions` 逐项表、`exportImage` 全部 options 与示例,并修正“未配选中样式会回退”的过期表述。
|
|
319
|
+
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/create.js`、`src/gis-view/types.d.ts`、`docs/manual/03-配置项.md`、`docs/manual/07-指针与要素编辑.md`、`docs/manual/10-通道编辑与新增.md`、`docs/manual/15-导出与集成.md`、`docs/manual/16-实例方法总表.md`、`docs/manual/17-参数速查.md`、`docs/manual/18-逐方法示例.md`、`docs/steps/selftest-features.html`、`docs/demos/api-index.js`(生成物)、`docs/AI对话汇总.md`、`docs/ai/06-会话索引与复查方法.md`。
|
|
320
|
+
- **验证**:`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(252 个成员 / 249 个方法 / 248 个数据字段 / 94 个 options / 17 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过;`node scripts/run-selftests.mjs selftest-features.html selftest-demos.html selftest-docs.html` 为 features **646** / demos **314** / docs **130**,共 **1090** 条通过 / 0 失败。公开 API 与文档计数未变。复查入口见 [06 的增量记录](ai/06-会话索引与复查方法.md#2026-10-22-增量预指定通道起点导出范围级联触发与筛选宽度)。
|
|
321
|
+
|
|
322
|
+
## 2026-10-22 增量:接口能力 demo、API 细节与 fitSpacing 中心修正
|
|
323
|
+
|
|
324
|
+
本轮仍是现有会话的继续增量,没有新建会话归档,因此不改上表的 39 条会话统计。需求原话来自仓库根目录的 `修改.txt` 六项:① 把 `triggerOnBoxSelect` 等级联触发开关在 demo 中体现;② 对照组件全部能力,为 demo 尚未体现的方法与属性补演示;③ 写细 API 方法入参与响应说明;④ 补关联文档互跳;⑤ 排查 `fitSpacing` 开启后为何不是围绕中心放大;⑥ 继续依据最近修改优化组件性能。
|
|
325
|
+
|
|
326
|
+
- **接口能力 demo**:新增 `docs/demos/ApiCoverageDemo.vue` 与 `api-coverage`「接口能力」页签,演示总数变为 **22**(21 个功能 + 综合)。同屏覆盖级联高亮的单击 / 多选 / 框选三种独立触发,节点 / 线路 / 通道 / 分组 / 拐点的程序化选中,`point` / `line` / `channel` / `group` 四类 `focusOn`,`lineFollowsNode`,以及坐标互转、视口 / 渲染器、场景快照、样式字段合并、装饰 CRUD、通道线宽与线路对账、GeoJSON 投影、历史、复制 / 删除、`once`、WebGL 层清理、注册表注销与初始化 options 等接口。
|
|
327
|
+
- **综合 demo**:`GisViewDemo` 的级联高亮面板增加 `triggerOnClick` / `triggerOnMultiSelect` / `triggerOnBoxSelect` 三个独立开关,并随配置热更新;接口能力页另把此前只在文档出现、没有 demo 入口的只读与写入方法集中展示。静态审计后,253 个实例成员与 95 个 options 在全部 demo 中的直接引用缺口均为 **0**。
|
|
328
|
+
- **API 参数与响应口径**:`docs/manual/17-参数速查.md` 增加「调用与响应口径」,统一说明链式返回、一次数据通知、选中集同步、相机更新、只读快照与失败 / 异步结果;并细化 `focusOn`、`selectFeatures`、`selectWaypoint`、`selectInBox`、复制 / 合并 / 删除 / 历史等方法的参数和返回字段。`03` / `07` / `08` / `09` / `14` / `16` / `17` / `18` 之间补齐关联章节互跳;同时把 17 的口径说明改为四级标题,避免解析器把后续参数表截断。
|
|
329
|
+
- **fitSpacing 中心修正**:`utils.js` 的 `measurePointSpacing()` 只返回最近正中心距,不再为并列节点对计算中点;`engine.js` 的 `fitSpacingAdjustment()` 只提高相机比例,相机中心始终沿用普通适应的包围盒中心。开启 `fitSpacing` 后不会因为最近节点对换位置而跳到另一个点,`maxZoom` / `maxScale` / 显式 `initialView.scale` / `zoom` 的优先级不变。
|
|
330
|
+
- **性能优化**:`measurePointSpacing()` 去掉并列距离时的中点距离比较,减少规则网格下的重复计算;`reflowChannelWidths()` 为单组通道增加宽度未变时的快路径,直接跳过车道布局与回线路径重建,多组通道仍走完整重排。10 万点微基准由 **34.933 ms** 降至 **27.572 ms**,约提升 **21%**。
|
|
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
|
+
- **验证**:`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-缺省居中--文档互跳--扩展命令--性能优化)。
|
package/docs/GisView.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
`GisView` 是一套不依赖任何第三方图形库的 WebGL2 矢量视图:渲染层是原生 WebGL2(GLSL ES 3.00 + 实例化绘制),交互层只有指针与滚轮,界面只内置可选的小地图(配 `minimap` 才有,见「鹰眼图」),其余全靠使用方。它没有 Vue 组件形态,用 `createGisView(dom, options)` 把画布直接挂到传入的 DOM 上,宽高默认跟随容器。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
控制面板、读数面板、图例这类视图工具都不内置:组件只提供画布与实例方法,样式和布局完全由使用方决定,后续改样式不需要等待组件升级。数据侧该有的都给了:按属性筛选(默认只隐藏,也可显式从数据删除;点被过滤时绑定线路与通道一起消失,大数据量走 Web Worker)、按属性批量配色换符号、节点标签与点 / 线 / 通道的悬浮提示,都可以通过 options 或实例方法配置。
|
|
6
6
|
|
|
7
7
|
**这份手册按主题拆成了 21 章,正文在 [`docs/manual/`](manual/) 下**:找方法先看 [16 实例方法总表](manual/16-实例方法总表.md),查参数跳 [17 参数速查](manual/17-参数速查.md),要能直接复制的调用看 [18 逐方法示例](manual/18-逐方法示例.md);只想先跑起来看 [01 快速开始](manual/01-快速开始.md)。
|
|
8
8
|
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
| [14 视图与筛选](manual/14-视图与筛选.md) | 筛选、搜索定位、初始视图与缩放范围、背景层、鹰眼图、近义入口 |
|
|
33
33
|
| [15 导出与集成](manual/15-导出与集成.md) | 导出图片 / 选中节点 / 数据、自定义导出格式,插件、自建界面与键盘交互 |
|
|
34
34
|
| [16 实例方法总表](manual/16-实例方法总表.md) | 按功能分组的实例方法主表(找方法从这一章开始) |
|
|
35
|
-
| [17 参数速查(逐个方法)](manual/17-参数速查.md) |
|
|
35
|
+
| [17 参数速查(逐个方法)](manual/17-参数速查.md) | 256 个成员逐个列全:参数、默认值与返回 |
|
|
36
36
|
| [18 逐方法示例(复制就能跑)](manual/18-逐方法示例.md) | 每个成员一段可复制的调用示例(API 速查页读的就是这一章) |
|
|
37
37
|
| [19 读数与拖拽预览](manual/19-读数与拖拽预览.md) | 自建界面常用的读数 / 定位方法;拖拽落点预览 |
|
|
38
38
|
| [20 性能与大数据](manual/20-性能与大数据.md) | 十万级数据的开关与实测、WebGPU 取舍、渲染后端开关 |
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
- **通道**:[通道与多回线](manual/09-通道与多回线.md) · [通道编辑与新增](manual/10-通道编辑与新增.md) · [分组拐点](manual/10-通道编辑与新增.md#分组拐点把某一组拉走)
|
|
46
46
|
- **样式**:[点配置](manual/11-样式与规则.md#点配置) · [线配置](manual/11-样式与规则.md#线配置) · [条件语言](manual/11-样式与规则.md#条件语言) · [批量样式规则](manual/11-样式与规则.md#批量样式规则)
|
|
47
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#搜索与定位) · [
|
|
49
|
-
- **导出与集成**:[导出数据](manual/15-导出与集成.md#导出数据) · [自定义导出格式](manual/15-导出与集成.md#自定义导出格式后端-dto) · [插件](manual/15-导出与集成.md#插件) · [自建界面](manual/15-导出与集成.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
50
|
- **查方法**:[实例方法总表](manual/16-实例方法总表.md) · [参数速查](manual/17-参数速查.md) · [逐方法示例](manual/18-逐方法示例.md) · [读数与拖拽预览](manual/19-读数与拖拽预览.md)
|
|
51
51
|
- **概念与排查**:[大数据展示模式(denseMode)](manual/20-性能与大数据.md#大数据展示模式densemode) · [大数据量](manual/20-性能与大数据.md#大数据量) · [常见问题](manual/21-说明与常见问题.md#常见问题) · [类型定义索引](manual/21-说明与常见问题.md#类型定义索引)
|
|
52
52
|
|
|
@@ -220,6 +220,143 @@
|
|
|
220
220
|
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/create.js`、`src/gis-view/types.d.ts`、`docs/demos/ChannelDemo.vue`、`docs/steps/selftest-features.html`、`docs/steps/selftest-demos.html`、`docs/manual/02` / `03` / `08` / `09` / `10` / `21`、`docs/format/03` / `04`、`docs/接口协议.md`、`docs/steps/README.md`、根 `README.md`、`src/gis-view/README.md` 与 `docs/demos/api-index.js`(生成物)。
|
|
221
221
|
- **验证**:`selftest-features.html` 603 → **611** 条 / 0 失败(3 条 Ctrl 加点高亮范围 + 5 条 `vertex` 偏移 / 邻点 / 分组隔离 / 导出路由),`selftest-demos.html` 296 → **297** 条 / 0 失败(模式下拉与准备按钮),`selftest-labels` 161、`selftest-docs` 130,四页共 **1199** 条通过 / 0 失败。`node --check`、`npx tsc --noEmit`、`npm run check:docs`(249 个成员 / 246 个方法 / 245 个数据字段 / 92 个 options / 18 个功能开关 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-21-增量修改txt两条ctrl-加点高亮范围--分组拐点拖动模式)。
|
|
222
222
|
|
|
223
|
+
### 2026-10-21 增量(大数据性能收口与 Canvas 标签模式)
|
|
224
|
+
|
|
225
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:① 继续优化 gis-view 性能,确保大数据下的交互与渲染;② 标签已有 `auto` / `dom`,新增 `canvas`。
|
|
226
|
+
|
|
227
|
+
- **模式**:`labelRender?: 'auto' | 'canvas' | 'dom'`。`auto` 保持强制显示档、单层达到 1024 条才自动画布化;显式 `canvas` 不受阈值限制,`labelOptimize: true` / 密集档也生效,但仍遵守 `maxCount` / `when` / `scanLimit` / 避让;`dom` 保持旧行为。需要 DOM 语义的标签始终留在同层 DOM。
|
|
228
|
+
- **性能**:`overlay.js` 增加画布文字测量缓存(字体 / 样式 / 文案,上限 8192)、交互期按 `requestAnimationFrame` 合并重绘、缩放位移与屏外标签裁剪;优化档的避让和换落点直接使用画布宽高,不创建也不测量 DOM。线路标签换位后同步 `lineLabelMeta`,函数内容无法安全重算时放弃沿线回退。
|
|
229
|
+
- **核心文件**:`src/gis-view/overlay.js`、`src/gis-view/create.js`、`src/gis-view/types.d.ts`、`docs/steps/selftest-labels.html`、`docs/manual/03` / `12` / `20`、`docs/steps/README.md`、根 `README.md`、`src/gis-view/README.md`、`docs/demos/api-index.js`(生成物)与 `docs/AI对话汇总.md`。
|
|
230
|
+
- **验证**:`selftest-labels.html` 新增 4 条(1100 条同文案 `measureText` ≤ 2 次、连续 5 次缩放只重绘 1 ~ 2 次、显式画布在优化档遵守 `maxCount: 200`、6 条线路标签全部进画布且 DOM 为 0),161 → **165** 条 / 0 失败;14 个自测页共 **2101** 条通过 / 0 失败。`node --check`、`npx tsc --noEmit`、`npm run check:docs`(249 个成员 / 246 个方法 / 245 个数据字段 / 92 个 options / 18 个功能开关 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-21-增量大数据性能收口与-canvas-标签模式)。
|
|
231
|
+
|
|
232
|
+
### 2026-10-21 增量:大数据展示与点聚合
|
|
233
|
+
|
|
234
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:① 继续优化 gis-view 性能,保证大数据下的交互与渲染流畅性;② 增加功能并补 Demo。本轮新增点聚合,只影响展示、拾取、快照与导出,不改原始 `points`、选中集或 `getData()`。
|
|
235
|
+
|
|
236
|
+
- **聚合语义**:新增 `pointCluster`(`true` 或半径 / `minPoints` / `maxZoom` 配置),多成员收成一个带数量的圆,成员从普通点批次、标签、拾取、框选、涟漪、装饰与导出中隐藏;点击聚合圆只发 `clusterClick`,不触发普通 `click`、不选中内部节点。选中、拖动、合并和复制预览中的点强制单成员。
|
|
237
|
+
- **性能与读数**:`cluster.js` 的固定网格 + `Int32Array` 成员链表按 O(n) 建组,平移不重算,缩放 / 配置 / 数据 / 编辑状态变化才在开画前重排;`getClusters()` / `getPointCluster()` / `getStats().clusterCount` / `clusterPointCount` / `clusterMs` 与 `listPoints({ visibleOnly: true })` 给出当前展示口径。
|
|
238
|
+
- **核心文件**:`src/gis-view/cluster.js`(新增)、`src/gis-view/engine.js`、`src/gis-view/create.js`、`src/gis-view/overlay.js`、`src/gis-view/svg.js`、`src/gis-view/events.js`、`src/gis-view/gis-view.css`、`src/gis-view/types.d.ts`、`docs/demos/ClusterDemo.vue`、`docs/demos/demos.js`、`docs/steps/selftest-perf.html`、`docs/steps/selftest-demos.html`、`docs/manual/03` / `04` / `16` / `17` / `18` / `20`、`docs/GisView.md`、`docs/steps/README.md`、根 `README.md`、`src/gis-view/README.md` 与 `docs/demos/api-index.js`(生成物)。
|
|
239
|
+
- **验证**:`selftest-perf.html` 新增 19 条,136 → **155** 条 / 0 失败;`selftest-demos.html` 297 → **305** 条 / 0 失败;全部 14 个自测页共 **2121** 条通过 / 0 失败。`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(**251** 个成员 / **248** 个方法 / **247** 个数据字段 / **93** 个 options / **18** 个功能开关 / **43** 个事件 / **16** 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-21-增量点聚合与大数据展示)。
|
|
240
|
+
|
|
241
|
+
### 2026-10-21 增量:动效、热力图与鹰眼图性能
|
|
242
|
+
|
|
243
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:① 继续优化组件和性能;② 优化动画效果和性能;③ 优化热力图效果和性能;④ 优化鹰眼图效果和性能。
|
|
244
|
+
|
|
245
|
+
- **动画**:`lineEffectRuns` / `lineEffectRunByIndex` 让每帧只遍历真正配了动点的线路;路径就地变化时重算总长、包围盒与 `motion.total`,多层阴影合并上传。
|
|
246
|
+
- **热力图**:`styleKey()` / `weightKey()` 把要素采样与密度烘焙分开;只改 `density.opacity` / `layer` 不重烤,换色带 / 核参数复用采样重烤;`updatePoint` / `updateLine` 只在坐标、权重或通道宽度变化时标脏,追加与拖动路径也同步记账,拖动期间延迟到停手统一补烤。
|
|
247
|
+
- **鹰眼图**:线路单独使用离屏层与缓存,`collectMinimapData()` 顺路记录线路包围盒,视野外线路直接跳过;布局尺寸未变不重设 canvas,点层缓存键补 `ratio`。
|
|
248
|
+
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/heatmap.js`、`src/gis-view/minimap.js`、`src/gis-view/create.js`、`docs/steps/selftest-effects.html`、`docs/steps/selftest-perf.html`、`docs/steps/selftest-demos.html`、`docs/manual/13` / `14` / `20`、`docs/steps/README.md`。
|
|
249
|
+
- **验证**:`selftest-effects.html` 83 → **87** 条、`selftest-perf.html` 155 → **162** 条、`selftest-demos.html` 305 → **308** 条;14 个自测页共 **2135** 条通过 / 0 失败。`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(251 个成员 / 248 个方法 / 247 个数据字段 / 93 个 options / 18 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-21-增量动效热力图与鹰眼图性能)。
|
|
250
|
+
|
|
251
|
+
### 2026-10-22 增量:动效、热力图与鹰眼图显示优化
|
|
252
|
+
|
|
253
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:① 优化动画显示效果;② 优化热力图显示效果;③ 优化鹰眼图显示效果。
|
|
254
|
+
|
|
255
|
+
- **动画显示**:`engine.js` 增加动点拖尾批次(28 CSS 像素、4 段渐隐、独立缓冲 / VAO),按相机比例把屏幕长度换成世界距离;拖尾绘制在线路圆头之上、节点涟漪之下,高倍缩放下仍然可见。
|
|
256
|
+
- **热力图显示**:`density.js` 写预乘 alpha,`shaders.js` 增加 `u_premultiplied`,`engine.js` 的密度场改用 `ONE / ONE_MINUS_SRC_ALPHA`;LINEAR 过滤的透明边缘不再混黑,整层 opacity 也不会只淡 alpha、留下发亮的 RGB。
|
|
257
|
+
- **鹰眼图显示**:`minimap.js` 按像素覆盖率给节点做抗锯齿并用 source-over 合成重叠像素,线路补圆头端点,小图缩略节点不再呈硬边方块。
|
|
258
|
+
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/density.js`、`src/gis-view/shaders.js`、`src/gis-view/minimap.js`、`docs/steps/selftest-effects.html`、`docs/steps/selftest-perf.html`、`docs/steps/selftest-demos.html`。
|
|
259
|
+
- **验证**:`selftest-effects.html` 87 → **88** 条、`selftest-perf.html` 162 → **163** 条、`selftest-demos.html` 308 → **309** 条;14 个自测页共 **2138** 条通过 / 0 失败。`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(251 个成员 / 248 个方法 / 247 个数据字段 / 93 个 options / 18 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-22-增量动效热力图与鹰眼图显示优化)。
|
|
260
|
+
|
|
261
|
+
### 2026-10-22 增量:移除 zoomScaleAuto 并新增 fitSpacing
|
|
262
|
+
|
|
263
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:① `zoomScaleAuto` 有什么用、能否删除;② 远处孤立节点撑大包围盒后主体节点过挤,增加开关与最小节点间距参数,按间距调整内部比例。
|
|
264
|
+
|
|
265
|
+
- **移除自适应比例开关**:确认 `zoomScaleAuto` 只给没写的 `pointZoomScale` / `lineZoomScale` 兜底成 `1`,无法解决包围盒被远处孤立点撑大的比例问题,因此连同 `zoomExponent` 与指数 `null` 哨兵一起删除;联动指数恢复缺省 `0`,显式写多少就按多少算。`getZoomBaseScale()` / `setZoomBaseScale()` 保留。
|
|
266
|
+
- **新增 fitSpacing**:`fitSpacing?: boolean | GisViewFitSpacingOptions`,`true` 等价于 `{ minDistance: 24, maxZoom: 0 }`。普通适应后按筛选 / 隐藏后可见节点的最近正中心距反推比例,`maxZoom` 为正数时限制相对普通适应比例的倍数,`0` 表示不限且仍受 `maxScale` 约束。相机中心改用可见节点 x / y 中位数,远处孤立点允许落到视口外;只在首次默认适应与 `fitView()` 生效,显式 `initialView.scale` / `zoom` 优先。`updateOptions({ fitSpacing })` 不移动相机,需要再调 `fitView()`。
|
|
267
|
+
- **实现与 demo**:`utils.js` 的 `measurePointSpacing()` 用 y 序相邻点上界、x 序扫描与比较预算求最近正距离,避免全量 O(n²) 并跳过重合坐标;`engine.js` 把调整串进默认适应与 `fitView()`,`create.js` 把 `fitSpacing` 归入展示类热更新。`GisViewDemo.vue` 的样式面板增加开关、最小中心距与最大放大输入,修改后即时 `fitView()` 便于对照。
|
|
268
|
+
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/utils.js`、`src/gis-view/create.js`、`src/gis-view/types.d.ts`、`docs/demos/GisViewDemo.vue`、`docs/steps/selftest-scale.html`、`docs/steps/README.md`、`docs/GisView.md`、`docs/api/index.html`、`docs/demos/api-index.js`(生成物)、`docs/manual/02` / `03` / `14` / `16` / `17` / `18` / `21`、`docs/internals/16-03-优化与取舍-下.md`。
|
|
269
|
+
- **验证**:14 个自测页共 **2138** 条通过 / 0 失败;其中 `selftest-scale.html` 输出 113 条结果,**107 PASS / 0 FAIL / 6 DIAG**;新增的 6 条 `fitSpacing` 断言全部通过(配置回显 / 孤立点下提高比例且忽略重合点 / 中位中心 / 24px 屏幕间距 / `maxZoom` 上限 / 关闭恢复),关键读数 `0.0224 → 0.24`、中心 `[50, 50]`、间距 `24`、上限 `0.0224 → 0.0448`、关闭恢复 `0.0224`。`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(251 个实例成员 / 93 个 options / 247 个数据字段)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的 2026-10-22 增量](../AI对话汇总.md#2026-10-22-增量移除-zoomscaleauto-并新增-fitspacing)。
|
|
270
|
+
|
|
271
|
+
### 2026-10-22 增量:fitSpacing 居中修正与 GisViewDemo 拆分
|
|
272
|
+
|
|
273
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:① 优化 `fitSpacing` 的放大效果,按两个最近节点的最小距离处理并居中;② 把 `GisViewDemo.vue` 拆分成多个组件,放进一个文件夹。
|
|
274
|
+
|
|
275
|
+
- **fitSpacing 口径**:`utils.js` 的 `measurePointSpacing()` 求最近正中心距时同时记住这一对节点,返回 `{ distance, center }`;`center` 是最近节点对的中点,不再取全量节点 x / y 中位数。`engine.js` 仍按 `minDistance / distance` 提高比例,并把相机中心放到这对节点的中点;重合坐标不参与,远处孤立点允许出屏,`maxZoom` / `maxScale` 与显式 `initialView.scale` / `zoom` 的优先级不变。
|
|
276
|
+
- **Demo 拆分**:`docs/demos/GisViewDemo.vue` 只保留入口编排与 `provide`,新目录 `docs/demos/gis-view-demo/` 收纳 `useGisViewDemo.js`(状态与动作)、`demoContext.js`、`demo.css`、页头 / 说明 / 面板栈 / 舞台 / 弹框 / 页脚组件,以及 `panels/` 下的 `ViewPanels` / `StylePanels` / `DataPanels` / `OpsPanels`。面板按原页签分组,DOM 类名与 `data-demo` 钩子保持不变。
|
|
277
|
+
- **兼容处理**:根组件 `setupState` 继续暴露 `viewRef`、`channelReadyPayload` 和既有自测读取的 demo 读数;舞台容器仍用字符串模板 ref,避免自动解包成 `null`。原 scoped 样式移到 `demo.css` 并统一加 `.gis-view-demo` 命名空间,Teleport 弹层增加同名容器,避免污染其他演示。
|
|
278
|
+
- **核心文件**:`src/gis-view/utils.js`、`src/gis-view/engine.js`、`src/gis-view/types.d.ts`、`docs/demos/GisViewDemo.vue`、`docs/demos/gis-view-demo/**`、`docs/steps/selftest-scale.html`、`docs/manual/03` / `14`、`docs/steps/README.md`。
|
|
279
|
+
- **验证**:`selftest-scale.html` 为 **108 PASS / 0 FAIL / 6 DIAG**(114 条结果);14 个自测页共 **2139** 条通过 / 0 失败(`selftest-demo` 132、`selftest-demos` 309)。`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(251 个实例成员 / 248 个方法 / 247 个数据字段 / 93 个 options / 18 个功能开关 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-22-增量fitspacing-居中修正与-gisviewdemo-拆分)。
|
|
280
|
+
|
|
281
|
+
### 2026-10-22 增量:fitSpacing 居中、级联高亮与 forward
|
|
282
|
+
|
|
283
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:① 优化 `fitSpacing` 的放大位置;② 新增独立级联高亮、可配置样式并读取读数;③ 线路新增 `forward` 反向;④ 合并两个右键回调。工作区未发现随附参考图片,按问题文本实现。
|
|
284
|
+
|
|
285
|
+
- **fitSpacing**:`measurePointSpacing()` 在最近距离并列时,用「节点对中点离 x / y 中位数中心最近」打破平局;规则网格不会再从边角开始放大。相机仍居中到选中节点对的中点,阈值与优先级不变。
|
|
286
|
+
- **级联高亮**:`cascadeHighlight` 独立于选中集,支持 `scope` / `pointStyle` / `lineStyle` / `clearOnEmptyClick`;节点亮自身、直连线路与另一端节点,线路 / 通道回线亮两端。新增 `onCascadeHighlight`、`cascadeHighlight` 总线事件与 `getCascadeHighlight()`,空白点击、来源失效或关开关时收掉。
|
|
287
|
+
- **forward 与右键**:`GisViewLine.forward` 默认 `true`,写 `false` 反向装饰、箭头、动点与拖尾,并与 `effect.reverse` / `direction.reverse` 异或;不改 `path`。右键只留 `onContextMenu`,通道回线在顶层带 `lineId` / `lineIndex`,同一载荷附 `channelContext`;删除 `onChannelContextMenu`、`channelContextMenu` 与 `channelMenu` 开关。
|
|
288
|
+
- **文档与核心文件**:`engine.js`、`create.js`、`line.js`、`effect.js`、`utils.js`、`types.d.ts`、`features.js`、`events.js`;根 `README.md`、`src/gis-view/README.md`、`docs/GisView.md`、`docs/manual/02` / `03` / `04` / `07` / `10` / `14` / `16` / `17` / `18` / `21`、`docs/format/07`、`docs/steps/README.md` 与六个相关自测页;`docs/demos/api-index.js` 由脚本重生成。
|
|
289
|
+
- **验证**:14 个自测页 **2160** 条通过 / 0 失败(features 621、effects 96、demos 309、scale 115 条结果 = 109 PASS + 6 DIAG);`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(252 个成员 / 249 个方法 / 248 个数据字段 / 94 个 options / 17 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-22-增量fitspacing-居中级联高亮与-forward)。
|
|
290
|
+
|
|
291
|
+
### 2026-10-22 增量(「问题.txt」三条:合并样式说明 / 级联高亮 Demo / 筛选后的通道宽度)
|
|
292
|
+
|
|
293
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:① 说明「合并样式」是什么、有什么用;② 把上一轮的点击级联高亮补进 Demo;③ 排查 `setFilter` 为什么有时会让仍在显示的通道宽度发生变化。工作区未发现随附的参考图片,第 ③ 条按问题文字与现有锚点逻辑复现。
|
|
294
|
+
|
|
295
|
+
- **合并样式说明**:`mergePoints()` 后保留节点最终写进数据的 `size` / `symbol` 就是“合并样式”:尺寸取双方较大值,图标优先目标节点;自定义走 `merge.createItem()` 或 `payload.item`。Demo 合并读数加「合并样式:」前缀,复制与合并面板补规则与改写入口。
|
|
296
|
+
- **级联高亮 Demo**:综合示例「视图 · 交互 → 交互开关与快捷键」新增开关、`both` / `points` 范围、`getCascadeHighlight()` 读数;`selftest-demos` 覆盖开启、点节点读数、切范围、关闭和还原。
|
|
297
|
+
- **筛选后的通道宽度**:`engine.js` 的 `channelNodeWidthFor()` 不再只查 `pointByIndex`,改为用 `filteredAnchorIndexById` 补取被筛锚点,并通过按数据下标缓存的外框尺寸走同一条样式链;保留热力倍率,不叠临时状态样式。数据、样式链、隐藏集合或单点更新后清缓存。`setFilter` 隐藏一端或两端不再改变仍显示通道的宽度;节点真删除 / `visible: false` 才退回默认宽度。
|
|
298
|
+
- **核心文件**:`src/gis-view/engine.js`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`docs/demos/gis-view-demo/panels/ViewPanels.vue`、`docs/manual/07` / `09` / `14`、`docs/steps/selftest-features.html`、`docs/steps/selftest-demos.html`、`docs/steps/README.md`。
|
|
299
|
+
- **验证**:`selftest-features` 621 → **625**、`selftest-demos` 309 → **314**、`selftest-docs` **130**,三页 0 失败;`node --check`、`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(252 个成员 / 249 个方法 / 248 个数据字段 / 94 个 options / 17 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过。公开 API 与文档计数未变。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-22-增量问题txt三条合并样式说明--级联高亮-demo--筛选后的通道宽度)。
|
|
300
|
+
|
|
301
|
+
### 2026-10-22 增量:预指定通道起点、导出范围、级联触发与筛选宽度
|
|
302
|
+
|
|
303
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `问题.txt`:`beginAddChannel` 可直接指定起点;`exportImage` 支持视口 / 全部内容;完善方法与配置项参数文档;级联样式只作用于邻接项、直接选中仍走 select,并让框选 / 多选分别控制触发;继续修复筛选后的通道宽度。
|
|
304
|
+
|
|
305
|
+
- **交互与渲染**:`GisViewChannelDraftOptions.from` 支持 id / 下标 / 被筛锚点,草稿直接进 `from` 相位;`exportImage({ scope: 'all', padding })` 临时适应全部可见内容,PNG / SVG 出图后恢复相机与覆盖层;级联新增 `triggerOnClick` / `triggerOnMultiSelect` / `triggerOnBoxSelect`,直接选中项不再套级联样式,框选按整框邻接并集计算;通道锚点宽度改用中性的 `channelAnchorSpans`,筛选隐藏单端 / 双端及叠加选中样式时宽度与车道不跳。
|
|
306
|
+
- **核心文件**:`src/gis-view/engine.js`、`src/gis-view/create.js`、`src/gis-view/types.d.ts`、`docs/steps/selftest-features.html`、`docs/manual/03` / `07` / `10` / `15` / `16` / `17` / `18`、`docs/demos/api-index.js`(生成物)。
|
|
307
|
+
- **验证**:`npx tsc --noEmit`、`npm run build`、`npm run check:docs`(252 个成员 / 249 个方法 / 248 个数据字段 / 94 个 options / 17 个功能开关 / 43 个事件 / 16 个分组)、`node docs/steps/gen-api-index.mjs --check` 与 `git diff --check` 全部通过;`selftest-features` **646**、`selftest-demos` **314**、`selftest-docs` **130**,三页共 **1090** 条通过 / 0 失败。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-22-增量预指定通道起点导出范围级联触发与筛选宽度)。
|
|
308
|
+
|
|
309
|
+
### 2026-10-22 增量(「问题.txt」四条:筛选恢复 / focusOn 类型 / 程序化选中 / 线路跟随开关)
|
|
310
|
+
|
|
311
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的最新 `问题.txt`:① 通道被筛选后重新出现会错位,重新更新视图才正常;② `focusOn` 能否聚焦线路 / 通道,聚焦比例是否与节点一致,同 id 时如何指定类型;③ 如何通过方法选中通道、节点、线路、分组或拐点;④ 新增线路是否跟随节点的开关,默认开启,关闭后隐藏 / 删除 / 筛选只考虑节点。工作区未发现随附参考图片,第 ① 条按文字与真实 `new.json` 临时复现验证。
|
|
312
|
+
|
|
313
|
+
- **筛选恢复**:`engine.js` 在 `resolveLines` 完成后调用 `reflowChannelWidths(channels)`。此前 `resolveChannels` 先于线路解析,缺省切点内收读到的是上一轮(筛选期间可能缺成员)的线宽;筛选恢复后偏移不会自动刷新。现在按当前线宽再对一遍偏移与回线路径,未变化时只比较不动几何。除自测断言外,另用真实 `new.json` 做临时复现页 3/3 PASS,页面已删除。
|
|
314
|
+
- **focusOn 类型与缩放**:支持显式 `point` / `line` / `channel` / `group`。裸字符串仍先节点后线路;同 id 用 `type` 消歧;通道可写 `{ channelId }` 或显式 `type: 'channel'`;分组必须 `type: 'group'`,`groupId` 全局唯一时可省略 `channelId`。节点、线路、通道、分组统一走 `zoomToBounds`,没有类型专属放大倍率。
|
|
315
|
+
- **程序化选中**:`selectFeatures` 新增 `type: 'group'` 和全局唯一 `groupId` 解析;新增 `selectWaypoint()`,支持字符串 / 下标 + `pathIndex`、`{ lineIndex, pathIndex }`、`{ lineId, pathIndex }` 与 `null`。有效拐点同时选中所在线路,`mode` 决定线路如何并入当前选中集;清空只清拐点高亮,不动要素选中集。
|
|
316
|
+
- **线路跟随开关**:`lineFollowsNode?: boolean` 默认 `true`。关闭后引擎缓存被线路 / 通道绑定的节点最后坐标与解析尺寸:`visible: false`、`removePoints`、筛选退场时只影响节点,回线与通道继续按缓存几何绘制;节点仍存在时拖动仍会更新。筛选未显式 `cascade` 时默认级联从 `'binding'` 改为 `false`,显式值始终优先。`updateOptions({ lineFollowsNode })` 会重算当前筛选并刷新引擎缓存。
|
|
317
|
+
- **核心文件**:`src/gis-view/create.js`、`src/gis-view/engine.js`、`src/gis-view/filter.js`、`src/gis-view/filter-runner.js`、`src/gis-view/filter.worker.js`、`src/gis-view/types.d.ts`、`docs/steps/selftest-features.html`、`docs/steps/selftest-demos.html`、`docs/steps/selftest-docs.html`、`docs/manual/03` / `08` / `09` / `14` / `16` / `17` / `18`、`docs/steps/README.md`、根 `README.md`、`src/gis-view/README.md` 与 `docs/demos/api-index.js`(生成物)。
|
|
318
|
+
- **验证**:`selftest-features.html` **662**、`selftest-demos.html` **314**、`selftest-docs.html` **130**,三页共 **1106** 条通过 / 0 失败;`npx tsc --noEmit`、`npm run check:docs`(253 个成员 / 250 个方法 / 249 个数据字段 / 95 个 options)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。详细口径见 [AI 对话汇总的本轮增量](../AI对话汇总.md#2026-10-22-增量问题txt四条筛选恢复--focuson-类型--程序化选中--线路跟随开关)。
|
|
319
|
+
|
|
320
|
+
### 2026-10-22 增量:接口能力 demo、API 细节与 fitSpacing 中心修正
|
|
321
|
+
|
|
322
|
+
本轮仍是现有会话的继续增量,没有独立会话归档,因此不改上表的 39 条统计。需求原话来自仓库根目录的 `修改.txt` 六项:补 demo 中的级联触发开关、为组件缺口补接口演示、细化 API 入参与响应、补文档互跳、修正 `fitSpacing` 的放大中心,并继续优化性能。
|
|
323
|
+
|
|
324
|
+
- **接口演示**:新增 `ApiCoverageDemo.vue` 并注册 `api-coverage` 页签,演示总数变为 22;综合 demo 也补了 `triggerOnClick` / `triggerOnMultiSelect` / `triggerOnBoxSelect` 三个独立开关。静态审计后,253 个实例成员与 95 个 options 在全部 demo 中的直接引用缺口均为 0。
|
|
325
|
+
- **文档**:`docs/manual/17` 增加调用与响应口径并细化方法参数 / 返回值,`03` / `07` / `08` / `09` / `14` / `16` / `17` / `18` 之间补齐互跳;17 的口径说明改为四级标题,避免参数表被截断。
|
|
326
|
+
- **fitSpacing 与性能**:`measurePointSpacing()` 不再返回最近节点对中点,`fitSpacing` 只提高比例,相机中心沿用普通适应的包围盒中心;同时去掉并列距离的中点比较,单组通道增加宽度未变快路径。10 万点微基准由 34.933 ms 降至 27.572 ms,约提升 21%。
|
|
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
|
+
- **验证**:`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
|
+
|
|
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
|
+
|
|
223
360
|
## 六、怎么自己复查
|
|
224
361
|
|
|
225
362
|
会话文件是逐行 JSON,不用整份读 —— 只挑两种行解析就够:`session_meta` 行里的 `payload.cwd` 认项目,`payload.type === 'user_message'` 行里的 `payload.message` 是用户原话:
|
package/docs/api/index.html
CHANGED
|
@@ -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
|
|
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>
|
|
@@ -607,12 +614,12 @@
|
|
|
607
614
|
" points: [{ id: 'a', x: 0, y: 0, name: '甲站' }, { id: 'b', x: 400, y: 200, name: '乙站' }],",
|
|
608
615
|
" lines: [{ id: 'l1', from: 'a', to: 'b' }, { id: 'l2', from: 'a', to: 'b' }],",
|
|
609
616
|
" channels: [{ id: 'c1', name: '一号通道', lineIds: ['l1', 'l2'] }],",
|
|
610
|
-
"
|
|
617
|
+
" fitSpacing: { minDistance: 24 } // 适应视图时按最近节点中心距兜底(见下方选项)",
|
|
611
618
|
"})",
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|