gis-view-webgl2 0.1.13 → 0.1.14

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.
@@ -84,7 +84,16 @@
84
84
 
85
85
  先分清组件与宿主:本组件只负责接收已经整理好的点线数据,`initData` 只应在挂载时调用一次;若宿主定时重建数据,先查宿主路由、监听与 `gisTools.js` / `buildNewData`。SVG 被画成圆通常是宿主传入了错误的 `symbol` 或 `pointRules`,直流标记则要确认装饰类型与数据映射。历史排查见维护索引的 10-12 旁支记录。
86
86
 
87
- ## 当前轮次:toggleSelect 节点 / 线路 / 通道 / 分组核验与 visualMap 多目标门控(2026-11-02)
87
+ ## 当前轮次:框选线路 / 通道按实际折线路径命中(2026-11-02)
88
+
89
+ - **需求来源**:根目录 `修改.txt` —— 修改 gis-view 组件,检查框选为什么有时候会框选到不在框选区域的通道。
90
+ - **根因**:`engine.js` 的 `collectLinesInBox()` 通过 `forEachLineInView()` 取候选,而后者只按线路包围盒与选框相交筛选。U 形 / 折返 / 绕行线路的包围盒可以覆盖选框,实际折线却可能离框很远;通道回线一旦被粗筛命中,后续还会按 `channelSelectMode` 摊开整组 / 整条通道,表现为选中了框外通道。
91
+ - **修复**:包围盒继续做粗筛,候选回线再用 `lineHitsRect(line, worldRect)` 逐线段判断实际路径是否与选框相交;未沾框的线路 / 通道回线直接跳过,确认命中后原有 `channelSelectMode` 展开逻辑不变。`queryRect` / `getFeaturesInRect()` 仍保持“包围盒沾框”的既有口径,`lineEndpoints` / `channelEndpoints` 也不变。
92
+ - **回归与文档**:`selftest-select` 新增一条组合回归:普通线路真实穿过选框;U 形线路与通道回线只有包围盒覆盖、路径不穿过;配置同时允许 `line` / `channel` 且 `channelSelectMode: 'channel'`,期望只选中穿框线路。原先会误选 3 条线 + 1 条通道,修复后 **118/0**。手册 03 / 08 与 `types.d.ts` 补充逐线段命中说明,公开面保持 283 个实例成员 / 107 options / 275 个数据字段。
93
+ - **核心文件**:`src/gis-view/engine.js`、`src/gis-view/types.d.ts`、`docs/manual/03-配置项.md`、`docs/manual/08-选中与拐点.md`、`docs/steps/selftest-select.html`、`src/gis-view/README.md`、`docs/AI对话汇总.md`、`docs/ai/06-会话索引与复查方法.md`。
94
+ - **验证**:`node --check src/gis-view/engine.js`、`npx tsc --noEmit`、`node docs/steps/gen-api-index.mjs`、`npm run check:docs`、`npm run build`、`git diff --check` 通过;串行自测 `selftest-select` **118/0**、`selftest-features` **842/0**、`selftest-actions` **96/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**、`selftest-perf` **197/0**。
95
+
96
+ ## 上一轮次:toggleSelect 节点 / 线路 / 通道 / 分组核验与 visualMap 多目标门控(2026-11-02)
88
97
 
89
98
  - **需求来源**:根目录 `修改.txt` —— ① 检查 `toggleSelect` 是否真的生效;② 续查对线路、通道和通道分组的取消是否生效;③ 反馈再次点击通道 / 线路 / 分组不会取消、只有节点能取消;④ 前一轮的 `visualMap` 交互没有效果、不会隐藏网架。
90
99
  - **toggleSelect 根因与修复**:入口原先只看命中的那一条线路 `result.selected`。通道分组 / 整条通道只选中一部分,或点到组内、通道内的另一条回线时,这个值可能为 false,点击于是落到普通单选并重新选上,看起来只有节点能取消。现在 `engine.js` 抽出 `selectionScopeKeysOf()` 按 `channelSelectMode` 取得完整范围,`toggleSelect` 用范围 `anySelected` 判断,并以 `removeOnly` 整批取消;Ctrl / 多选仍保持原来的“整批取反 / 补缺”语义。独立线路、通道单条、完整分组、部分分组、完整通道、部分通道都有真实指针回归;`onClick` / `onSelectChange` 的动作名都是 `toggleSelect`。`selftest-select` 新增 6 条,107 → **113/0**。
@@ -96,7 +105,7 @@
96
105
  - **核心文件**:`src/gis-view/visual-map.js`、`heatmap.js`、`engine.js`、`create.js`、`types.d.ts`、`src/gis-view/README.md`;`docs/manual/03` / `07` / `08` / `11` / `13`、`docs/GisView.md`、Demo 组合式函数与样式面板、`selftest-features.html`、`selftest-select.html`、本页与维护索引。
97
106
  - **验证**:`node --check src/gis-view/engine.js`、`npx tsc --noEmit`、API 索引、`npm run check:docs`、`npm run build`、`git diff --check` 通过;`selftest-select` **117/0**、`selftest-features` **842/0**、`selftest-actions` **96/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**、`selftest-perf` **197/0**。真实 `?demo=full` 用 3 回线通道和实际指针事件复核:完整通道选中后点击一条,选中集由 3 条变为空。性能页首次组合运行出现 192/5,失败项均为既有「线路标签候选复用」的排版时序,单独复跑全绿。
98
107
 
99
- ## 上一轮次:再次选中取消、visualMap 落选门控与交互快路径(2026-11-01)
108
+ ## 2026-11-01 较近轮次:再次选中取消、visualMap 落选门控与交互快路径(2026-11-01)
100
109
 
