gis-view-webgl2 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +7 -7
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.d.ts +140 -20
  4. package/dist/index.js +1 -1
  5. package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +45 -0
  6. package/docs/GisView.md +53 -53
  7. package/docs/ai/06-/344/274/232/350/257/235/347/264/242/345/274/225/344/270/216/345/244/215/346/237/245/346/226/271/346/263/225.md +36 -0
  8. package/docs/demos/ConnectDemo.vue +114 -3
  9. package/docs/demos/MinimapDemo.vue +62 -16
  10. package/docs/demos/api-index.js +15 -14
  11. package/docs/demos/gis-view-demo/GisViewDemoStage.vue +25 -16
  12. package/docs/demos/gis-view-demo/useGisViewDemo.js +27 -16
  13. package/docs/index.html +3 -3
  14. package/docs/internals/13-/351/271/260/347/234/274/345/233/276.md +6 -5
  15. package/docs/internals/16-01-/344/274/230/345/214/226/344/270/216/345/217/226/350/210/215-/344/270/212.md +5 -3
  16. package/docs/internals/18-/346/200/247/350/203/275/345/256/236/346/265/213/344/270/216WebGPU/350/257/204/344/274/260.md +12 -0
  17. package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +11 -3
  18. package/docs/manual/09-/351/200/232/351/201/223/344/270/216/345/244/232/345/233/236/347/272/277.md +1 -1
  19. package/docs/manual/10-/351/200/232/351/201/223/347/274/226/350/276/221/344/270/216/346/226/260/345/242/236.md +423 -3
  20. package/docs/manual/14-/350/247/206/345/233/276/344/270/216/347/255/233/351/200/211.md +79 -28
  21. package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +6 -5
  22. package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +5 -4
  23. package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +117 -5
  24. 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 +5 -2
  25. package/docs/steps/README.md +5 -5
  26. package/docs/steps/selftest-demos.html +149 -5
  27. package/docs/steps/selftest-docs.html +3 -3
  28. package/docs/steps/selftest-full.html +315 -12
  29. package/docs/steps/selftest-perf.html +39 -1
  30. package/package.json +1 -1
package/README.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  不依赖任何图形库的 WebGL2 矢量视图:点、线、背景层(图片 / GeoJSON)与首屏落位(`initialView`)都通过 `createGisView(dom, options)` 创建,宽高默认跟随传入的 DOM 容器;跨项目复用的视图级逻辑用 `plugins` 挂载。
4
4
 
5
- 本轮补齐四项:`focusOn` 缺省只居中、显式 `zoom: true` 才按范围适配;文档中心与 API 速查互跳,并修掉左侧分组跳转的慢速平滑滚动;新增实例命令扩展点与可交互 demo;筛选补丁、通道范围读取与事件分发做定向性能优化。
5
+ 本轮围绕鹰眼图尺寸与拖拽澄清:沿用主图规则时,节点 / 线路按「小图视口 ÷ 主图视口」的较小比例缩放,主图放大不再改变它们的大小;只有小图自身放大时才按 `pointZoomScale` / `lineZoomScale` 联动;`pointSizeScale` / `lineWidthScale` 是独立于两边缩放的整体倍数,自有规则与沿用主图的要素都乘这一份。另有 `dragAction: 'box'` 不依赖手动缩放、`zoomable: 'follow'` 与 `followZoomScale` 整体范围跟随主图,以及 `extentFollowCamera` 默认关闭避免包围盒跳动;新增通道草稿的示例点可显隐 / 分端配色 / 换形状,示例线路层级可配,端点严格落在节点中心;`commitAddChannel` 可直接接收本次新增的线路 / 通道对象。
6
6
 
7
7
  - 渲染层:原生 WebGL2(GLSL ES 3.00 + 实例化绘制),没有任何运行时依赖,也不需要 Vue。
8
8
  - 交互层:拖拽平移、滚轮缩放、按关键字搜索并定位(节点 / 线路 / 通道)、点击 / 双击拾取、点拖拽(相连线路同步移动)、Shift 拖动框选与 Ctrl 点击累加多选(多选后整组同步移动;`selectionKinds` 可限定只选节点 / 线路 / 通道或任意组合)、复制只带选中要素、节点合并可指定保留端并改写最终信息与样式、线路拐点编辑与通道多回线,全部走配置与回调 —— **这些能力缺省全关**,要哪一项显式打开(`features` 预设 / 开关表,或 `interactive: true` / `clickable: true` / `draggable: true` 这类详细配置,见 `docs/GisView.md` 的「功能开关」)。
9
9
  - 数据层:按属性筛选(点被过滤时绑在它身上的线路与通道一起消失,大数据量走 Web Worker)、按属性批量配色 / 换符号、节点标签(内容、贴边方式、HTML 定制、数量与显隐可配,十万级数据下有候选上限兜底)与点 / 线 / 通道的悬浮提示,筛选、规则与标签共用同一套条件语言;节点标签与线路标签分开配置、都支持 `auto`(智能隐藏)/ `always` / `hidden` 三种显隐策略,线路标签的位置沿线走(比例 / 百分比 / 绝对距离)、候选还会按屏幕小格摊开(通道里的并行回线不会把扫描名额占光),线路上还能按同样的位置写法挂图片或 SVG 装饰(`decorations`,通道回线可以用 `linePropsByMember` 逐条配;装饰缺省 `auto` —— 线路上没有拐点时按比例跟随(挂在中点就一直保持中点),有了拐点就跟拐点一样钉在线路上(位置不再沿路径挪动,线路几何一变就把锚点投回线身最近的点),写 `anchor: 'follow'` 强制一直跟随、`anchor: 'fixed'` + `at: [x, y]` 则固定在写死的坐标上;装饰与线路标签都能写 `parallel: true` 跟着线路方向转,通道里的每条回线也能各显示各的标签)。节点也能用 `points[].decorations` 挂图片 / SVG:`offset` 或 `distance` + `direction` 是相对节点的屏幕像素偏移(缩放时保持像素距离),`anchor: 'fixed'` / `at` 是固定世界坐标,`connector` 可从节点中心画连接线。平移 / 缩放 / 拖拽期间两类标签都能各自配 `hideOnInteract`(`true` 或者「标签数超过 N 才收」),收起时只切一个 class、不写标签 DOM,停手自动补齐;线路标签另有 `followOnInteract`(默认开)—— 没收起时拖节点 / 拖拐点期间跟着线路走,关掉则停手后统一归位;通道回线的提示范围用 `tooltip.channelScope` 在整条通道 / 所属分组 / 单条回线之间切。
