gis-view-webgl2 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +17 -14
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.d.ts +252 -37
  4. package/dist/index.js +1 -1
  5. package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +79 -0
  6. package/docs/GisView.md +53 -53
  7. package/docs/ai/06-/344/274/232/350/257/235/347/264/242/345/274/225/344/270/216/345/244/215/346/237/245/346/226/271/346/263/225.md +66 -0
  8. package/docs/api/index.html +22 -8
  9. package/docs/demos/ApiCoverageDemo.vue +1 -1
  10. package/docs/demos/ConnectDemo.vue +114 -3
  11. package/docs/demos/ExtensionDemo.vue +69 -12
  12. package/docs/demos/MinimapDemo.vue +62 -16
  13. package/docs/demos/SearchFilterDemo.vue +13 -11
  14. package/docs/demos/api-index.js +26 -21
  15. package/docs/demos/demos.js +1 -1
  16. package/docs/demos/gis-view-demo/GisViewDemoCardHeader.vue +1 -0
  17. package/docs/demos/gis-view-demo/GisViewDemoStage.vue +25 -16
  18. package/docs/demos/gis-view-demo/panels/OpsPanels.vue +2 -2
  19. package/docs/demos/gis-view-demo/useGisViewDemo.js +36 -25
  20. package/docs/index.html +41 -4
  21. package/docs/internals/13-/351/271/260/347/234/274/345/233/276.md +6 -5
  22. package/docs/internals/16-01-/344/274/230/345/214/226/344/270/216/345/217/226/350/210/215-/344/270/212.md +5 -3
  23. package/docs/internals/18-/346/200/247/350/203/275/345/256/236/346/265/213/344/270/216WebGPU/350/257/204/344/274/260.md +12 -0
  24. package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +29 -6
  25. package/docs/manual/04-/344/272/213/344/273/266/344/270/216/345/233/236/350/260/203.md +7 -6
  26. package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +24 -3
  27. package/docs/manual/09-/351/200/232/351/201/223/344/270/216/345/244/232/345/233/236/347/272/277.md +1 -1
  28. package/docs/manual/10-/351/200/232/351/201/223/347/274/226/350/276/221/344/270/216/346/226/260/345/242/236.md +423 -3
  29. package/docs/manual/14-/350/247/206/345/233/276/344/270/216/347/255/233/351/200/211.md +169 -62
  30. package/docs/manual/15-/345/257/274/345/207/272/344/270/216/351/233/206/346/210/220.md +32 -3
  31. package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +12 -8
  32. package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +13 -9
  33. package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +156 -12
  34. package/docs/manual/19-/350/257/273/346/225/260/344/270/216/346/213/226/346/213/275/351/242/204/350/247/210.md +3 -3
  35. package/docs/manual/21-/350/257/264/346/230/216/344/270/216/345/270/270/350/247/201/351/227/256/351/242/230.md +11 -5
  36. package/docs/steps/README.md +8 -8
  37. package/docs/steps/selftest-demos.html +173 -12
  38. package/docs/steps/selftest-docs.html +33 -4
  39. package/docs/steps/selftest-features.html +91 -10
  40. package/docs/steps/selftest-full.html +315 -12
  41. package/docs/steps/selftest-perf.html +39 -1
  42. package/docs/steps/selftest-scale.html +98 -0
  43. package/docs/steps/selftest-select.html +90 -0
  44. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -489,9 +489,21 @@ export interface GisViewMinimapOptions {
489
489
  /** 尺寸(CSS 像素),默认 168 × 120 */
490
490
  width?: number
491
491
  height?: number
492
+ /** 贴近主视图(或 container 指定的外部宿主)的哪个角,默认 bottom-right */
492
493
  position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'
493
494
  /** 距离容器边缘的间距(CSS 像素),默认 12 */
494
495
  margin?: number
496
+ /**
497
+ * 相对 position 那个角的位移(CSS 像素,[x, y]):x 正数向右、y 正数向下。
498
+ * 四角配置都按同一直觉换算,updateOptions 改它就能动态移动整张鹰眼图。
499
+ */
500
+ offset?: [number, number]
501
+ /**
502
+ * 外部宿主:HTMLElement 或 CSS 选择器。给了就把小图根节点挂到它里面,position / margin / offset
503
+ * 都相对这个元素;外部宿主需要 position: relative(或 absolute / fixed)才能让绝对定位按它算。
504
+ * 不写 / 选择器找不到时回落到主视图根节点;运行时换容器会移动同一个根节点,不重建画布。
505
+ */
506
+ container?: HTMLElement | string | null
495
507
  /**
496
508
  * 小图背景:'inherit'(默认)画主视图那一份(底色 / 图片 / GeoJSON,含区域配色与文字);
497
509
  * false / 'none' 不画;字符串是容器底色(旧写法);对象是与 background 同结构的独立配置
@@ -504,6 +516,12 @@ export interface GisViewMinimapOptions {
504
516
  * 两者离得很远就是这样),只画正在看的那一份 —— 合并只会让两份都看不清
505
517
  */
506
518
  extent?: GisViewMinimapExtent
519
+ /**
520
+ * `extent: 'auto'` 时是否允许范围跟着相机收窄:默认 false,始终按「数据 ∪ 底图」铺。
521
+ * 打开后,相机落在其中一份范围、而那份在合并结果里不足 6 像素时只画正在看的那一份;
522
+ * 数据 / 底图内容消失、相机进出这份范围时鹰眼图会重新计算包围盒。
523
+ */
524
+ extentFollowCamera?: boolean
507
525
  /** 给小图容器再加一个类名(与内置的 gis-view__minimap 并列),方便用样式表改外观 */
508
526
  className?: string
509
527
  /** 直接落到小图容器上的内联样式(中划线 / CSS 变量键与驼峰键都认);换配置时上一轮写过、这一轮没写的键会被清掉 */
@@ -515,7 +533,10 @@ export interface GisViewMinimapOptions {
515
533
  draw?: (info: GisViewMinimapDrawInfo) => void
516
534
  /** 可拆分的自定义绘制层:按 placement 分段、段内按 order,最后才轮到旧的 draw */
517
535
  layers?: GisViewMinimapLayer[]
518
- /** 小图容器的底色(CSS),默认 rgba(255, 255, 255, 0.92) */
536
+ /**
537
+ * 小图容器的底色(CSS),默认 rgba(255, 255, 255, 0.92)。显式设置时它接管画布底色:
538
+ * 继承的底图仍画图片 / GeoJSON,但不再用主图的不透明底色盖住它。
539
+ */
519
540
  backgroundStyle?: string
520
541
  /** 小图画布备份像素比上限(默认 4):高分屏或宿主缩放很大时可降到 1 ~ 2 降低填充开销 */
521
542
  maxPixelRatio?: number
@@ -529,12 +550,18 @@ export interface GisViewMinimapOptions {
529
550
  lineStyle?: GisViewMinimapLineStyle
530
551
  /**
531
552
  * 节点规则:按属性给小图上的节点定颜色 / 半径 / 形状 / 层级(条件语言与主图一样)。
532
- * 不配时沿用主图的 pointRules,但只取颜色与层级:主图的尺寸是主画布上的像素,搬到小图上会糊成一片
553
+ * 不配时沿用主图样式链:颜色 / 描边色 / 层级取规则,尺寸与符号取引擎最终解析结果
554
+ * (点自身 > 主图 pointRules > 主图 pointStyle),圆、方、图片与 SVG 图标都会画出来
533
555
  */
534
556
  pointRules?: GisViewMinimapPointRule[]
535
- /** 线路规则:按属性给小图上的线路定颜色 / 线宽 / 透明度 / 层级,不配时沿用主图 lineRules(只取颜色与透明度) */
557
+ /** 线路规则:按属性给小图上的线路定颜色 / 线宽 / 透明度 / 层级,不配时沿用主图 lineRules(颜色 / 透明度)与样式链线宽 */
536
558
  lineRules?: GisViewMinimapLineRule[]
537
- /** 没有自己的规则时是否沿用主图的 pointRules / lineRules,默认 true;显式 false 表示小图只用 pointStyle / lineStyle */
559
+ /**
560
+ * 没有自己的规则时是否沿用主图样式,默认 true:节点连尺寸与图标一起沿用,线路沿用颜色 / 透明度 / 线宽;
561
+ * 沿用尺寸时按小图与主图 CSS 视口宽高的较小比例缩放,独立于主图相机倍数与小图自身倍数;
562
+ * 小图自身多次放大时再按 pointZoomScale / lineZoomScale 联动;
563
+ * 显式 false 表示小图只用 pointStyle / lineStyle
564
+ */
538
565
  inheritRules?: boolean
539
566
  /**
540
567
  * 小图自己的热力图:不写就沿用主图的 options.heatmap(两边的色带与取的值完全一致,自动值域也按同一份数据算),
@@ -551,24 +578,24 @@ export interface GisViewMinimapOptions {
551
578
  * 主视图筛选出来的隐藏结果本来就带联动,这里管的是小图自己挡掉的那部分
552
579
  */
553
580
  cascade?: GisViewFilterCascade
554
- /** 节点半径的整体倍数(与主视图的 pointSizeScale 同名同义,常数倍数),默认 1 */
581
+ /** 节点半径的整体倍数(与主视图的 pointSizeScale 同名同义,常数倍数):自有规则与沿用主图的节点都乘这一份,默认 1 */
555
582
  pointSizeScale?: number
556
- /** 线路宽度的整体倍数(与主视图的 lineWidthScale 同名同义),默认 1 */
583
+ /** 线路宽度的整体倍数(与主视图的 lineWidthScale 同名同义):自有规则与沿用主图的线路都乘这一份,默认 1 */
557
584
  lineWidthScale?: number
558
585
  /**
559
586
  * 小图自身的倍数对节点半径的放大指数(0 表示不跟随,1 表示同倍率放大),默认 0。
560
587
  * 只在小图真的放大过才看得出来:zoomable 关着、或者倍数还在 1(刚好铺满)时是恒等系数;
561
- * 想让小图跟着**主视图**的缩放一起变,配的是 pointMapZoomScale
588
+ * 沿用主图规则的节点也按这一份联动;主图相机倍数不会改变它们的大小
562
589
  */
563
590
  pointZoomScale?: number
564
- /** 小图自身的倍数对线路宽度的放大指数(0 表示不跟随),默认 0;同样只在小图倍数 ≠ 1 时起作用,跟随主视图要用 lineMapZoomScale */
591
+ /** 小图自身的倍数对线路宽度的放大指数(0 表示不跟随),默认 0;同样只在小图倍数 ≠ 1 时起作用,沿用主图线宽也按它联动 */
565
592
  lineZoomScale?: number
566
593
  /**
567
- * 主视图的地图倍数对节点半径的放大指数:0(默认)不跟随,1 与主视图同倍率放大,
568
- * 0.5 是主视图放大 4 倍、小图节点放大 2 倍。与主视图的 pointZoomScale 是同一套说法
594
+ * 主视图的地图倍数对**小图自有规则 / 样式**节点半径的放大指数:0(默认)不跟随,1 与主视图同倍率放大,
595
+ * 0.5 是主视图放大 4 倍、小图节点放大 2 倍。沿用主图规则的节点不吃这一份(尺寸只跟视口比例与小图自身倍数)
569
596
  */
570
597
  pointMapZoomScale?: number
571
- /** 主视图的地图倍数对线路宽度的放大指数(0 表示不跟随、1 同倍率),与主视图的 lineZoomScale 同一套说法 */
598
+ /** 主视图的地图倍数对**小图自有规则 / 样式**线路宽度的放大指数(0 不跟随、1 同倍率);沿用主图线宽不吃这一份 */
572
599
  lineMapZoomScale?: number
573
600
  /** 地图倍数联动的基准比例,缺省取主视图首次适应视图时的比例(与主视图 zoomBaseScale 同源) */
574
601
  mapZoomBaseScale?: number
@@ -582,9 +609,9 @@ export interface GisViewMinimapOptions {
582
609
  onInteraction?: (info: GisViewMinimapInteractionInfo) => void
583
610
  /** 长按多久算「要移动视角」(毫秒),默认 180 */
584
611
  longPressDelay?: number
585
- /** 在小图上滚轮是否缩放主图(以光标处的世界坐标为锚点),默认 true;zoomable 打开时改由 Ctrl / ⌘ + 滚轮触发 */
612
+ /** 在小图上滚轮是否缩放主图(以光标处的世界坐标为锚点),默认 true;zoomable: true 时改由 Ctrl / ⌘ + 滚轮触发 */
586
613
  wheelZoom?: boolean
587
- /** 鹰眼图自身的倍数:1(默认)是「刚好铺满小图」,滚轮与 setMinimapZoom 改的都是它 */
614
+ /** 鹰眼图自身的倍数:1(默认)是「刚好铺满小图」;手动缩放时由滚轮 / setMinimapZoom 改,跟随主图时它是基准倍数 */
588
615
  zoom?: number
589
616
  /** 倍数下限与上限,默认 0.5 / 8 */
590
617
  minZoom?: number
@@ -595,16 +622,26 @@ export interface GisViewMinimapOptions {
595
622
  zoomInStep?: number
596
623
  /** 只覆盖「缩小」一侧的步进倍率,缺省用 zoomStep */
597
624
  zoomOutStep?: number
598
- /** 是否允许缩放鹰眼图自身(滚轮,锚点落在光标处),默认 false;打开后滚轮不再缩放主图(改为 Ctrl / ⌘ + 滚轮) */
599
- zoomable?: boolean
600
625
  /**
601
- * 开了 zoomable 之后,小图空白处(视口框之外)拖动的动作:
626
+ * 缩放模式,默认 false(关闭):
627
+ * - true:手动缩放鹰眼图自身,滚轮以光标为锚点,滚轮不再缩放主图(改为 Ctrl / ⌘ + 滚轮);
628
+ * - 'follow':整体显示范围跟随主图倍数变化,滚轮仍然缩放主图;与 true 互斥。
629
+ */
630
+ zoomable?: boolean | 'follow'
631
+ /**
632
+ * `zoomable: 'follow'` 时主图相对基准倍数的指数:1(默认)同倍率,0.5 表示主图放大 4 倍、鹰眼图放大 2 倍,
633
+ * 0 表示鹰眼图倍数不随主图变化。最终倍数仍夹在 minZoom ~ maxZoom 之间。
634
+ */
635
+ followZoomScale?: number
636
+ /**
637
+ * 小图空白处(视口框之外)拖动的动作:
602
638
  * pan(默认)平移小图内容,box 直接拉出框选矩形(松手后主图显示框住的区域)。
603
- * 按住 Ctrl / ⌘ 拖动始终是另一个动作,两个动作不用切换配置就能用。
639
+ * box 不依赖 zoomable;只有手动缩放(zoomable: true)时,按住 Ctrl / ⌘ 才会切换成另一个动作。
604
640
  */
605
641
  dragAction?: 'pan' | 'box'
606
642
  /**
607
- * 通道是否画出全部回线,默认 true;关掉(false)时一个通道只画偏移最靠中间的那一根。
643
+ * 通道是否画出全部回线,默认 true;关掉(false)时一个通道分组只画一根代表线:
644
+ * 按当前可见成员逐顶点取平均,双回线落在两根正中间(而不是固定挑上面 / 左边那一根)。
608
645
  * 通道多、底图挤的时候关掉更清爽,通道位置与走向仍然看得出来。
609
646
  */
610
647
  channelCircuits?: boolean
@@ -2216,6 +2253,50 @@ export interface GisViewChannelAddSpec {
2216
2253
  group?: GisViewChannelAddGroup | GisViewChannelAddGroup[]
2217
2254
  }
2218
2255
 
2256
+ /**
2257
+ * commitAddChannel 的对象入参:可以写一份新通道 / 新线路,也可以放在 channel / line / lines 里逐段给。
2258
+ * - 直接通道对象必须带 lineIds:每个 id 生成一条新回线,groups 是分组声明;通道 id 不参与回线 id。
2259
+ * - 直接线路对象的业务字段透传到 lineProps;path 是中间拐点,首尾仍取 from / to。
2260
+ * - 容器里的 line 缺省是独立线路,lines / lineData / lineItems 才是成员回线表,且 lines 优先;
2261
+ * 空数组不覆盖草稿。channel.lineIds 只在没有成员回线表时当 id 种子。
2262
+ * - 对象里的端点、id、名称、路径、样式与分组优先于草稿;没写的字段仍沿用当前草稿。
2263
+ * - 容器顶层的 channel.lineProps 目前不参与合并;公共字段写顶层 lineProps,单条写 lines[i]。
2264
+ */
2265
+ export interface GisViewChannelAddCommitInput extends Partial<GisViewChannelAddInput> {
2266
+ /** 本次新增的通道对象(lineIds 会作为新回线 id 种子;groups 作为分组声明) */
2267
+ channel?: GisViewChannel
2268
+ /** 本次新增的一条线路对象(写了它就按独立线路提交) */
2269
+ line?: GisViewLine
2270
+ /** 本次新增的回线对象 / 数据(一条或一批,与 lineData / lineItems 同义) */
2271
+ lines?: GisViewChannelLineData
2272
+ /** lines 的别名(与 addChannel 的第二段同一个写法) */
2273
+ lineData?: GisViewChannelLineData
2274
+ /** 新通道的分组声明(与 channel.groups 同义) */
2275
+ channelGroups?: GisViewChannelAddGroup | GisViewChannelAddGroup[]
2276
+ /** channelGroups 的别名(与 addChannel 的第三段同一个写法) */
2277
+ group?: GisViewChannelAddGroup | GisViewChannelAddGroup[]
2278
+ }
2279
+
2280
+ /** 新增通道草稿端点示例点单端的样式:只写哪几项就覆盖哪几项 */
2281
+ export interface GisViewChannelDraftDotStyle {
2282
+ /** 这一端是否画示例点,默认 true */
2283
+ show?: boolean
2284
+ /** 示例点半径(CSS 像素),缺省用 dot */
2285
+ size?: number
2286
+ /** 示例点颜色,缺省用 dots.color / dotColor / color */
2287
+ color?: string
2288
+ /** 形状,缺省 circle */
2289
+ shape?: 'circle' | 'square'
2290
+ }
2291
+
2292
+ /** 草稿两端示例点的共同样式;from / to 可以分别覆盖 */
2293
+ export interface GisViewChannelDraftDots extends GisViewChannelDraftDotStyle {
2294
+ /** 起点的单独设置(优先于这一层的共同设置) */
2295
+ from?: GisViewChannelDraftDotStyle
2296
+ /** 终点的单独设置(优先于这一层的共同设置) */
2297
+ to?: GisViewChannelDraftDotStyle
2298
+ }
2299
+
2219
2300
  /** 新增通道草稿线的样式:跟随光标的那条预览线 */
2220
2301
  export interface GisViewChannelDraftStyle {
2221
2302
  color?: string
@@ -2225,6 +2306,16 @@ export interface GisViewChannelDraftStyle {
2225
2306
  dot?: number
2226
2307
  /** 端点圆点颜色,缺省沿用 color */
2227
2308
  dotColor?: string
2309
+ /**
2310
+ * 两端示例点:false 两个都不画,true / 不写按 dot 与 dotColor 画;对象可统一设置 size / color / shape / show,
2311
+ * 并用 from / to 分别覆盖。示例点始终画在真正点中的节点中心(不受多回线偏移影响)。
2312
+ */
2313
+ dots?: boolean | GisViewChannelDraftDots
2314
+ /**
2315
+ * 示例线路的绘制层级:'above'(默认,画在真实节点之后)或 'below-points'(线 / 箭头 / customDraw 先画,
2316
+ * 再盖真实节点);端点示例点始终在节点之后画,确保看得见。
2317
+ */
2318
+ layer?: 'above' | 'below-points'
2228
2319
  /** 预览线末端是否画方向箭头,缺省 false */
2229
2320
  arrow?: boolean
2230
2321
  /** 箭头大小(CSS 像素),缺省 12 */
@@ -2886,7 +2977,7 @@ export interface GisViewClickPayload extends GisViewPickResult {
2886
2977
  selection: GisViewSelectionInfo
2887
2978
  /**
2888
2979
  * 这一次点击的判读:type 为 'select'(点中要素、选中已生效)或 'click'(没开选中时的普通点击),
2889
- * double 为 true 说明这一下是双击里的第二下。点空白处的载荷是 null,
2980
+ * 多选取反生效时是 'toggleSelect';double 为 true 说明这一下是双击里的第二下。点空白处的载荷是 null,
2890
2981
  * 「点了空白」这件事看 onPointerDown / onPointerUp 的 action.target('empty')与 selectChange。
2891
2982
  */
2892
2983
  action: GisViewPointerAction
@@ -3681,6 +3772,8 @@ export type GisViewDataChangeType =
3681
3772
  | 'addLines'
3682
3773
  | 'removePoints'
3683
3774
  | 'removeLines'
3775
+ /** 删除型筛选(filter.mode: 'remove')把不命中的要素从数据里删掉 */
3776
+ | 'filterRemove'
3684
3777
  | 'removeSelected'
3685
3778
  | 'removeLine'
3686
3779
  | 'removeChannel'
@@ -3704,6 +3797,8 @@ export interface GisViewDataChangePayload {
3704
3797
  /** 动到 / 删掉的节点下标(单点更新是那一个,删除是删除前的下标升序,新增是它们在数组里的位置) */
3705
3798
  index?: number
3706
3799
  indexes?: number[]
3800
+ /** 这一次删掉的节点下标(删除前它们在 points 里的位置,升序;removeSelected / filterRemove 会带上) */
3801
+ pointIndexes?: number[]
3707
3802
  /** 这一次调用成没成(addPoints / addLines / removePoints 这类批量接口会带上) */
3708
3803
  ok?: boolean
3709
3804
  /** 新增这类动作:这批要素是从哪个下标开始接上去的(就是追加前原数组的长度) */
@@ -3753,8 +3848,14 @@ export interface GisViewDataChangePayload {
3753
3848
  lineIndex?: number
3754
3849
  channelId?: string | number | null
3755
3850
  channelIndex?: number
3851
+ /** filterRemove:这次从数据里删掉的节点数据,顺序与 pointIndexes 对应 */
3852
+ removedPoints?: GisViewPoint[]
3853
+ /** filterRemove:这次从数据里删掉的线路数据,顺序与 removedLineIndexes 对应 */
3854
+ removedLineItems?: GisViewLine[]
3756
3855
  removedLineIds?: Array<string | number>
3757
3856
  removedLineIndexes?: number[]
3857
+ /** filterRemove:固定为 'remove',便于按载荷分流 */
3858
+ mode?: GisViewFilterMode
3758
3859
  /** 通道分组:这条通道最新的分组声明 */
3759
3860
  groups?: GisViewChannelGroup[]
3760
3861
  replaced?: boolean
@@ -4886,19 +4987,29 @@ export interface GisViewTooltipOptions {
4886
4987
  */
4887
4988
  export type GisViewFilterCascade = false | 'binding' | 'coordinate' | 'both'
4888
4989
 
4889
- /** 筛选条件:点、线各一个条件,缺省表示该维度不过滤 */
4990
+ /** 筛选模式:hide 只隐藏(缺省);remove 把不命中的要素从数据里删掉(不可恢复,除非撤销) */
4991
+ export type GisViewFilterMode = 'hide' | 'remove'
4992
+
4993
+ /**
4994
+ * 筛选条件:点、线各一个条件,缺省表示该维度不过滤。
4995
+ * 缺省 mode: 'hide' 只算「隐藏集合」,不改数据;已经选中的要素被隐藏后仍留在选中集里,
4996
+ * 条件放宽 / 清空后会原样恢复高亮。mode: 'remove' 把筛选结果(hiddenPoints / hiddenLines)
4997
+ * 真正从数据里删掉(走 dataChange('filterRemove'),可用撤销恢复;不会额外按节点联级删线路)。
4998
+ */
4890
4999
  export interface GisViewFilter {
4891
5000
  points?: GisViewConditionInput<GisViewPoint>
4892
5001
  lines?: GisViewConditionInput<GisViewLine>
4893
5002
  /** 联动隐藏,默认 binding */
4894
5003
  cascade?: GisViewFilterCascade
5004
+ /** 不命中的要素怎么处理:'hide' 只隐藏(默认),'remove' 从数据里删除 */
5005
+ mode?: GisViewFilterMode
4895
5006
  /** 是否用 Worker 计算,缺省跟随 options.filterWorker */
4896
5007
  worker?: boolean
4897
5008
  }
4898
5009
 
4899
5010
  /**
4900
5011
  * 筛选条件的简写:只筛节点时可以直接给节点条件,等价于 `{ points: 条件 }`:
4901
- * `view.setFilter({ vn_kv: { gte: 525 } })`。顶层出现 points / lines / cascade / worker
5012
+ * `view.setFilter({ vn_kv: { gte: 525 } })`。顶层出现 points / lines / cascade / mode / worker
4902
5013
  * 任一键时按完整格式解释,因此简写里可以放心使用业务字段名。
4903
5014
  */
4904
5015
  export type GisViewFilterShorthand = GisViewConditionInput<GisViewPoint>
@@ -4906,7 +5017,7 @@ export type GisViewFilterShorthand = GisViewConditionInput<GisViewPoint>
4906
5017
  /** setFilter / options.filter 接受的条件:完整格式,或只筛节点的简写 */
4907
5018
  export type GisViewFilterInput = GisViewFilter | GisViewFilterShorthand
4908
5019
 
4909
- /** 筛选结果:hiddenPoints / hiddenLines 是当前被隐藏的要素下标 */
5020
+ /** 筛选结果:hiddenPoints / hiddenLines 是当前被隐藏的要素下标;remove 模式删除完会回到空数组 */
4910
5021
  export interface GisViewFilterResult {
4911
5022
  filter: GisViewFilter | null
4912
5023
  hiddenPoints: number[]
@@ -5218,6 +5329,24 @@ export interface GisViewPluginContext {
5218
5329
 
5219
5330
  export type GisViewPlugin = (view: GisViewInstance, context: GisViewPluginContext) => void | { destroy?: () => void }
5220
5331
 
5332
+ /** 实例命令的上下文:注册表属于这个视图,handler 里拿它就能继续调实例方法 */
5333
+ export interface GisViewCommandContext {
5334
+ readonly view: GisViewInstance
5335
+ /** 这次执行注册时用的命令名(已去掉首尾空白) */
5336
+ readonly name: string
5337
+ }
5338
+
5339
+ /** 实例命令:同步执行;返回值原样放进 GisViewCommandResult.value */
5340
+ export type GisViewCommandHandler<Payload = unknown, Value = unknown> = (payload: Payload, context: GisViewCommandContext) => Value
5341
+
5342
+ /** executeCommand 的读数:拿到命令并执行成功时 ok: true;没注册 / 名字非法 / handler 抛错时 ok: false 并给原因 */
5343
+ export interface GisViewCommandResult<Value = unknown> {
5344
+ readonly ok: boolean
5345
+ readonly name: string
5346
+ readonly value?: Value
5347
+ readonly reason?: string
5348
+ }
5349
+
5221
5350
  /**
5222
5351
  * 快捷键写法(大小写不敏感,多个用 + 连接):
5223
5352
  * - 纯修饰键:`ctrl` / `meta` / `shift` / `alt` / `mod`(`ctrl` 同时认 macOS 的 ⌘),按住 + 操作;
@@ -6025,6 +6154,12 @@ export interface GisViewWebGLLayer {
6025
6154
  draw(context: GisViewWebGLLayerDrawContext): void
6026
6155
  }
6027
6156
 
6157
+ /**
6158
+ * 选中触发方式:'click'(缺省)在第一次单击时改选中集;'dblClick' 等到双击的第二下才改,
6159
+ * 第一下仍照常派发 onClick。两种方式下 onDblClick 都会在双击第二下派发。
6160
+ */
6161
+ export type GisViewSelectTrigger = 'click' | 'dblClick'
6162
+
6028
6163
  export interface GisViewOptions {
6029
6164
  /**
6030
6165
  * 功能开关:预设名('edit' / 'view' / 'static')、开关表或布尔值 ——
@@ -6288,6 +6423,12 @@ export interface GisViewOptions {
6288
6423
  * 关着时多选仍走框选(boxSelect)与按住多选快捷键(默认 Ctrl / ⌘)。
6289
6424
  */
6290
6425
  multiSelect?: boolean
6426
+ /**
6427
+ * 选中触发方式:缺省 'click'(单击选中);写 'dblClick' 后第一次点击只派发 onClick,
6428
+ * 第二次(双击判定命中)才更新选中集,并同时派发 onClick 与 onDblClick。
6429
+ * Ctrl / ⌘ 多选与 multiSelect 在双击模式下同样等到第二下才取反。运行时走 updateOptions({ selectTrigger })。
6430
+ */
6431
+ selectTrigger?: GisViewSelectTrigger
6291
6432
  /**
6292
6433
  * 框选 / Ctrl 多选允许收哪几类要素:'point' 节点、'line' 独立线路、'channel' 通道回线,
6293
6434
  * 可写数组任意组合,'all' / true 全开,false / null 全关。
@@ -6510,37 +6651,63 @@ export interface GisViewOptions {
6510
6651
  onError?: (message: string) => void
6511
6652
  }
6512
6653
 
6513
- /** 搜索范围:节点 / 线路 / 通道(通道会连成员回线一起搜) */
6514
- export type GisViewSearchScope = 'points' | 'lines' | 'channels'
6654
+ /** 搜索范围(规范化后的键):节点 / 线路 / 通道 / 通道分组(通道会连成员回线一起搜) */
6655
+ export type GisViewSearchScope = 'points' | 'lines' | 'channels' | 'groups'
6656
+
6657
+ /** scope 的入参写法:复数的规范化键,或与 focusOn 目标一致的 point / line / channel / group 单数别名 */
6658
+ export type GisViewSearchScopeInput = GisViewSearchScope | 'point' | 'line' | 'channel' | 'group'
6515
6659
 
6516
6660
  export interface GisViewSearchOptions {
6517
6661
  /** 关键字:空格分隔多个词时要在同一个字段里全部出现才命中,不区分大小写 */
6518
6662
  keyword?: string
6519
- /** 搜索范围,缺省三类都搜 */
6520
- scope?: GisViewSearchScope | GisViewSearchScope[]
6663
+ /**
6664
+ * 搜索范围,缺省四类都搜。复数的 points / lines / channels / groups 与单数别名
6665
+ * point / line / channel / group 都收;写错或空数组会回落到四类全搜。
6666
+ */
6667
+ scope?: GisViewSearchScopeInput | GisViewSearchScopeInput[]
6521
6668
  /** 限定参与匹配的字段路径(如 ['name', 'props.vn_kv']),缺省用要素的全部字段 */
6522
6669
  fields?: string[]
6523
6670
  /** 每类要素的命中上限,缺省 200,0 表示不限 */
6524
6671
  limit?: number
6525
6672
  }
6526
6673
 
6674
+ /**
6675
+ * 分组搜索命中里的 item:与 getChannelGroups() 的读数同源,但只保留搜索与定位需要的轻量字段
6676
+ * (不带骨架 / 回线几何)。groupIndex 是这一组在所属通道里的序号(从 0 起)。
6677
+ */
6678
+ export interface GisViewSearchGroupItem {
6679
+ channelId: string | number
6680
+ channelIndex: number
6681
+ id: string | number
6682
+ groupIndex: number
6683
+ lineIndexes: number[]
6684
+ lineIds: Array<string | number>
6685
+ lineCount: number
6686
+ anchored: boolean
6687
+ edited: boolean
6688
+ }
6689
+
6527
6690
  /** 一条搜索命中:field / value 是命中的那一项,bounds 用来居中或适应视图 */
6528
6691
  export interface GisViewSearchHit {
6529
- kind: 'point' | 'line' | 'channel'
6530
- /** 点 / 线在数据里的下标;通道是通道下标 */
6692
+ kind: 'point' | 'line' | 'channel' | 'group'
6693
+ /** 点 / 线在数据里的下标;通道是通道下标;分组是 groups 结果里的下标 */
6531
6694
  index: number
6532
6695
  id?: string | number
6533
- item: GisViewPoint | GisViewLine | GisViewChannel
6696
+ item: GisViewPoint | GisViewLine | GisViewChannel | GisViewSearchGroupItem
6534
6697
  field: string
6535
6698
  value: string
6536
6699
  bounds: GisViewBounds
6537
- /** 要素属于某条通道时给出通道下标(线路命中,或通道命中自身字段) */
6700
+ /** 要素属于某条通道时给出通道下标(线路 / 分组命中,或通道命中自身字段) */
6538
6701
  channelIndex?: number
6539
6702
  /** 通道内第几条回线(0 开始) */
6540
6703
  memberIndex?: number
6541
6704
  /** 通道命中来自回线时,该回线在 lines 里的下标与 id */
6542
6705
  memberLineIndex?: number
6543
6706
  memberLineId?: string | number
6707
+ /** 分组命中:分组 id(与 focusOn / selectFeatures 的 groupId 同一口径) */
6708
+ groupId?: string | number
6709
+ /** 分组命中:这一组在所属通道里的序号(从 0 起) */
6710
+ groupIndex?: number
6544
6711
  }
6545
6712
 
6546
6713
  export interface GisViewSearchResult {
@@ -6549,7 +6716,8 @@ export interface GisViewSearchResult {
6549
6716
  points: GisViewSearchHit[]
6550
6717
  lines: GisViewSearchHit[]
6551
6718
  channels: GisViewSearchHit[]
6552
- /** 三类命中的合集,顺序是节点、线路、通道 */
6719
+ groups: GisViewSearchHit[]
6720
+ /** 四类命中的合集,顺序是节点、线路、通道、分组 */
6553
6721
  hits: GisViewSearchHit[]
6554
6722
  total: number
6555
6723
  /** 命中数达到上限被截断 */
@@ -6575,13 +6743,15 @@ export type GisViewFocusTarget = GisViewSearchHit | GisViewFeatureKey | GisViewS
6575
6743
  export type GisViewFocusTargets = GisViewFocusTarget | GisViewFocusTarget[]
6576
6744
 
6577
6745
  export interface GisViewFocusOptions {
6578
- /** 直接设成这个比例(像素 / 世界单位);不给就按目标范围适应视图 */
6746
+ /** 直接设成这个比例(像素 / 世界单位);优先级高于 zoom */
6579
6747
  scale?: number
6580
- /** 只把中心挪到目标上、比例一点不动(聚焦一个点又不想改缩放时用) */
6748
+ /** 显式要求按目标范围适应视图;**缺省不缩放**,只把中心移到目标上 */
6749
+ zoom?: boolean
6750
+ /** 显式只居中、比例一点不动(与缺省行为一致,保留旧写法) */
6581
6751
  center?: boolean
6582
- /** 按范围适应视图时四周的留白(CSS 像素),缺省 40 */
6752
+ /** 按范围适应视图(zoom: true)时四周的留白(CSS 像素),缺省 40 */
6583
6753
  padding?: number
6584
- /** 适应视图时最多放大到多少比例:单个节点 / 一条直线没有面积,靠它决定要不要放大 */
6754
+ /** 适应视图(zoom: true)时最多放大到多少比例:单个节点 / 一条直线没有面积,靠它决定要不要放大 */
6585
6755
  maxZoom?: number
6586
6756
  /**
6587
6757
  * 顺手把这些被聚焦的要素变成选中状态:`true` 选中这次聚焦的这批(通常配合搜索命中),
@@ -7413,6 +7583,8 @@ export interface GisViewInstance {
7413
7583
  getZoomBaseScale(): number
7414
7584
  /** 重定缩放联动的基准比例:不传就取当下相机的比例(把现在这一屏当成「原样大小」),之后放大缩小都从它算倍数,返回 this */
7415
7585
  setZoomBaseScale(scale?: number): GisViewInstance
7586
+ /** 鹰眼图根节点(没配 minimap 时为 null):拖动整张图 / 绑定自定义手势时拿它 */
7587
+ getMinimapElement(): HTMLElement | null
7416
7588
  /** 鹰眼图自身的倍数:1 是「刚好铺满小图」 */
7417
7589
  getMinimapZoom(): number
7418
7590
  /** 设置鹰眼图的倍数(夹在 minimap.minZoom ~ maxZoom 之间),内容重新跟着数据范围居中 */
@@ -7777,8 +7949,35 @@ export interface GisViewInstance {
7777
7949
  cancelAddChannel(): GisViewInstance
7778
7950
  /** 结束新增草稿并收掉视图上的示例假通道 / 线路(静默,不补 cancel):提前结束不新建就用它 */
7779
7951
  endAddChannel(): GisViewInstance
7780
- /** 提交草稿:resolution 缺省用草稿里的推荐方案(autoCommit 时由内部自动提交) */
7781
- commitAddChannel(resolution?: GisViewChannelAddInput['resolution'], options?: { auto?: boolean }): GisViewChannelAddResult
7952
+ /**
7953
+ * 提交已 ready 的新增草稿(autoCommit 时由组件内部调用)。input 有五类写法:
7954
+ * 1. 不传 / null:用草稿的 preferred;
7955
+ * 2. 旧 resolution:字符串,或只含 type / groupId / groupIndex / channelId 的对象;
7956
+ * 3. 直接线路对象:无 lineIds,且有 from / to / path / kind: 'line' / start / end 之一;
7957
+ * 4. 直接通道对象:lineIds 为数组,缺省按 newChannel 落地;
7958
+ * 5. 容器:{ channel, line, lines, lineData, lineItems, channelGroups, group, channelProps, lineProps, resolution, ... }。
7959
+ *
7960
+ * 字段优先级:from / to = 顶层 → channel → line → lineItems 中第一个对象项 → 草稿;
7961
+ * path = 顶层 → line → channel → 草稿;分组 = channelGroups → group → channel.groups;
7962
+ * 容器 lineProps = 草稿 → 顶层 → line.lineProps → lines[i](不读 channel.lineProps);
7963
+ * channelProps = 草稿 → channel 上的业务字段 → 顶层 channelProps。直接通道对象自己的 lineProps 会生效。
7964
+ *
7965
+ * 直接通道默认新建;要并进已有通道 / 分组,用容器并显式写 resolution。
7966
+ * ready 里的方案对象带 enabled / count / lineIds 等读数,不能整条回传,只取
7967
+ * `{ type, groupId, groupIndex, channelId }` 子集。调用前草稿必须 ready,否则返回 ok: false 且不写数据。
7968
+ *
7969
+ * ```ts
7970
+ * view.commitAddChannel({
7971
+ * resolution: { type: 'joinGroup', groupId: 'corridor-1::2' },
7972
+ * lines: [{ id: 'join-1', color: '#dd4b2e' }, { id: 'join-2' }],
7973
+ * lineProps: { width: 2.4 }
7974
+ * })
7975
+ * ```
7976
+ */
7977
+ commitAddChannel(
7978
+ input?: GisViewChannelAddInput['resolution'] | GisViewChannel | GisViewLine | GisViewChannelAddCommitInput,
7979
+ options?: { auto?: boolean; continuous?: boolean; originalEvent?: Event | null }
7980
+ ): GisViewChannelAddResult
7782
7981
  /** 两个节点之间的新增方案:新通道 / 新分组 / 并进某一组 / 无法添加(kind 为 'line' 时方案表是空的) */
7783
7982
  getChannelAddOptions(from: string | number, to: string | number, count?: number, kind?: 'channel' | 'line'): GisViewChannelAddPlan | null
7784
7983
  /**
@@ -8083,6 +8282,16 @@ export interface GisViewInstance {
8083
8282
  * 调它就把这个插件返回的 `destroy` 清掉(重复调用只清一次;实例销毁之后再调也安全)
8084
8283
  */
8085
8284
  use(plugin: GisViewPlugin): () => void
8285
+ /**
8286
+ * 注册一个实例命令:`handler(payload, context)` 同步执行,`context.view` 就是这个视图。
8287
+ * 同名覆盖(后注册的生效);返回幂等的注销函数,同名被后注册覆盖后旧卸载函数不会误删新命令。
8288
+ * 名字空 / handler 不是函数只报一条 onWarning;实例销毁后注册不生效。
8289
+ */
8290
+ registerCommand<Payload = unknown, Value = unknown>(name: string, handler: GisViewCommandHandler<Payload, Value>): () => void
8291
+ /** 执行一个实例命令:成功给 `{ ok: true, name, value }`;没注册 / 名字非法 / handler 抛错给 `{ ok: false, name, reason }` */
8292
+ executeCommand<Value = unknown>(name: string, payload?: unknown): GisViewCommandResult<Value>
8293
+ /** 当前注册着哪些实例命令(按注册顺序;同名覆盖不改变原来的位置) */
8294
+ listCommands(): string[]
8086
8295
  /**
8087
8296
  * 注册一个自定义图元:名字写进数据的 `symbol` 字段(`symbol: '三角'`),画法交给一支画笔
8088
8297
  * (`painter(context, info)`,读数见 `GisViewSymbolPainterInfo`)。注册完(或换一支画笔之后)
@@ -8234,6 +8443,8 @@ export interface GisViewEngineOptions {
8234
8443
  zoom?: boolean
8235
8444
  hover?: boolean
8236
8445
  select?: boolean
8446
+ /** 选中触发方式:'click'(缺省)或 'dblClick',见 GisViewSelectTrigger */
8447
+ selectTrigger?: GisViewSelectTrigger
8237
8448
  contextMenu?: boolean
8238
8449
  /**
8239
8450
  * 右键默认把浏览器的系统菜单收掉(组件接住右键时 preventDefault contextmenu)。
@@ -8379,6 +8590,10 @@ export interface GisViewEngine {
8379
8590
  getChannels(): GisViewChannelInfo[]
8380
8591
  /** 单条通道运行时状态:只复制这一组;channelId 找不到时可按 channels 下标兜底 */
8381
8592
  getChannel(channelId?: string | number | null, channelIndex?: number): GisViewChannelInfo | null
8593
+ /** 单条通道的范围:按当前骨架与每条回线的折线计算,不复制几何;channelId 找不到时可按 channels 下标兜底 */
8594
+ getChannelBounds(channelId?: string | number | null, channelIndex?: number): GisViewBounds | null
8595
+ /** 一个分组的范围:按这一组当前骨架与回线折线计算,不复制几何;没有 channelId 时按通道下标兜底 */
8596
+ getChannelGroupBounds(channelId: string | number | null | undefined, groupId: string | number, channelIndex?: number): GisViewBounds | null
8382
8597
  /** 通道成员表:成员回线下标与各自的横向偏移,不复制几何(自建覆盖层按通道分流绘制用它) */
8383
8598
  getChannelMembers(): GisViewChannelMembers[]
8384
8599
  /** 通道分组现状:不传 channelId 返回所有分组 */