101
110
  - **需求来源**:根目录 `修改.txt` 三条 —— ① 新增取消选中开关,默认关闭,单击、双击、Ctrl 先选中的路径都能再次操作取消;② 继续优化交互性能;③ `visualMap` 落选后应与热力图 / 网架联动,可选择消失对应网架或对应热力。按用户补充「不考虑分组详情」,本轮不扩展分组详情查询。
102
111
  - **toggleSelect**:顶层 `options.toggleSelect` 缺省 `false`,由 `create.js` 透传引擎并支持 `updateOptions`。单击模式下第二次普通单击已选要素取反;`selectTrigger: 'dblClick'` 下由第二下取反、再次双击取消;Ctrl / ⌘ 先选中后再普通单击也取消。双击每轮只取反一次,不影响普通 `onClick` / `onDblClick` 的派发顺序;取反时 `onClick.action.type` 与 `onSelectChange.action.type` 都是 `toggleSelect`。
@@ -55,6 +55,7 @@
55
55
 
56
56
  | 日期 | 这一轮 |
57
57
  | --- | --- |
58
+ | 2026-11-02 | 增量:(「修改.txt」:框选只认实际折线路径,排除包围盒覆盖的框外线路 / 通道) |
58
59
  | 2026-11-02 | 增量:(「修改.txt」两条:GisEdit toggleSelect 被 selectionKinds 拦截 / 取消选中同步收掉级联) |
59
60
  | 2026-11-01 | 增量:(「修改.txt」三条:toggleSelect 再次选中取消 / visualMap outOfRange 落选门控 / 交互性能) |
60
61
  | 2026-11-01 | 增量:(「修改.txt」三条:热力密度几何隔离 / 线路热力连续 / visualMap 运行时门控) |
@@ -134,7 +135,16 @@
134
135
  | 2026-10-19 | 增量:(「修改.txt」继续优化与排查) |
135
136
  | 2026-10-19 | 增量:(「修改.txt」五条) |
136
137
 
137
- ## 三、当前增量:toggleSelect 节点 / 线路 / 通道 / 分组核验与 visualMap 多目标门控(2026-11-02)
138
+ ## 三、当前增量:框选线路 / 通道按实际折线路径命中(2026-11-02)
139
+
140
+ - **需求来源**:根目录 `修改.txt` —— 修改 gis-view 组件,检查框选为什么有时候会框选到不在框选区域的通道。
141
+ - **根因**:`engine.js` 的 `collectLinesInBox()` 通过 `forEachLineInView()` 取候选,而后者只按线路包围盒与选框相交筛选。U 形 / 折返 / 绕行线路的包围盒可以覆盖选框,实际折线却可能离框很远;通道回线一旦被粗筛命中,后续还会按 `channelSelectMode` 摊开整组 / 整条通道,表现为选中了框外通道。
142
+ - **修复**:包围盒继续做粗筛,候选回线再用 `lineHitsRect(line, worldRect)` 逐线段判断实际路径是否与选框相交;未沾框的线路 / 通道回线直接跳过,确认命中后原有 `channelSelectMode` 展开逻辑不变。`queryRect` / `getFeaturesInRect()` 仍保持“包围盒沾框”的既有口径,`lineEndpoints` / `channelEndpoints` 也不变。
143
+ - **回归与文档**:`selftest-select` 新增一条组合回归:普通线路真实穿过选框;U 形线路与通道回线只有包围盒覆盖、路径不穿过;配置同时允许 `line` / `channel` 且 `channelSelectMode: 'channel'`,期望只选中穿框线路。原先会误选 3 条线 + 1 条通道,修复后 **118/0**。手册 03 / 08 与 `types.d.ts` 补充逐线段命中说明,公开面保持 283 个实例成员 / 107 options / 275 个数据字段。
144
+ - **核心文件**:`src/gis-view/engine.js`、`src/gis-view/types.d.ts`、`docs/manual/03-配置项.md`、`docs/manual/08-选中与拐点.md`、`docs/steps/selftest-select.html`、`src/gis-view/README.md`、`docs/AI对话汇总.md`、本页。
145
+ - **验证**:`node --check src/gis-view/engine.js`、`npx tsc --noEmit`、`node docs/steps/gen-api-index.mjs`、`npm run check:docs`、`npm run build`、`git diff --check` 通过;串行自测 `selftest-select` **118/0**、`selftest-features` **842/0**、`selftest-actions` **96/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**、`selftest-perf` **197/0**。
146
+
147
+ ## 四、上一增量:toggleSelect 节点 / 线路 / 通道 / 分组核验与 visualMap 多目标门控(2026-11-02)
138
148
 
139
149
  - **需求来源**:根目录 `修改.txt`:① 检查 `toggleSelect` 是否真的生效;② 续查对线路、通道和通道分组的取消是否生效;③ 反馈再次点击通道 / 线路 / 分组不会取消、只有节点能取消;④ 前一轮的 `visualMap` 交互没有效果、不会隐藏。
140
150
  - **toggleSelect 根因与修复**:入口原先只判断命中的那一条线路 `result.selected`。通道分组 / 整条通道只选中一部分,或点到组内、通道内的另一条回线时,这个值可能为 false,点击会落到普通单选并重新选上,表现得像只有节点能取消。现在 `engine.js` 的 `selectionScopeKeysOf()` 统一按 `channelSelectMode` 求展开范围;`toggleSelect` 用范围 `anySelected` 判断,并以 `removeOnly` 整批取消,不再要求命中的恰好是那条已选回线;Ctrl / 多选路径仍保持原来的整批取反 / 补缺语义。新增独立线路、通道单条、完整 / 部分分组、完整 / 部分通道 6 条指针回归,两条选中回调都报 `toggleSelect`;`selftest-select` 107 → **113/0**。