10
10
  - 大数据与导出:`denseMode` 缺省 `'auto'`,按可见节点数(4000)、屏幕密度(每百万 CSS 像素 3000)或数据总量(5 万)自动进入密集档,标签切到避让 / 截断、线路动点与节点涟漪暂停,退出留 22% 回滞并恢复用户原来的 `effects`,当前状态看 `getStats().dense`;导出统一收口到 `exportData({ scope, parts, format })`,`scope` 选全量 / 视口 / 选中,`parts` 选场站 / 线路 / 通道 / 拐点。需要自己画 WebGL 标记或特效时,用 `webglLayers` / `addWebGLLayer()` 或直接取 `view.gl`。
11
11
  - 动态装饰器:`beginDecorationDraft` 用 `target` 选择只挂线路、只挂节点或两类同时开启(`both` 时按屏幕距离取更近者、等距优先节点,最近目标不可用时回退另一类);线路侧保留单线 / 分组 / 整条通道三种范围与平行方向,节点侧可切相对偏移 / 固定坐标 / 鼠标位置并画连接线。触发半径默认收紧到 14px,离开目标立即收掉;`maxPerLine` / `maxPerPoint` 分别限制每线 / 每点数量,`allowedLines` / `allowedChannels` / `allowedGroups` / `allowedPoints` 限定白名单,超限或不在白名单的目标静默不触发,提交前还会按最新数据复核;`allowDuplicate: false` 时按 `duplicateDistance` 检测同一位置,`duplicateStrategy` 可选自动避让或直接拒绝。空白处松手不发事件,只有命中的左键松开才发 `ready`;确认走 `commitDecorationDraft` 一次批量写入(线路与节点同一批、一条历史),取消走 `cancelDecorationDraft`,数据与历史在确认前不动。演示页可从左侧图标拖到线路,也可分别开启节点 / 线路装饰并现场调吸附方式、白名单与重复策略。