@@ -147,7 +157,7 @@
147
157
  - **核心文件**:`src/gis-view/visual-map.js`、`heatmap.js`、`engine.js`、`create.js`、`types.d.ts`、`src/gis-view/README.md`;`docs/manual/03` / `07` / `08` / `11` / `13`、`docs/GisView.md`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`panels/StylePanels.vue`、`docs/steps/selftest-features.html`、`selftest-select.html`、本页与 `docs/AI对话汇总.md`。
148
158
  - **验证**:`node --check src/gis-view/engine.js`、`npx tsc --noEmit`、`node docs/steps/gen-api-index.mjs`、`npm run check:docs`、`npm run build`、`git diff --check` 通过;串行自测 `selftest-select` **117/0**、`selftest-features` **842/0**、`selftest-actions` **96/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**、`selftest-perf` **197/0**。真实 `?demo=full` 以实际指针事件复核完整通道取消,选中集由 3 条变为空。性能页首次组合运行出现 **192/5**,5 条均为既有「线路标签候选复用」的标签排版时序,单独复跑全绿,与本轮改动没有调用关系。
149
159
 
150
- ## 四、上一增量:再次选中取消、visualMap 落选门控与交互快路径(2026-11-01)
160
+ ## 五、上两增量:再次选中取消、visualMap 落选门控与交互快路径(2026-11-01)
151
161
 
152
162
  - **需求来源**:根目录 `修改.txt` 三条:① 新增取消选中开关,默认关闭,单击、双击、Ctrl 先选中的路径都能再次操作取消;② 继续优化交互性能;③ `visualMap` 落选后应与热力图 / 网架联动,可选择消失对应网架或对应热力。按用户补充「不考虑分组详情」,本轮不扩展分组详情查询。
153
163
  - **toggleSelect**:顶层 `options.toggleSelect` 缺省 `false`,`create.js` 透传引擎,`updateOptions` 可运行时切换。单击模式下第二次普通单击已选要素取反;`selectTrigger: 'dblClick'` 下由第二下取反、再次双击取消;Ctrl / ⌘ 先选中后再普通单击也取消。双击每轮只取反一次,不改变普通 `onClick` / `onDblClick` 的派发顺序;取反时 `onClick.action.type` 与 `onSelectChange.action.type` 都是 `toggleSelect`。
@@ -157,7 +167,7 @@
157
167
  - **核心文件**:`src/gis-view/engine.js`、`create.js`、`heatmap.js`、`visual-map.js`、`update-policy.js`、`types.d.ts`;`docs/manual/03` / `08` / `13` / `14`、`docs/GisView.md`、`src/gis-view/README.md`、Demo 组合式函数与面板、`selftest-select.html` / `selftest-features.html` / `selftest-perf.html`、`docs/AI对话汇总.md`、本页与 15.111。
158
168
  - **验证**:`npx tsc --noEmit`、`npm run check:docs`、`npm run build`、`git diff --check` 通过;API 索引为 283 个实例成员(278 方法 + 5 属性)/ 107 options / 275 数据字段;串行自测 `selftest-select` **107/0**、`selftest-features` **836/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**、`selftest-perf` **197/0**。
159
169
 
160
- ## 五、上两增量:热力密度几何隔离、线路热力连续与 visualMap 运行时门控(2026-11-01)
170
+ ## 六、上三增量:热力密度几何隔离、线路热力连续与 visualMap 运行时门控(2026-11-01)
161
171
 
162
172
  - **需求来源**:根目录 `修改.txt` 三条:① 开启热力图后平移 / 缩放时仍有部分线路热力先消失再出现;② 开启热力图后背景也跟着放大缩小;③ `visualMap` 交互没有效果,应参考 ECharts 的交互直接作用于热力表现。
163
173
  - **背景缩放根因**:密度场有独立的 `heatDensityBuffer`,但 `drawImageQuad()` 仍默认绑定背景图片的 `imageVao`,密度四边形一变就按图片几何缩放。现在新增 `heatDensityVao`,密度场拥有自己的四边形与 VAO;背景图片仍用 `imageVao`,两者销毁时分别释放。
@@ -168,7 +178,7 @@
168
178
  - **核心文件**:`src/gis-view/engine.js`、`heatmap.js`、`visual-map.js`、`create.js`、`types.d.ts`、`src/gis-view/README.md`;`docs/manual/03` / `11` / `13` / `15`、`docs/GisView.md`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`panels/StylePanels.vue`、`docs/steps/selftest-features.html` / `selftest-perf.html`、本页与 15.110。
169
179
  - **验证**:`npx tsc --noEmit`、`node --check`、`npm run check:docs`、`npm run build`、`git diff --check` 通过;串行自测 `selftest-features` **828/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**、`selftest-perf` **197/0**。性能页此前一次完整运行曾出现既有的标签布局读数断言失败(1313 次),最终复跑未再出现,与本轮改动没有调用关系。
170
180
 
171
- ## 六、上三增量:线路热力交互连续显示与 visualMap 自定义交互(2026-10-31)
181
+ ## 七、上四增量:线路热力交互连续显示与 visualMap 自定义交互(2026-10-31)
172
182
 
173
183
  - **需求来源**:根目录 `修改.txt` 三条:① 开启热力图后平移 / 缩放时线路热力先消失再出现;② 继续优化开启热力图后的交互性能;③ 图例支持完全自定义与交互,参考 ECharts `visualMap`。
174
184
  - **热力消失根因**:相机移动重铺线路实例时,`buildLineInstances()` 没有写回 `heat`,重铺后强度归零;`LINE_VERTEX_SHADER` 又把 `a_corner.y` 在顶点阶段取了绝对值,插值后整块四边形恒为 1,光晕衰减失效。修复为补 `heat: line.heat ?? 0`,顶点保留带符号 `v_edge`,片元再取 `abs()`。