12
- - 界面尽量不内置:控制面板、读数、图例都不生成,组件只提供画布与实例方法,样式完全由使用方决定(标签与提示框是覆盖层,默认外观可以整体改写);唯一可选的界面是内置鹰眼图——配 `minimap` 才挂一层小地图(位置、尺寸、节点 / 线路 / 视口框三份样式与交互都可配,`zoomable` 打开后小图自身也能整体放大缩小:空白处拖动可以平移小图、或直接框选让主图显示过去,每格倍率 `zoomStep` 单独配,通道还能只画一根回线;小图同样吃规则——`pointRules` / `lineRules` 决定每个节点 / 每条线的颜色、大小与层级,`levels` 只看某几层、`layered` 控制分层叠画、`pointZoomScale` / `lineZoomScale` 让节点与线路跟着小图倍数放大,不配自己的规则时自动沿用主图规则的颜色与层级;自定义内容可以用 `layers` 按 `placement` 分到数据前 / 数据后、段内按 `order` 叠放,旧的单层 `draw` 仍兼容,手势完成时可通过 `onInteraction` 获取类型 / 世界坐标 / 相机,`maxPixelRatio` 可限制高分屏 / 宿主放大时的备份倍率),不配不产生任何 DOM。
12
+ - 界面尽量不内置:控制面板、读数、图例都不生成,组件只提供画布与实例方法,样式完全由使用方决定(标签与提示框是覆盖层,默认外观可以整体改写);唯一可选的界面是内置鹰眼图——配 `minimap` 才挂一层小地图(位置、尺寸、节点 / 线路 / 视口框三份样式与交互都可配,`offset` 可动态移动整张图、`container` 可挂到外部 `div`。`extentFollowCamera` 默认关闭,外围要素消失时不会自行收窄包围盒;`zoomable` 三态互斥:`false` 关闭、`true` 手动缩放小图自身、`'follow'` 让整体范围跟随主图(`followZoomScale` 调指数,`setMinimapZoom` / `zoomMinimapBy` 在跟随档不抢控制权)。空白处拖动可以平移小图、或直接框选让主图显示过去(`dragAction`;`box` 不依赖缩放,手动模式下 Ctrl / ⌘ 才切换动作),每格倍率 `zoomStep` 单独配,`channelCircuits: false` 时按当前可见成员逐顶点平均成一根居中代表线;小图同样吃规则——`pointRules` / `lineRules` 决定每个节点 / 每条线的颜色、大小与层级,`levels` 只看某几层、`layered` 控制分层叠画、`pointZoomScale` / `lineZoomScale` 让节点与线路跟着小图倍数放大,不配自己的规则时自动沿用主图规则的颜色 / 层级 / 最终节点尺寸与图标 / 样式链线宽,沿用尺寸时按「小图视口 ÷ 主图视口」的较小比例缩放,主图放大缩小不改变它们的大小;`pointSizeScale` / `lineWidthScale` 对所有要素生效,`pointMapZoomScale` / `lineMapZoomScale` 只作用于小图自有规则 / 样式;自定义内容可以用 `layers` 按 `placement` 分到数据前 / 数据后、段内按 `order` 叠放,旧的单层 `draw` 仍兼容,手势完成时可通过 `onInteraction` 获取类型 / 世界坐标 / 相机,`maxPixelRatio` 可限制高分屏 / 宿主放大时的备份倍率),不配不产生任何 DOM。
13
13
  - 数据切换与加载信号:`updateData(points, lines, channels)` 一次换完整个场景(也收 `{ points, lines, channels }`;接口列名不一样时先在调用方映射成这三列,见 [06 数据与场景更新](docs/manual/06-数据与场景更新.md#接口列名不一样映射放在调用方)),场站 / 回线按批补用 `addPoints` / `addChannels`(批量通道只重排一次、只记一步历史),`onDataRendered` / `whenRendered` / `whenDataRendered` 给出「这一份数据已经画到屏幕上」的信号 —— loading 遮罩在这之后收,不会闪一帧旧画面。
14
14
  - 整包只有一个组件:`gis-view`,只从根入口导出;扩展点集中在插件、自定义图元 / 条件运算符、自定义导出格式(`defineExportFormat` / `registerExportFormat`)、WebGL 自定义层与实例命令(`registerCommand`),不需要改组件源码。
15
15
 
@@ -22,7 +22,7 @@ npm install
22
22
  npm run dev
23
23
  ```
24
24
 
25
- 打开终端提示的地址,页面就是 `docs/demos/GisViewDemo.vue`:下拉第一项是仓库根目录 `new.json` 的真实数据(2164 个站点 / 3669 条线路 / 2629 条通道,点位与走向直接照它渲染),也可以切到同在根目录的样例数据 `test.json`(320 个站点 / 449 条线路,按 `channel_id` 聚合成 107 条多回线通道),或切回 900 / 5000 / 10 万的合成数据;真实与样例数据的线色、线宽和站点符号照 `test.js` 的 `getGisStyle` / `getSymbolPath` 分档,转成组件的批量规则表(`docs/demos/gisStyle.js`),关掉「按属性批量配色 / 换符号」就能对比同一份数据的两套外观。演示点击、双击、悬停、拖拽节点、Shift 框选与 Ctrl 点击多选、拐点编辑(加过 / 拖过拐点的通道与线路会归到「新增拐点集合」,读数栏下面直接列出来,点「导出拐点集合」把 `getParallelGroups()` 的结果复制到剪贴板),两端锚在节点上的二 / 三 / 四 / 五回线通道(可切换偏移方式、通道宽度与内收距离,也可以勾「隐藏通道端点节点」看通道与回线一起消失),以及新增的筛选下拉框(电压、站点类型、名称关键字、联动方式与「线路也按电压过滤」)、按属性配色换符号开关(站点符号可选原 SVG 路径或内置方块,路径描边粗细可调)、按电压分层(`zIndex`,高电压等级压在上面)、节点形状(圆 / 正方形 / 圆角方形)、标签位置 / 内容 / HTML 渲染 / 数量 / 候选上限与悬浮提示开关;筛选读数会显示隐藏了多少点 / 线、这次判定走的是 Web Worker 还是主线程、耗时多少。右下角的鹰眼图现在由组件自带(`minimap`):demo 只给尺寸、线路显隐、回线根数、拖动动作、步进、三份样式,以及这一轮新增的规则配色 / 分层开关 / 只看某几层(`levels`)/ 节点与线路跟随小图放大(`pointZoomScale` / `lineZoomScale`)(「可缩放」打开后滚轮与 - / + 按钮按 `zoomStep` 整体放大缩小鹰眼图自身,Ctrl / ⌘ + 滚轮留给主图;空白处拖动按 `dragAction` 平移小图或直接框选,按住 Ctrl / ⌘ 是另一个动作),缩略图画的是筛选后仍可见的节点与线路(含通道回线,关掉「回线」一个通道只画中间那一根),在视口框上按下直接拖框、空白处长按后视角跟随、单击不再改动视角。通道面板下面还有「通道分组」与「定向更新」两行:前者把选中的通道按每组的回线数拆开或合并回去(读数里能看到每个分组几回线、有没有拐点),后者改一个节点 / 线路 / 通道就立刻重渲染相关的视图,演示 `splitChannelGroups` / `mergeChannelGroups` / `moveChannelLine` / `updatePoint` / `updateLine` / `updateChannel` 这几个接口(右键框里每条回线都能单独分配:拆成新分组、或并进第 n 组,两回线拆成两个分组各一条);界面(按钮、滑块、读数浮层)仍然全部写在 demo 里。这一轮把 demo 重新排了一遍:说明段落收进「展开说明」、配置按组折进可折叠面板,画布右上角多了「全屏」按钮(`requestFullscreen` + `resize()`);节点标签默认只标最高电压那一档、线路标签默认不显示(面板上各有一份「显示范围」),新增的「规则更新」面板可以把规则写成 JSON 再点一下重新渲染。这一轮再把面板收进「视图 / 样式 / 数据」三个分页(整块面板栈独立滚动、鹰眼图设置默认折叠),画布默认垫一层由 `docs/demos/demoBackground.js` 现生成的 GeoJSON 底图(街区 + 环线 + 经纬网,可切三档底图与透明度),并新增「初始视图与背景」面板:首屏不再铺满整屏,默认聚焦数据中心放大 3 倍,也能切「适应全部 / 2× / 3×」或自己填中心点与倍数;demo 里还内置了一份插件示例 `focusSelectionPlugin`(按 F 聚焦当前选中),演示 `plugins` 的挂载与随视图销毁。
25
+ 打开终端提示的地址,页面就是 `docs/demos/GisViewDemo.vue`:下拉第一项是仓库根目录 `new.json` 的真实数据(2164 个站点 / 3669 条线路 / 2629 条通道,点位与走向直接照它渲染),也可以切到同在根目录的样例数据 `test.json`(320 个站点 / 449 条线路,按 `channel_id` 聚合成 107 条多回线通道),或切回 900 / 5000 / 10 万的合成数据;真实与样例数据的线色、线宽和站点符号照 `test.js` 的 `getGisStyle` / `getSymbolPath` 分档,转成组件的批量规则表(`docs/demos/gisStyle.js`),关掉「按属性批量配色 / 换符号」就能对比同一份数据的两套外观。演示点击、双击、悬停、拖拽节点、Shift 框选与 Ctrl 点击多选、拐点编辑(加过 / 拖过拐点的通道与线路会归到「新增拐点集合」,读数栏下面直接列出来,点「导出拐点集合」把 `getParallelGroups()` 的结果复制到剪贴板),两端锚在节点上的二 / 三 / 四 / 五回线通道(可切换偏移方式、通道宽度与内收距离,也可以勾「隐藏通道端点节点」看通道与回线一起消失),以及新增的筛选下拉框(电压、站点类型、名称关键字、联动方式与「线路也按电压过滤」)、按属性配色换符号开关(站点符号可选原 SVG 路径或内置方块,路径描边粗细可调)、按电压分层(`zIndex`,高电压等级压在上面)、节点形状(圆 / 正方形 / 圆角方形)、标签位置 / 内容 / HTML 渲染 / 数量 / 候选上限与悬浮提示开关;筛选读数会显示隐藏了多少点 / 线、这次判定走的是 Web Worker 还是主线程、耗时多少。右下角的鹰眼图现在由组件自带(`minimap`):demo 只给尺寸、线路显隐、回线根数、拖动动作、步进、三份样式,以及这一轮新增的规则配色 / 分层开关 / 只看某几层(`levels`)/ 节点与线路跟随小图放大(`pointZoomScale` / `lineZoomScale`)(「可缩放」打开后滚轮与 - / + 按钮按 `zoomStep` 整体放大缩小鹰眼图自身,Ctrl / ⌘ + 滚轮留给主图;空白处拖动按 `dragAction` 平移小图或直接框选,按住 Ctrl / ⌘ 是另一个动作),缩略图画的是筛选后仍可见的节点与线路(含通道回线,关掉「回线」时每个分组画按可见成员逐顶点平均出的居中代表线),在视口框上按下直接拖框、空白处长按后视角跟随、单击不再改动视角。通道面板下面还有「通道分组」与「定向更新」两行:前者把选中的通道按每组的回线数拆开或合并回去(读数里能看到每个分组几回线、有没有拐点),后者改一个节点 / 线路 / 通道就立刻重渲染相关的视图,演示 `splitChannelGroups` / `mergeChannelGroups` / `moveChannelLine` / `updatePoint` / `updateLine` / `updateChannel` 这几个接口(右键框里每条回线都能单独分配:拆成新分组、或并进第 n 组,两回线拆成两个分组各一条);界面(按钮、滑块、读数浮层)仍然全部写在 demo 里。这一轮把 demo 重新排了一遍:说明段落收进「展开说明」、配置按组折进可折叠面板,画布右上角多了「全屏」按钮(`requestFullscreen` + `resize()`);节点标签默认只标最高电压那一档、线路标签默认不显示(面板上各有一份「显示范围」),新增的「规则更新」面板可以把规则写成 JSON 再点一下重新渲染。这一轮再把面板收进「视图 / 样式 / 数据」三个分页(整块面板栈独立滚动、鹰眼图设置默认折叠),画布默认垫一层由 `docs/demos/demoBackground.js` 现生成的 GeoJSON 底图(街区 + 环线 + 经纬网,可切三档底图与透明度),并新增「初始视图与背景」面板:首屏不再铺满整屏,默认聚焦数据中心放大 3 倍,也能切「适应全部 / 2× / 3×」或自己填中心点与倍数;demo 里还内置了一份插件示例 `focusSelectionPlugin`(按 F 聚焦当前选中),演示 `plugins` 的挂载与随视图销毁。
26
26
  通道面板这一轮又多了一块:分组按整条通道的车道错开,拆分 / 合并不会挪动任何一条回线(两回线拆成两组各一条时两根线一左一右分居骨架两侧,四回线拆成两组时四条线还停在原来的位置上),想把某一组拐到别的走廊上就用「加拐点分开分组 / 去掉分开的拐点」按组挪拐点(`addChannelGroupWaypoint` / `removeChannelGroupWaypoint`);右键点通道回线弹出交互框,`onContextMenu` 里给出这条通道有几组、当前是哪一组、每组几条回线与可用交互(点空白处或节点时载荷没有 `channelContext`,据此收框);「新增通道」点两次节点、草稿线跟着光标走,第二个节点点完在框里选「新建通道 / 变成新分组 / 并入某一组」,也可以勾自动提交或直接调 `addChannel`。右键框这一轮又加了「线路分配」:当前分组的每条回线各有一个下拉(拆成新分组 / 并入第 n 组)+「分配」按钮,走 `moveChannelLine`,组数 / 回线数到上限会被拒绝并在读数里给出原因。这一轮右键框再补齐:分组列表点一下就是 `setCurrentChannelGroup`(顺带选中这一组的回线、当前组高亮),下面一排「选中该分组 / 加拐点 / 删拐点 / 拆成多组 / 合并回一组」走 `runChannelAction`(灰掉的按钮悬停能看到原因),Esc / × / 点空白处收框;这两件事都要显式开开关:`features: { drag: true, contextMenu: true }` 与 `waypointEditable: true`(开关缺省全关;通道右键框还要 `contextMenu` 开着,通常给 `features: 'view'` 再加 `contextMenu: true`)。
27
27
 
28
28
  这一轮的 demo 拆成了「一个壳 + 多个标签页」:入口是 `docs/demos/DemoShell.vue` 配 `docs/demos/demos.js`(id / 标题 / 一句说明 / 懒加载的 `component`),切标签页会把 `?demo=<id>` 用 `replaceState` 写回地址栏,收藏一个链接就能直接打开某一页;顶部按基础 / 交互 / 样式 / 数据 / 性能 / 综合分组,一次只展开当前组。页签各自只演示一件事(现在是 21 个功能页 + 综合示例):`basic` 最小画布与拾取、`labels` 节点与线路标签(拖动 / 点击 / 右键 / 双击 / 批量加标签 API)、`label-display` 标签内容与显示策略、`minimap` 鹰眼图配置(尺寸 / 位置 / 范围 / 规则 / 层级 / 备份倍率 / 小图缩放 / 数据前后分段绘制 / 手势回调)、`style` 规则配色与符号、`hover-tooltip` 悬停高亮与提示模板、`channel` 通道与分组、`events` 事件日志、`api-coverage` 接口能力(级联三种触发、程序化选中、四类 `focusOn`、装饰 / 通道写入、背景投影、历史与运行时清理)、`copy-merge` 框选类型过滤(节点 / 线路 / 通道任意组合)、只复制选中要素、手动 `addPoint` 落点与自动副本二选一、指定保留来源 / 目标并改写最终信息与样式的合并、剪贴板、`batch-add` 多节点 / 线路 / 通道 / 分组 / 拐点的批量新增、`search-filter` 同步 / Worker 检索与筛选、`drag` 拖拽落点、`connect` 可视化连线(无通道也能只用点与线;直线 / 正交折线、箭头、颜色与线宽,取消 / 默认提交 / `addLines` / `addChannels` 三种落地)、`decoration` 动态装饰器(线路 / 节点分开开关或同时开启、悬停预览、节点偏移 / 固定 / 鼠标吸附、白名单与重复策略、确认才写数据)、`extension` 六类扩展点(插件 / 图元 / 运算符 / 导出格式 / WebGL 自定义层 / 实例命令,图元支持同名换画笔并当场重烘焙)、`backend` 编辑与保存、`perf` 大数据与画质档位、`cluster` 点聚合(2 千 / 1.2 万 / 6 万 / 10 万点现场切,调半径 / 最少点数 / `maxZoom`,看聚合耗时与点击载荷)、`effects` 动画效果、`graphic` 扩展图形(SVG 路径 / 图片 / Canvas,相机联动与运行时增删改),`full` 保留原来那份全功能 demo(缺省页签);共用数据与样式抽在 `docs/demos/shared/demoData.js` / `docs/demos/shared/demoStyle.css`,新增自测页 `docs/steps/selftest-demos.html` 逐个页签挂载一遍。
@@ -31,7 +31,7 @@ npm run dev
31
31
 
32
32
  源码本身就是 JS:`src/gis-view/*.js` 逐文件带中文注释,对外类型集中在 `src/gis-view/types.d.ts`(构建时复制成 `dist/index.d.ts`),不用先编译就能直接读。想照着从零写一遍看 [从 0 到完整的实现](docs/从0到完整的实现.md),里面有一份可以照抄的 mini 实现与验收清单。
33
33
 
34
- 想知道组件到底有哪些属性和方法:[GisView 文档](docs/GisView.md) 的「实例方法」一节把 256 个实例成员(方法 + `el` / `canvas` / `gl` 这类属性)与 96 个 `options` 键逐个列全;demo 的「视图 · 交互」页签里有同一份清单(`?demo=full`,可搜索、点一条就对当前视图求值);`node docs/steps/check-doc-coverage.mjs` 负责 10 项双向对账,改完源码或文档先跑 `node docs/steps/gen-api-index.mjs` 重生成 demo 读的那一份(三类查询的口径见 [docs/steps/README.md](docs/steps/README.md) 的「怎么查全部属性与方法」)。
34
+ 想知道组件到底有哪些属性和方法:[GisView 文档](docs/GisView.md) 的「实例方法」一节把 257 个实例成员(方法 + `el` / `canvas` / `gl` 这类属性)与 96 个 `options` 键逐个列全;demo 的「视图 · 交互」页签里有同一份清单(`?demo=full`,可搜索、点一条就对当前视图求值);`node docs/steps/check-doc-coverage.mjs` 负责 10 项双向对账,改完源码或文档先跑 `node docs/steps/gen-api-index.mjs` 重生成 demo 读的那一份(三类查询的口径见 [docs/steps/README.md](docs/steps/README.md) 的「怎么查全部属性与方法」)。
35
35
 
36
36
  ## 构建 npm 包
37
37
 
@@ -258,8 +258,8 @@ view.zoomTo(12).zoomToBounds({ minX: 116, minY: 39, maxX: 117, maxY: 40 }, 60)
258
258
  - 10 万级交互的专项优化:框选的选中集合用 `Set` 做差集(避免平方级比较),整组拖动先按实例槽位排序再按「连续槽位段」合并上传实例数据(十万次 `bufferSubData` 变成几十次,贴图符号点也走自己的槽位表,符号没换就地改位置)、拖动大组时圆头批次改为松手后分摊补齐(拖动期间一个字节都不传),按住拖动 / 滚轮缩放期间自动切轻量渲染(跳过阴影、强调环与高亮重算,停手 160 ms 后补一帧全质量);标签图层在交互期只做一次整体 `transform`、停手 180 ms 后才真实排版,拖点只挪动过的那几个标签;框选抬起时候选下标先按数值排序、差值去重键用数值、圆 / 方符号解析有热缓存、可见点缓存按需作废。demo 里的统计面板按最小间隔重画,避免每帧写响应式数据。这一轮又补了三处:初始化按到视图中心的距离发散渲染(10 万点首屏 1 帧内先出中心一片、3 帧内铺满)、整组拖动在 2048 个节点以上改成就地改坐标并复用事件载荷(10 万点整组拖动每帧 28 ms → 11 ms)、标签在连续平移里每 220 ms 补一次真实排版并把位置取整到像素(拖动中标签不再越拖越空,静止时文字不糊)。
259
259
  - 整组拖动的增量补丁这一轮补齐到每个实例批次:10 万点 / 10 万线整屏框选后连续拖动,每帧补丁 1391 ms → 339 ms(圆头那部分 8 帧合计 9.8 s 在拖动期间归零,松手后 4 帧内分摊补完);规则条件的运算符结果按值记忆,`vn_kv >= 500` 这类分档条件在 10 万级数据上从逐要素求值变成查表。
260
260
  - 这一轮补上三处:拖动节点的线路跟随做成开关(`liveDrag: false` 时拖动期间只画节点、线路与通道原地不动,松手那一下一次算完并上传);节点标签在缩放 / 悬停 / 选中时按相机重投影、间距恒定取「符号半径 + `gap`」(不再被地图缩放一路拉出画布,也不会有「鹰眼图缩放几次主视图标签就不见了」);`sizeScale` 让悬停 / 选中样式按倍数放大(大小各异的节点各自按比例变大,规则里配的倍数不会被顶掉)。
261
- - 这一轮(鹰眼图与缩放联动):小图开了「可缩放」之后,空白处拖动可以直接平移小图内容、或拉出矩形框选让主图显示过去(`dragAction` 与 Ctrl / ⌘ 各管一个动作,平移过内容就不再被自动拽回视口框),每一格放大 / 缩小的倍率由 `zoomStep` 单独配(`zoomInStep` / `zoomOutStep` 还能分别覆盖),`channelCircuits: false` 时一个通道只画偏移最靠中间的那一根回线(多回线挤在小图上只会糊成一片);缩放联动的两组系数分工写明:`pointSizeScale` / `lineWidthScale` 是与地图无关的常数倍数,`pointZoomScale` / `lineZoomScale` 是跟随地图缩放的指数(0 不跟随、1 同倍率),节点尺寸一变,按节点尺寸取宽的通道回线位置跟着走;只有一条回线的通道不再计算回线偏移(回线就是骨架),缩放时的宽度重算与实例重传整块跳过,真实数据里这类通道占大多数。
262
- - 这一轮(通道分组、鹰眼图规则与定向更新):一条通道不再只能是「一整组」——`splitChannelGroups` 把它拆成多个分组、`mergeChannelGroups` 再并回来,每组回线数自己定、最少一条,拆分出来的新分组不带走拐点、合并进来的线路跟随目标分组的拐点(目标没有拐点就一条都不带),加点 / 拖点只作用于同一分组,分组结果写回 `channels[].groups` 并参与 `getParallelGroups` 的组号;再细到单条回线的 `moveChannelLine` 把某一条回线单独拆成新分组或并进别的分组(两回线拆成两个分组各一条,demo 的右键框里每条回线都有一个「拆成新分组 / 并入第 n 组」的下拉 + 分配按钮,组数 / 回线数到上限时拒绝并给出原因);鹰眼图补上了规则(`pointRules` / `lineRules` 的颜色、半径 / 线宽、形状与层级,不配自己的规则时沿用主图规则的颜色与层级,主图的像素尺寸不会搬过来),配合 `levels` 只看某几层、`layered` 控制分层叠画、`pointZoomScale` / `lineZoomScale` 让节点与线路跟着小图倍数放大,底图按层级分箱、按「层级 + 颜色 + 线宽 + 透明度」分桶,绘制次数不随规则数量膨胀;定向更新补上 `updatePoint` / `updateLine` / `updateChannel`:只重解析受影响的那一小片(节点带着绑在它身上的线与锚定通道、线路只重排自己、通道按成员表比对后决定补槽位还是整份重解析),其余要素与缓存一个字节都不动,鹰眼图与标签覆盖层跟着重画。
261
+ - 这一轮(鹰眼图与缩放联动):小图开了「可缩放」之后,空白处拖动可以直接平移小图内容、或拉出矩形框选让主图显示过去(`dragAction` 与 Ctrl / ⌘ 各管一个动作,平移过内容就不再被自动拽回视口框),每一格放大 / 缩小的倍率由 `zoomStep` 单独配(`zoomInStep` / `zoomOutStep` 还能分别覆盖),`channelCircuits: false` 时每个分组按可见成员逐顶点平均出一根居中代表线(多回线挤在小图上只会糊成一片);缩放联动的两组系数分工写明:`pointSizeScale` / `lineWidthScale` 是与地图无关的常数倍数,`pointZoomScale` / `lineZoomScale` 是跟随地图缩放的指数(0 不跟随、1 同倍率),节点尺寸一变,按节点尺寸取宽的通道回线位置跟着走;只有一条回线的通道不再计算回线偏移(回线就是骨架),缩放时的宽度重算与实例重传整块跳过,真实数据里这类通道占大多数。
262
+ - 这一轮(通道分组、鹰眼图规则与定向更新):一条通道不再只能是「一整组」——`splitChannelGroups` 把它拆成多个分组、`mergeChannelGroups` 再并回来,每组回线数自己定、最少一条,拆分出来的新分组不带走拐点、合并进来的线路跟随目标分组的拐点(目标没有拐点就一条都不带),加点 / 拖点只作用于同一分组,分组结果写回 `channels[].groups` 并参与 `getParallelGroups` 的组号;再细到单条回线的 `moveChannelLine` 把某一条回线单独拆成新分组或并进别的分组(两回线拆成两个分组各一条,demo 的右键框里每条回线都有一个「拆成新分组 / 并入第 n 组」的下拉 + 分配按钮,组数 / 回线数到上限时拒绝并给出原因);鹰眼图补上了规则(`pointRules` / `lineRules` 的颜色、半径 / 线宽、形状与层级,不配自己的规则时沿用主图规则的颜色 / 层级,并取主图最终解析出的尺寸与图标,避免小图节点和主图对不上),配合 `levels` 只看某几层、`layered` 控制分层叠画、`pointZoomScale` / `lineZoomScale` 让节点与线路跟着小图倍数放大,底图按层级分箱、按「层级 + 颜色 + 线宽 + 透明度」分桶,绘制次数不随规则数量膨胀;定向更新补上 `updatePoint` / `updateLine` / `updateChannel`:只重解析受影响的那一小片(节点带着绑在它身上的线与锚定通道、线路只重排自己、通道按成员表比对后决定补槽位还是整份重解析),其余要素与缓存一个字节都不动,鹰眼图与标签覆盖层跟着重画。
263
263
  - 发散渲染与导出:2 万点以上默认从视图中心向外分帧铺开(`progressiveInit`,铺完前 `isLayoutReady()` 返回 `false`,标签与拾取只看已经画出去的那部分),首屏一帧内先出中心附近的一片;`exportImage({ scale, background, download })` 把画布内容与标签合成一张图导出(返回 data URL,`download: true` 直接下载)。
264
264
  - 这一轮(指针事件、连续新增与移除新增):鼠标的每个动作都有自己的回调 —— 悬停 `onHover`、左键单击 `onClick`、双击 `onDblClick`,外加通用的 `onPointerDown` / `onPointerUp`(左 / 中 / 右键按下与抬起)与 `onContextMenu`(每一次右键),后三者发同一种 `GisViewPointerPayload`:命中的要素(`type` / `index` / `item`,通道回线还带 `channelId` / `groupId` / `channelIndex`)、按钮(`button` / `buttons`)与光标位置(`world` / `x` / `y` / `clientX` / `clientY`),空白处 `hit` 为 false,要自己弹菜单就在回调里 `preventDefault()`;新增通道补上「每点一次都回调」的 `onChannelDraftClick`(`step` 为 1 是拿到起点、2 是拿到终点,载荷与 `onChannelDraft` 一致)与连续新增:`beginAddChannel({ continuous: true })` 落地之后草稿原地重开(发 `phase: 'restart'`),接着点下一对节点就能一直加,`continuous: 'chain'` 再以上一段的终点当下一段起点,`continueAddChannel()` 手动开下一段、`cancelAddChannel()` 退出草稿;新增错了用 `removeLine(lineId)` 把刚落地的那条回线摘掉(通道声明一起改,通道空了整条删掉),整条通道走 `removeChannel(channelId)`,两者都会把选中下标跟着往前挪。
265
265
  - 性能实测与 WebGPU 的结论见 [GisView 实现原理](docs/GisView实现原理.md) 第 18 章:10 万点 / 10 万线的连续平移,标签全开最初只有 0.8 FPS、关掉标签 10.3 FPS;加上标签候选上限(`label.scanLimit`)回到 36.5 / 48.9 FPS,再把标签图层做成「交互期整体变换 + 停手后重排」,平移 / 缩放 / 拖点分别到 57.9 / 57.9 / 55.0 FPS(与关掉标签同档),整屏框选约 9.9 万个节点从 97 ms 降到 52 ms;整组拖动的增量补丁与圆头欠账见效之后,10 万选中连续拖动每帧 1391 ms → 339 ms;引擎每帧渲染函数耗时一直只有 0.05 ~ 0.2 ms。瓶颈在 DOM 覆盖层与 JS 侧,换 WebGPU 省不到这笔开销,本轮不迁移;这一轮把它收成了 `renderer` 开关(`auto` / `webgl2` / `webgpu`)与 `getRendererInfo()` 读数,真要迁移的路线写在文档里。
@@ -267,7 +267,7 @@ view.zoomTo(12).zoomToBounds({ minX: 116, minY: 39, maxX: 117, maxY: 40 }, 60)
267
267
  - 预览能力:鹰眼图是唯一内置的界面(配 `minimap` 才有,见 `docs/GisView.md` 的「鹰眼图」;底图先铺线、再把节点整层盖上去,节点层级高于线路;小图自己也能套规则:`pointRules` / `lineRules` 给每个节点 / 每条线定颜色、大小与层级,`levels` 只画某几层、`layered` 分层叠画、`pointZoomScale` / `lineZoomScale` 跟着小图倍数放大,没配自己的规则就用主图的颜色与层级),要更自由的实现仍然交给使用方——`getBounds()` 给全量范围、`getViewRect()` 给当前视口矩形,在小画布上按比例画出来并回写 `setCamera()`,需要缩放与框选放大时用 `project` / `unproject` 在两端换算即可。
268
268
  - 这一轮(demo 整理、标签显隐规则、全屏与规则更新):demo 页面重新排成「左边画布、右边配置」两列,说明段落默认收起、配置按组折进可折叠面板,画布右上角的「全屏」按钮走 `requestFullscreen()`(进出都等布局稳定后 `view.resize()`,按 Esc 退出也认);节点标签默认只给电压最高的那一档打(阈值取当前数据里最高的 `vn_kv`,new.json / test.json 都是 1050kV),面板上的「显示范围」还能切 ≥525kV 与全部;线路标签默认整个不显示,勾上「显示」之后再按同一套范围展开,打开 demo 不再满屏标签。新增「规则更新」面板:`pointRules` / `lineRules` 可以在文本框里直接改 JSON(或选面板配置 / 单色 / 高电压突出三份预设),点「更新规则并重渲染」把新规则表交给 `updateOptions`,读数里给出规则条数与整份重排耗时 —— 自定义规则生效期间面板上的样式开关不再抢着下发规则。
269
269
  - 这一轮(demo 分页与底图、初始视图、插件与三处性能优化):`initialView` 决定首次加载的相机落位(`{ mode, center, scale, zoom, bounds, padding }`,不配仍是适应数据范围),实例方法 `applyInitialView()` 在换数据 / 改配置之后重新套用同一份落位,见 `docs/GisView.md` 的「初始视图」;`plugins: [view => hook]` 是插件挂载点 —— 初始化按数组顺序执行,返回的 `destroy` 在视图销毁时倒序回调,单个插件抛错只走 `onError`,demo 里的 F 键聚焦就是一份完整示例;性能上 `drawGrid` 复用顶点缓冲(范围 / 步长 / 颜色不变就跳过重建)、`onStats` 按新增的 `statsInterval`(默认 250 ms)节流、悬停拾取合并到一帧一次。`docs/steps` 新增第 11 步 `step-11-background.js` 演示背景层 + 初始视图,步骤页工具条上多了「切换底图 / 切换初始视图」两个按钮。
270
- - 这一轮(背景图与鹰眼图背景):背景层的图片来源扩到「URL / dataURL / `<img>` / `<canvas>` / `<svg>` 元素 / 只给 SVG 路径的 `d` 字符串」(路径会先量外框再包成 SVG,可用 `pathStyle` 上色),摆放除了 `bounds` + `fit`(`contain` / `cover` / `stretch` / `center`,`size` 给原尺寸)之外还能给 `corners` 四个角的世界坐标,按任意四边形做仿射 + 裁剪贴图;GeoJSON 补上 ECharts 风格的 `aspectScale`(默认 0.75,只压经度方向,相机与 `fitView` 仍用缩放前的 `rawBounds` 真实经纬度)、`nameProperty`、`label` 区域文字(开关 / 模板 / 字号 / 字重 / 颜色 / 偏移 / 透明度,位置取区域重心)与 `regions` / `itemStyle(params)` 逐区域配色,填充与描边的颜色、宽度都能逐区域覆盖,`getResolvedBackground()` / `getBackgroundLabels()` 把解析结果暴露出来给自建缩略图或图例用。鹰眼图背景默认继承主视图(`minimap.background: 'inherit'`:底色 / 图片 / GeoJSON 与区域文字一起缩着画,文字字号按比例缩放后夹在 5 ~ 12px),也可以给 `minimap.background` 单独配一份、用 `minimap.backgroundStyle` 单独定容器底色,或在主视图换背景时自动跟着重画;demo 的「背景来源」下拉把现生成 GeoJSON / 全省 GeoJSON(真实经纬度,`public/全省.geojson`)/ dataURL 图片 / 运行时 canvas / SVG 路径五种来源摆在一起对比,`docs/steps/step-11-background.js` 与三个自测页同步补了断言。
270
+ - 这一轮(背景图与鹰眼图背景):背景层的图片来源扩到「URL / dataURL / `<img>` / `<canvas>` / `<svg>` 元素 / 只给 SVG 路径的 `d` 字符串」(路径会先量外框再包成 SVG,可用 `pathStyle` 上色),摆放除了 `bounds` + `fit`(`contain` / `cover` / `stretch` / `center`,`size` 给原尺寸)之外还能给 `corners` 四个角的世界坐标,按任意四边形做仿射 + 裁剪贴图;GeoJSON 补上 ECharts 风格的 `aspectScale`(默认 0.75,只压经度方向,相机与 `fitView` 仍用缩放前的 `rawBounds` 真实经纬度)、`nameProperty`、`label` 区域文字(开关 / 模板 / 字号 / 字重 / 颜色 / 偏移 / 透明度,位置取区域重心)与 `regions` / `itemStyle(params)` 逐区域配色,填充与描边的颜色、宽度都能逐区域覆盖,`getResolvedBackground()` / `getBackgroundLabels()` 把解析结果暴露出来给自建缩略图或图例用。鹰眼图背景默认继承主视图(`minimap.background: 'inherit'`:底色 / 图片 / GeoJSON 与区域文字一起缩着画,文字字号按比例缩放后夹在 5 ~ 12px),也可以给 `minimap.background` 单独配一份、用 `minimap.backgroundStyle` 显式接管画布底色,或在主视图换背景时自动跟着重画;demo 的「背景来源」下拉把现生成 GeoJSON / 全省 GeoJSON(真实经纬度,`public/全省.geojson`)/ dataURL 图片 / 运行时 canvas / SVG 路径五种来源摆在一起对比,`docs/steps/step-11-background.js` 与三个自测页同步补了断言。
271
271
  - 发布前请在 `package.json` 中更新包名、版本号和仓库信息。如果包名已被占用,可以使用 npm 作用域,例如 `@your-scope/gis-view`。
272
272
  - 这一轮(坐标转换与鹰眼图范围):新增 `projection.js` 的坐标层 —— `createGeoProjection` 给出「经纬度 ↔ 画出来的世界坐标」(含 `aspectScale`:只压经度、绕整体 bbox 中心,`rawBounds` 给相机、`bounds` 给绘制),`createGeoMapper` 把数据搬到 GeoJSON 上(`mode: 'lngLat'` 完全贴合 / `'fit'` 等比铺进底图 / `'scale'` 按比例,`scale` / `scaleX` / `scaleY` 就是「节点与 geojson 的大小比例」,`mapPoint` / `mapLine` / `mapChannel` / `mapData` 都是复制一份再换坐标);实例方法补上 `getGeoProjection` / `lngLatToWorld` / `worldToLngLat` / `lngLatToScreen` / `screenToLngLat` / `getPointer` / `createGeoMapper` / `mapDataToGeoJson`,`onPointer` 与各类拾取载荷在配了 GeoJSON 底图时给出 `lngLat`。鹰眼图新增 `minimap.extent`(默认 `auto` = 可见数据范围 ∪ 底图范围,GeoJSON 取画出来的 `bounds`、图片取四角 quad):数据与底图不在一个坐标系时小图不再把底图缩成一个点,`data` 是旧行为、`background` 只看底图。demo 的「数据映射」下拉 + 「节点 / geojson 比例」滑块 + 「坐标换算」输入框把这几项摆在一起,`docs/steps/selftest-*.html` 同步补了断言。
273
273
  - 这一轮(事件里的选中态、选中集读数与要素、导出数据分四份):`onClick` / `onContextMenu` / `onPointerDown` / `onPointerUp` 的载荷里直接带 `selected`(这一刻在不在选中集里)、`wasSelected`(`onClick` 给「点之前」的那一份,右键与按下 / 松开是「当下」)与 `selection` 读数 `{ ids, count, points, lines, channels }`(通道回线按通道算一个),左键分支与右键自建面板不必再比对 `getSelections()`;`getSelectionData()` 一份读数全给(`ids` / `count` / `pointCount` / `lineCount` / `channelCount`,要素本身 `points` / `lines` / `channels`(数据里的对象引用,通道是选中回线所属通道去重),加上 `items` / `pointIndexes` / `lineIndexes` 与 `bounds`),`onSelectChange` 与指针载荷共用同一份口径;导出数据按概念分四份 —— `exportStationData` / `exportPointData`(`new.json` 的 `station_data` 与 `test.json` 的 `point_data`)、`exportLineData`(`test.json` 的 `line_data`,通道回线带 `channel_id` / `channel_name` / `parallel_group_id` 与第几回)、`exportChannelData`(`new.json` 的 `channel_data`,回线折在 `line_data` 列里、路由在 `coords` 列里)、`exportParallelGroups`(`test.json` 的 `parallel_groups`,与通道数据分开取),另有 `exportData({ format: 'view' | 'new' | 'test' })` 一次按口径给整份,见 `docs/GisView.md` 的「导出数据」。