@@ -177,7 +187,7 @@
177
187
  - **公开面与核心文件**:没有新增实例成员 / options / 数据字段,保持 283 个实例成员(278 方法 + 5 属性)/ 106 options / 274 数据字段。核心文件为 `src/gis-view/shaders.js`、`engine.js`、`heatmap.js`、`visual-map.js`、`create.js`、`types.d.ts`、`gis-view.css`、Demo 组合式函数与样式面板、手册 03 / 11 / 13 / 15 / 16 / 17 / 18、`docs/GisView.md`、`src/gis-view/README.md`、四个自测页、本页与 15.109。
178
188
  - **验证**:`node --check` 覆盖着色器 / 引擎 / 热力图 / 图例 / 组件入口 / Demo;`npx tsc --noEmit` 0 错;`node docs/steps/gen-api-index.mjs` 与 `--check`、`npm run check:docs`(283 / 278 / 5 / 106 / 274)、`npm run build`、`git diff --check` 通过;串行自测 `selftest-features` **823/0**、`selftest-perf` **195/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**。
179
189
 
180
- ## 七、上四增量:visualMap 图例与图例专用快路径(2026-10-31)
190
+ ## 八、上五增量:visualMap 图例与图例专用快路径(2026-10-31)
181
191
 
182
192
  - **需求来源**:根目录 `修改.txt` 两条:① 参考 ECharts `visualMap`,增加类似图例并结合 ruler 样式;② 继续优化组件性能。
183
193
  - **图例模型**:新增 `src/gis-view/visual-map.js` 与 `options.visualMap`。`ruler` / `continuous` 为连续渐变尺 + 刻度,`piecewise` 为分段色块;支持 `pieces` 的 `gte` / `gt` / `lte` / `lt` / `min` / `max`,以及显式 `domain` / 单端 `min` / `max`、`colors` / `stops` / `opacity`、标题 / 单位 / formatter、方向 / 定位 / 尺寸 / 外部容器 / class / 内联样式。默认继承 `heatmap` 的 target / field / domain / colors / stops / opacity,没有热力图时按自己的 `field` 扫独立值域。
@@ -187,7 +197,7 @@
187
197
  - **核心文件**:`src/gis-view/visual-map.js`、`heatmap.js`、`create.js`、`gis-view.css`、`types.d.ts`、`src/gis-view/README.md`;`docs/manual/03` / `11` / `13` / `15` / `16` / `17` / `18`、`docs/index.html`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`panels/StylePanels.vue`、`docs/steps/selftest-features.html` / `selftest-perf.html` / `selftest-demos.html` / `selftest-docs.html`、API 索引、本页与 15.108。
188
198
  - **验证**:`npx tsc --noEmit`、`node --check`、`node docs/steps/gen-api-index.mjs`、`gen-api-index.mjs --check`、`npm run check:docs`(283 / 278 / 5 / 106 / 274)、`npm run build`、`git diff --check` 通过;浏览器自测 `selftest-features` **808/0**、`selftest-perf` **190/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**、`selftest-demo` **133/0**。
189
199
 
190
- ## 八、上五增量:fitSpacing.minDistance 精确落位与指定节点组间距(2026-10-30)
200
+ ## 九、上六增量:fitSpacing.minDistance 精确落位与指定节点组间距(2026-10-30)
191
201
 
192
202
  - **需求来源**:根目录 `修改.txt` 三条:① `minDistance` 一旦设置就必须精确显示为该屏幕距离,不能因为初始值或内部限制只能变大;② 新增方法,传一组节点返回整组的 `minDistance` / `maxDistance`;③ 文档写明距离如何由坐标与相机比例换算。
193
203
  - **根因与修复**:`engine.js` 的 `fitSpacingAdjustment()` 原先把 `minDistance / 最近世界距离` 与普通适应比例取 `Math.max`,再用 `maxZoom` 截断,所以目标比例更小时不生效。现在 `minDistance` 直接作为精确目标比例,可放大也可缩小;`maxZoom` 仅兼容保留,最终只由 `minScale` / `maxScale` 夹取,相机中心仍沿用普通包围盒中心。
@@ -196,7 +206,7 @@
196
206
  - **公开面与核心文件**:实例成员 280 → **281**(方法 275 → **276**),options 105、数据字段 273、分组 16 不变。核心文件为 `src/gis-view/engine.js`、`create.js`、`types.d.ts`、`src/gis-view/README.md`,以及手册 03 / 14 / 16 / 17 / 18、Demo 面板、`selftest-scale.html`、`selftest-docs.html`、`selftest-demos.html`、API 索引、本页与 15.107。
197
207
  - **验证**:`npx tsc --noEmit`、`node docs/steps/gen-api-index.mjs`、`npm run check:docs`(281 / 276 / 105 / 273)、`npm run build`、`git diff --check` 通过;浏览器串行自测 `selftest-features` **794/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**、`selftest-demo` **133/0**;`selftest-scale` **126/2**,新增断言全过,两条失败仍是既有筛选回调时序(`onFilter 0 条`)。
198
208
 
199
- ## 九、上六增量:背景文字同帧刷新与 fitSpacing.minDistance 上限修复(2026-10-30)
209
+ ## 十、上七增量:背景文字同帧刷新与 fitSpacing.minDistance 上限修复(2026-10-30)
200
210
 
201
211
  - **需求来源**:根目录 `问题.txt` 两条:① 拖动 GeoJSON 背景仍有晃动,文字尤其明显;② `fitSpacing.minDistance` 有时怎么设置都不生效,`maxDistance` 正常,像是有内部强制限制。
202
212
  - **背景文字晃动**:`overlay.setBackgroundLabels()` 会把新的区域文字排到下一帧,而内置背景编辑器的 `applyBackground()` 已经同步重画了 WebGL 底图和编辑框,两者相差一帧。`refreshBackgroundLabels()` 现在立即排版并取消待执行的 rAF;编辑器的 `applyBackground()` 在 `updateBackground()` + `refresh({ reflow: false })` 后同步调用它,底图、编辑框、区域文字同任务提交。
@@ -205,7 +215,7 @@
205
215
  - **核心文件**:`src/gis-view/engine.js`、`overlay.js`、`create.js`、`types.d.ts`、`README.md`;`docs/manual/03` / `14`、`docs/from0/15`、`docs/demos/api-index.js`、`docs/demos/gis-view-demo/useGisViewDemo.js`、`docs/steps/selftest-features.html`、`selftest-scale.html`、`selftest-demo.html`、`docs/AI对话汇总.md`、本章节、15.106。
206
216
  - **验证**:`npx tsc --noEmit` 0 错;`node docs/steps/gen-api-index.mjs` 更新索引;`npm run check:docs` 全绿(280 个实例成员 / 105 个 options / 273 个数据字段);`npm run build` 通过;`git diff --check` 通过。浏览器串行自测:`selftest-features` **794/0**、`selftest-demos` **441/0**、`selftest-docs` **139/0**、`selftest-demo` **133/0**;`selftest-scale` **121 通过 / 2 失败**,新增的默认上限断言通过,剩余两条仍是既有筛选回调时序(`onFilter 0 条`)。
207
217
 
208
- ## 十、上七增量:内置背景编辑器与旋转按钮命中修复(2026-10-30)
218
+ ## 十一、上八增量:内置背景编辑器与旋转按钮命中修复(2026-10-30)
209
219
 
210
220
  - **需求来源**:根目录 `修改.txt` 两条:① 旋转按钮始终不旋转;② 将整块背景编辑模式内置,通过方法开启与配置,不再由 Demo 纯手写。
211
221
  - **旋转按钮根因**:旧编辑层 `.bg-edit-layer` 为 `pointer-events: none`,缩放手柄和轮廓单独恢复 `auto`,但旋转按钮漏了;内置编辑器的旋转按钮显式 `pointer-events: auto`,`selftest-demos` 通过 `document.elementFromPoint()` 验证真实命中后再拖动旋转。
@@ -216,7 +226,7 @@
216
226
  - **核心文件**:`src/gis-view/background-editor.js`(新增)、`gis-view.css`、`create.js`、`types.d.ts`;`docs/demos/BackgroundDemo.vue`、`demos.js`、`docs/manual/03` / `14` / `16` / `17` / `18` / `21`、`docs/internals/14`、`docs/steps/selftest-demos.html`、`selftest-features.html`、`selftest-docs.html`、`docs/AI对话汇总.md`、本章节、15.105。
217
227
  - **验证**:`npx tsc --noEmit` 0 错;`node docs/steps/gen-api-index.mjs` 更新索引;`npm run check:docs` 全绿(280 个实例成员 / 105 个 options / 273 个数据字段);`npm run build` 通过;`git diff --check` 通过。浏览器串行自测:`selftest-features.html` **793/0**、`selftest-demos.html` **441/0**、`selftest-docs.html` **139/0**。
218
228
 
219
- ## 十一、上八增量:背景编辑 4 / 8 / 9 点、旋转开关与可定制编辑框(2026-10-30)
229
+ ## 十二、上九增量:背景编辑 4 / 8 / 9 点、旋转开关与可定制编辑框(2026-10-30)
220
230
 
221
231
  - **需求来源**:根目录 `修改.txt` 五条:① 只有开启旋转时才出现旋转按钮;② 取消宽高锁定后从四角编辑改成常见八点,开启旋转后变成九点,并考虑背景旋转角;③ 背景编辑框样式支持自定义;④ 修复移动背景图的轻微晃动;⑤ 全部在 demo 中体现。
222
232
  - **编辑点与旋转**:`BackgroundDemo.vue` 锁定比例时显示四角等比缩放;解锁后增加四边中点,共八个缩放手柄;旋转开关独立控制顶部旋转点与连线,只有开启时才从八点变成九点。关闭旋转仍保留当前角度和八个缩放手柄。
@@ -227,7 +237,7 @@
227
237
  - **核心文件**:`docs/demos/BackgroundDemo.vue`、`docs/demos/demos.js`、`docs/manual/03-配置项.md`、`docs/manual/14-视图与筛选.md`、`docs/manual/21-说明与常见问题.md`、`docs/steps/selftest-demos.html`、`docs/AI对话汇总.md`、本章节、15.104。
228
238
  - **验证**:`npx tsc --noEmit` 0 错;`npm run check:docs` 全绿(276 个实例成员 / 105 个 options / 273 个数据字段);`npm run build` 通过(仅既有大 chunk 提示);`git diff --check` 通过。浏览器串行自测:`selftest-features.html` **786/0**、`selftest-demos.html` **440/0**、`selftest-docs.html` **139/0**。
229
239
 
230
- ## 十二、上九增量:背景移动 / 旋转、背景编辑模式与网架整体显隐(2026-10-30)
240
+ ## 十三、上十增量:背景移动 / 旋转、背景编辑模式与网架整体显隐(2026-10-30)
231
241
 
232
242
  - **需求来源**:根目录 `修改.txt` 两条:背景可移动、可旋转;调整背景时网架不能拖拽 / 点击等操作,但可与背景整体缩放,相当于背景编辑模式;Demo 明显有问题。同日上一增量(15.102)已补背景添加、四角调整与网架显隐 / 透明度,本轮补齐移动、旋转、编辑模式并修正 Demo。
233
243
  - **背景能力**:`geoJsonStyle.bounds` 负责独立缩放 / 平移到目标世界矩形,新增 `geoJsonStyle.rotation` 绕目标矩形中心顺时针旋转;所有解析几何、区域范围、重心与区域文字一起变换,`rawBounds` 保持原始坐标,`bounds` 为旋转后的轴对齐外框。图片用旋转后的 `image.corners` 表达,不改原始数据。
@@ -237,7 +247,7 @@
237
247
  - **核心文件**:`src/gis-view/engine.js`、`background.js`、`create.js`、`overlay.js`、`update-policy.js`、`types.d.ts`;`docs/demos/BackgroundDemo.vue`、`demos.js`、`docs/demos/api-index.js`、`docs/manual/03` / `14` / `16` / `18` / `21`、`docs/steps/selftest-features.html`、`selftest-demos.html`、`selftest-docs.html`、`docs/AI对话汇总.md`、本章节、15.102 / 15.103。
238
248
  - **验证**:`npx tsc --noEmit` 0 错;`node docs/steps/gen-api-index.mjs` 更新索引;`npm run check:docs` 全绿(276 个实例成员 / 105 个 options / 273 个数据字段);`npm run build` 通过(仅既有大 chunk 提示);`git diff --check` 通过。浏览器串行自测:`selftest-features.html` **786/0**、`selftest-demos.html` **433/0**、`selftest-docs.html` **139/0**。
239
249
 
240
- ## 十三、上十增量:交互样式优先级回归、单 / 多要素样式 Demo 与详情查询(2026-10-30)
250
+ ## 十四、上十一增量:交互样式优先级回归、单 / 多要素样式 Demo 与详情查询(2026-10-30)
241
251
 
242
252
  - **需求来源**:根目录 `修改.txt` 三条:① 选中 / 框选 / 多选 / 级联等交互颜色始终最高,不受规则束缚;② 增加修改单个或多个节点 / 线路样式的 demo;③ 查询单个或多个节点、线路、通道详情的写法。用户补充「不考虑分组详情」,因此本轮不扩展分组查询。
243
253
  - **交互优先级审计**:核对 `point.js` / `line.js` 的状态样式取值顺序,并确认 `applyPointNarrowFast` / `applyLineNarrowFast` 只在无规则、无热力图且规则输入未变时启用,不会绕过交互层。`selftest-features` 新增单选、动态 override 规则、多选节点 / 线路、框选节点 / 线路与级联共 7 条断言;线路框选仍走 `lineSelectStyle`,没有新增公开选项。
@@ -246,7 +256,7 @@
246
256
  - **核心文件**:`docs/demos/StyleDemo.vue`、`docs/demos/demos.js`、`docs/manual/11-样式与规则.md`、`docs/manual/18-逐方法示例.md`、`docs/steps/selftest-features.html`、`docs/steps/selftest-demos.html`、`docs/AI对话汇总.md`、本章节、15.101。
247
257
  - **验证**:`npx tsc --noEmit`、`npm run check:docs`(276 个实例成员 / 102 个 options / 270 个数据字段)、`npm run build`、`git diff --check` 通过;`selftest-features` **778/0**、`selftest-demos` **415/0**、`selftest-docs` **138/0**。未新增公开 API / options / 数据字段。
248
258
 
249
- ## 十四、上十一增量:规则优先级分层、单要素样式说明与解析性能(2026-10-30)
259
+ ## 十五、上十二增量:规则优先级分层、单要素样式说明与解析性能(2026-10-30)
250
260
 
251
261
  - **需求来源**:根目录 `修改.txt` 四条 —— ① 规则样式始终高于外层 `pointStyle` / `lineStyle`,但默认低于要素自身样式;② 单条规则可设置 `override: true`,压过要素自身样式;③ 说明如何修改单个节点 / 单条线路的颜色、尺寸、图标等样式;④ 继续优化组件性能。
252
262
  - **优先级口径**:状态样式 / 热力图 > override 规则 > 要素自身样式 > 普通规则 > 外层 `pointStyle` / `lineStyle` > 默认值。普通规则只补要素自身没写的字段,但始终高于外层样式;override 规则写了的字段压过要素自身,未写字段继续回落;同一层后命中的规则覆盖先命中的规则。状态样式与热力图保持最高。
@@ -256,7 +266,7 @@
256
266
  - **核心文件**:`src/gis-view/rules.js`、`point.js`、`line.js`、`engine.js`、`create.js`、`types.d.ts`;手册 11 及 02 / 03 / 07 / 09 / 12 / 13 / 14 / 16 / 17 / 18 / 19 / 20 / 21、格式 02 / 03、internals 10 / 13 / 17 / 18 / 15.100、from0 06、教学页、`src/gis-view/README.md`、`StyleDemo.vue`、`docs/demos/api-index.js`、`docs/AI对话汇总.md`、本章节。
257
267
  - **验证**:`npx tsc --noEmit`、`npm run check:docs`(276 / 102 / 270)、`node docs/steps/gen-api-index.mjs`、`npm run build`、`git diff --check` 通过;`selftest-features` 771/0(新增 11 条优先级、override、状态样式、`updatePoint` / `updateLine` 断言),actions 96/0、data 103/0、decoration 75/0、demo 133/0、demos 407/0、docs 138/0、effects 96/0、full 94/0、labels 178/0、select 102/0、selftest 19/0。`selftest-perf` 186/1(既有标签布局读数量测)、`selftest-scale` 120/2(既有筛选回调时序 `onFilter 0 条`),单页重跑仍复现,与本轮样式链无关。
258
268
 
259
- ## 十五、上十二增量:updatePoint 快路径、id 索引拆分与插件生命周期(2026-10-29)
269
+ ## 十六、上十三增量:updatePoint 快路径、id 索引拆分与插件生命周期(2026-10-29)
260
270
 
261
271
  - **需求来源**:根目录 `修改.txt` 两条:① 继续优化组件性能,包括交互、方法调用等,允许大改;② 提高组件可扩展性和后续可操作性。
262
272
  - **updatePoint 快路径**:只有坐标 / id 变化才收集跟随线路,只有节点外框尺寸变化才重排锚定通道;改名称、颜色等业务字段直接补单点槽位,不再扫线路、重排通道或刷新拐点批次。id 改名时先用旧对象解析旧线路绑定,再用新坐标补几何。
@@ -266,7 +276,7 @@
266
276
  - **核心文件**:`src/gis-view/create.js`、`engine.js`、`types.d.ts`;`docs/manual/03` / `15` / `16` / `17` / `18` / `20`、`docs/demos/api-index.js`、`docs/steps/selftest-features.html`、`docs/AI对话汇总.md`、本章节。
267
277
  - **验证**:`npx tsc --noEmit`、`npm run check:docs`(276 / 102 / 270)、`node docs/steps/gen-api-index.mjs --check`、`npm run build`、`git diff --check` 通过;`selftest-select` 102/0、`selftest-demos` 407/0、`selftest-features` 760/0、`selftest-docs` 138/0、`selftest-perf` 187/0。
268
278
 
269
- ## 十六、上十三增量:div 保留框跟随、通道单回线显隐与拾取优化(2026-10-29)
279
+ ## 十七、上十四增量:div 保留框跟随、通道单回线显隐与拾取优化(2026-10-29)
270
280
 
271
281
  - **需求来源**:根目录 `修改.txt` 四条:① 框选后保留选框,并支持拖动整框平移选中节点及关联线路 / 通道;② 框选框支持自定义边框、DOM 渲染与类名;③ 节点、线路、通道、分组支持单个 / 批量隐藏与恢复;④ 隐藏线路时可保留原回线位置或让剩余回线重新居中。
272
282
  - **本轮续修来源**:根目录 `修改.txt` 三条:① div 保留框移动地图时跟随;② 通道 demo 展示隐藏通道内指定线路;③ 继续优化性能。
@@ -276,7 +286,7 @@
276
286
  - **核心文件**:`src/gis-view/engine.js`、`create.js`、`types.d.ts`、`update-policy.js`、`gis-view.css`;`docs/manual/03` / `08` / `09` / `16` / `17` / `18` / `20`、`docs/internals/18`、`ChannelDemo.vue`、`demos.js`、`gis-view-demo` 面板、`docs/steps/selftest-select.html`、`selftest-demos.html`、`selftest-features.html`、`selftest-docs.html`、`selftest-perf.html`、`docs/demos/api-index.js`、`docs/AI对话汇总.md`、本章节。
277
287
  - **验证**:`npx tsc --noEmit`、`npm run check:docs`(276 个实例成员 / 102 个 options / 270 个数据字段)、`node docs/steps/gen-api-index.mjs --check`、`npm run build`(仅有既有大 chunk 提示)与 `git diff --check` 通过;`selftest-select` 102/0、`selftest-demos` 407/0、`selftest-features` 752/0、`selftest-docs` 138/0、`selftest-perf` 187/0。10 万点 / 10 万线基准连续 3 次已记录在手册 20 与 internals 18,拾取保持亚毫秒级,平移 / 刷新受无头环境抖动影响。
278
288
 
279
- ## 十七、怎么自己复查
289
+ ## 十八、怎么自己复查
280
290
 
281
291
  ### 1. 先看本次工作区改了什么
282
292
 
@@ -865,7 +865,7 @@ view.updateOptions({ selectTrigger: 'click' })
865
865
 
866
866
  - **类型**:`GisViewSelectionKindsInput`
867
867
  - **默认值**:无(框选只收节点;Ctrl 多选仍收节点 / 线路 / 通道)
868
- - **说明**:限定框选与 Ctrl(⌘)/ `multiSelect` 点击能选中哪几类要素。`'point'` 是节点、`'line'` 是通道外的独立线路、`'channel'` 是通道回线;`'lineEndpoints'` / `'channelEndpoints'` 是框选专用的另一种口径,要求线路 / 通道自己的两端节点都落在框内,纯 `path`、缺失端点与自环跳过。数组可任意组合,`'all'` / `true` 五档全开,`false` / `null` 全关;新旧线路 / 通道口径并存时取并集。通道回线只受 `channel` 管、通道外的线路只受 `line` 管;选中通道回线时仍按 `channelSelectMode` 决定只选这一条 / 一组 / 整条通道。端点口径不会顺带选中两端节点,也不依赖 `point` 是否开启。**不写时保持旧口径**:框选只收节点,Ctrl / 多选点击收节点与线路;显式写 `selectionKinds` 后框选按完整过滤、Ctrl / 多选点击只认互斥的 `point` / `line` / `channel`。普通单击、`toggleSelect` 的再次点击取消与 `select` / `selectFeatures` 接口不受限制;`selectInBox(box, { selectionKinds })` 可一次性覆盖。
868
+ - **说明**:限定框选与 Ctrl(⌘)/ `multiSelect` 点击能选中哪几类要素。`'point'` 是节点、`'line'` 是通道外的独立线路、`'channel'` 是通道回线;`'lineEndpoints'` / `'channelEndpoints'` 是框选专用的另一种口径,要求线路 / 通道自己的两端节点都落在框内,纯 `path`、缺失端点与自环跳过。数组可任意组合,`'all'` / `true` 五档全开,`false` / `null` 全关;新旧线路 / 通道口径并存时取并集。通道回线只受 `channel` 管、通道外的线路只受 `line` 管;选中通道回线时仍按 `channelSelectMode` 决定只选这一条 / 一组 / 整条通道。`line` / `channel` 的几何命中按实际折线路径与选框逐线段相交判定,包围盒只用于候选粗筛,U 形 / 折返线路不会因包围盒覆盖选框而误选。端点口径不会顺带选中两端节点,也不依赖 `point` 是否开启。**不写时保持旧口径**:框选只收节点,Ctrl / 多选点击收节点与线路;显式写 `selectionKinds` 后框选按完整过滤、Ctrl / 多选点击只认互斥的 `point` / `line` / `channel`。普通单击、`toggleSelect` 的再次点击取消与 `select` / `selectFeatures` 接口不受限制;`selectInBox(box, { selectionKinds })` 可一次性覆盖。
869
869
  - **参考**:见「08 选中与拐点」的「框选」与「选择类型过滤(selectionKinds)」
870
870
  - **示例**:
871
871
 
@@ -60,7 +60,7 @@ createGisView(container, {
60
60
  })
61
61
  ```
62
62
 
63
- 拖动期间选框实时跟随,但事件只在松手时派发一次,不会拖动一帧报一次。**框选默认只收节点**,保持旧口径;写 `selectionKinds` 后可以把通道外的线路与通道回线一起纳入(三类任意组合),也可以改用端点口径,只收两端节点都框住的线路 / 通道,见下节。选中结果用 `getSelections()` / `getSelectionData().ids` 读回。用代码框选等价于调用 `selectInBox({ x, y, width, height })`,矩形同样是画布 CSS 像素;第二段还能临时覆盖类型过滤。框选命中的节点套用框选样式(`options.pointBoxSelectStyle`,节点自己的 `boxSelectStyle` 优先),缺省与选中样式完全一致;框选出来的线路走普通的 `lineSelectStyle`(线路没有单独的框选样式)。
63
+ 拖动期间选框实时跟随,但事件只在松手时派发一次,不会拖动一帧报一次。**框选默认只收节点**,保持旧口径;写 `selectionKinds` 后可以把通道外的线路与通道回线一起纳入(三类任意组合),也可以改用端点口径,只收两端节点都框住的线路 / 通道,见下节。线路 / 通道的 `line` / `channel` 口径按**实际折线路径与选框逐线段相交**判定,包围盒只用于候选粗筛;U 形、折返或远距离绕行的线不会因为包围盒盖住选框而被误选,通道也不会因此被整条摊开。选中结果用 `getSelections()` / `getSelectionData().ids` 读回。用代码框选等价于调用 `selectInBox({ x, y, width, height })`,矩形同样是画布 CSS 像素;第二段还能临时覆盖类型过滤。框选命中的节点套用框选样式(`options.pointBoxSelectStyle`,节点自己的 `boxSelectStyle` 优先),缺省与选中样式完全一致;框选出来的线路走普通的 `lineSelectStyle`(线路没有单独的框选样式)。
64
64
 
65
65
  ### 保留框与整组拖动(selectionBoxPersistent)
66
66
 
@@ -371,6 +371,40 @@
371
371
  epView.destroy()
372
372
  epHost.remove()
373
373
 
374
+ /* ---------- 框选只认路径实际沾框:包围盒相交但几何不沾框的 U 形线路 / 通道不能误选 ---------- */
375
+ const bxHost = document.createElement('div')
376
+ bxHost.style.cssText = 'width:400px;height:320px'
377
+ document.body.append(bxHost)
378
+ const bxView = createGisView(bxHost, {
379
+ points: [
380
+ { id: 'bx-a', x: -120, y: -120, size: 10 },
381
+ { id: 'bx-b', x: 120, y: -120, size: 10 }
382
+ ],
383
+ lines: [
384
+ { id: 'bx-hit', path: [[-15, 0], [15, 0]], width: 8 },
385
+ { id: 'bx-u', path: [[-120, -120], [-120, 120], [120, 120], [120, -120]], width: 8 },
386
+ { id: 'bx-ch-line', from: 'bx-a', to: 'bx-b', width: 8 }
387
+ ],
388
+ channels: [{ id: 'bx-ch', from: 'bx-a', to: 'bx-b', path: [[-120, 120], [120, 120]], lineIds: ['bx-ch-line'] }],
389
+ features: 'view',
390
+ selectionKinds: ['line', 'channel'],
391
+ channelSelectMode: 'channel',
392
+ showGrid: false,
393
+ fitOnInit: false,
394
+ initialView: { center: [0, 0], scale: 1 },
395
+ width: 400,
396
+ height: 320
397
+ })
398
+ await settle(120)
399
+ const bxBox = bxView.canvas.getBoundingClientRect()
400
+ bxView.selectInBox({ x: bxBox.width / 2 - 20, y: bxBox.height / 2 - 20, width: 40, height: 40 }, { selectionKinds: ['line', 'channel'] })
401
+ const bxInfo = bxView.getSelectionData()
402
+ check('框选只认路径实际沾框:包围盒相交但不在框内的 U 形线路 / 通道不选中',
403
+ bxInfo.lineCount === 1 && bxInfo.channelCount === 0 && bxView.isSelected('bx-hit') && !bxView.isSelected('bx-u') && !bxView.isSelected('bx-ch-line'),
404
+ JSON.stringify({ lines: bxInfo.lineCount, channels: bxInfo.channelCount, ids: bxInfo.ids }))
405
+ bxView.destroy()
406
+ bxHost.remove()
407
+
374
408
  /* ---------- 本轮:框选保留、整框拖动、DOM 样式与手动关闭 ---------- */
375
409
  const persistHost = document.createElement('div')
376
410
  persistHost.style.cssText = 'width:400px;height:260px'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gis-view-webgl2",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "WebGL2 矢量视图:点、线与 GeoJSON / 图片背景层,可选鹰眼图与图例,点击 / 双击 / 拖拽可配置",
5
5
  "type": "module",
6
6
  "scripts": {