gis-view-webgl2 0.1.14 → 0.1.16

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 (55) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.d.ts +302 -76
  3. package/dist/index.js +1 -1
  4. package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +127 -5
  5. package/docs/GisView.md +2 -2
  6. 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 +123 -17
  7. package/docs/demos/ApiCoverageDemo.vue +1 -5
  8. package/docs/demos/BackendSyncDemo.vue +1 -2
  9. package/docs/demos/BackgroundDemo.vue +68 -1
  10. package/docs/demos/BatchAddDemo.vue +2 -1
  11. package/docs/demos/ChannelDemo.vue +212 -3
  12. package/docs/demos/ClusterDemo.vue +48 -1
  13. package/docs/demos/CopyMergeDemo.vue +225 -55
  14. package/docs/demos/api-index.js +43 -46
  15. package/docs/demos/gis-view-demo/useGisViewDemo.js +19 -14
  16. package/docs/format/02-/350/212/202/347/202/271/344/270/216/347/272/277/350/267/257.md +3 -3
  17. package/docs/format/03-/346/213/220/347/202/271/350/243/205/351/245/260/344/270/216/346/240/267/345/274/217.md +3 -0
  18. package/docs/from0/01-/345/205/210/346/212/212/345/234/260/345/233/276/346/203/263/346/270/205/346/245/232.md +8 -7
  19. package/docs/index.html +3 -3
  20. package/docs/internals/04-/347/233/270/346/234/272/345/235/220/346/240/207/344/270/216/345/203/217/347/264/240.md +6 -4
  21. package/docs/internals/14-/350/203/214/346/231/257/345/261/202.md +2 -2
  22. package/docs/internals/15-03-/351/200/220/350/275/256/350/256/260/345/275/225-/346/200/247/350/203/275/344/270/216/344/277/256/345/244/215-/344/270/213.md +14 -0
  23. package/docs/internals/15-04-/351/200/220/350/275/256/350/256/260/345/275/225-/347/203/255/345/212/233/345/233/276/344/270/216/346/200/247/350/203/275.md +14 -0
  24. package/docs/internals/16-03-/344/274/230/345/214/226/344/270/216/345/217/226/350/210/215-/344/270/213.md +8 -0
  25. package/docs/manual/02-/345/235/220/346/240/207/344/270/216/346/225/260/346/215/256.md +36 -16
  26. package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +53 -87
  27. package/docs/manual/04-/344/272/213/344/273/266/344/270/216/345/233/236/350/260/203.md +38 -21
  28. package/docs/manual/06-/346/225/260/346/215/256/344/270/216/345/234/272/346/231/257/346/233/264/346/226/260.md +2 -2
  29. 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 +58 -13
  30. package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +14 -14
  31. package/docs/manual/09-/351/200/232/351/201/223/344/270/216/345/244/232/345/233/236/347/272/277.md +12 -0
  32. 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 +113 -8
  33. package/docs/manual/12-/346/240/207/347/255/276/344/270/216/350/243/205/351/245/260.md +6 -0
  34. package/docs/manual/14-/350/247/206/345/233/276/344/270/216/347/255/233/351/200/211.md +3 -2
  35. package/docs/manual/15-/345/257/274/345/207/272/344/270/216/351/233/206/346/210/220.md +2 -0
  36. package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +37 -19
  37. package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +19 -13
  38. package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +98 -12
  39. package/docs/manual/20-/346/200/247/350/203/275/344/270/216/345/244/247/346/225/260/346/215/256.md +28 -4
  40. 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 +3 -3
  41. package/docs/playground/index.html +1 -1
  42. package/docs/sample-document/345/255/227/346/256/265/350/257/246/350/247/243.md +2 -2
  43. package/docs/steps/selftest-actions.html +4 -4
  44. package/docs/steps/selftest-data.html +5 -5
  45. package/docs/steps/selftest-demos.html +180 -14
  46. package/docs/steps/selftest-docs.html +4 -4
  47. package/docs/steps/selftest-effects.html +1 -1
  48. package/docs/steps/selftest-features.html +1053 -46
  49. package/docs/steps/selftest-perf.html +150 -53
  50. package/docs/steps/selftest-scale.html +6 -2
  51. package/docs/steps/selftest-select.html +20 -13
  52. package/docs/steps/step-10-full.js +1 -4
  53. package/docs/steps/step-12-events.js +1 -4
  54. package/docs//346/216/245/345/217/243/345/215/217/350/256/256.md +2 -0
  55. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -1303,6 +1303,8 @@ export interface GisViewPointDecoration {
1303
1303
  size?: number
1304
1304
  /** 填充 / 色调,缺省白色 */
1305
1305
  color?: string
1306
+ /** 所属节点被选中时是否改用其最终选中色:SVG path 写 strokeColor,其余符号写 color;缺省 false */
1307
+ followSelectColor?: boolean
1306
1308
  /** 描边色,缺省透明 */
1307
1309
  strokeColor?: string
1308
1310
  /** 描边宽度(CSS 像素),缺省 0 */
@@ -1352,9 +1354,9 @@ export interface GisViewPoint {
1352
1354
  labels?: GisViewItemLabel | GisViewItemLabel[]
1353
1355
  /** 这个点的悬浮提示内容:覆盖全局分类配置,false 表示这个点不显示提示 */
1354
1356
  tooltip?: GisViewTooltipContent | false
1355
- /** 是否可点击(悬停、选中与点击事件),缺省沿用 options.clickable */
1357
+ /** 是否可点击(悬停、选中与点击事件):逐点关掉;悬停 / 选中的总闸是 features.hover / features.select */
1356
1358
  clickable?: boolean
1357
- /** 是否可拖拽,缺省沿用 options.draggable */
1359
+ /** 是否可拖拽:总闸是 features.drag,节点写 false 可在总闸打开时逐个关掉 */
1358
1360
  draggable?: boolean
1359
1361
  /** 是否允许复制(按住复制快捷键点击 / 接口复制):false 时这个节点不出复制预览,缺省 true */
1360
1362
  copyable?: boolean
@@ -1437,7 +1439,7 @@ export interface GisViewLine {
1437
1439
  labels?: GisViewItemLabel | GisViewItemLabel[]
1438
1440
  /** 这条线的悬浮提示内容:覆盖全局分类配置,false 表示这条线不显示提示 */
1439
1441
  tooltip?: GisViewTooltipContent | false
1440
- /** 是否可点击(悬停、选中与点击事件),缺省沿用 options.clickable */
1442
+ /** 是否可点击(悬停、选中与点击事件):逐条关掉;悬停 / 选中的总闸是 features.hover / features.select */
1441
1443
  clickable?: boolean
1442
1444
  /** 悬停到这条线上时的光标:覆盖 options.cursorStyle.line / channel */
1443
1445
  cursor?: GisViewCursorValue
@@ -1449,7 +1451,7 @@ export interface GisViewLine {
1449
1451
  selectStyle?: GisViewLineStyle
1450
1452
  /** Ctrl 点击累加多选时的样式,按字段覆盖线自身样式,缺省沿用 selectStyle 与 options.lineMultiSelectStyle */
1451
1453
  multiSelectStyle?: GisViewLineStyle
1452
- /** 是否允许编辑拐点(Ctrl + 点击添加、拖动、删除),缺省沿用 options.waypointEditable */
1454
+ /** 是否允许编辑拐点(Ctrl + 点击添加、拖动、删除):逐条关掉;总闸是 features.waypoint */
1453
1455
  waypointEditable?: boolean
1454
1456
  /** 这条线的热力图:false 不参与(保持自身配色,也不会退回所属通道的值),true / 对象同上 */
1455
1457
  heatmap?: GisViewHeatmapOverride
@@ -1489,7 +1491,7 @@ export interface GisViewCascadeHighlightOptions {
1489
1491
  /** 普通单击是否触发 / 更新级联高亮,缺省 true;关闭后这次单击只走选中,并清掉旧级联 */
1490
1492
  triggerOnClick?: boolean
1491
1493
  /**
1492
- * Ctrl / ⌘ 多选或 options.multiSelect 的累加点击是否触发级联高亮,缺省 true。
1494
+ * Ctrl / ⌘ 多选或 features.multiSelect 的累加点击是否触发级联高亮,缺省 true。
1493
1495
  * 关闭后多选只改变选中集,不改级联状态(并把旧级联收掉)
1494
1496
  */
1495
1497
  triggerOnMultiSelect?: boolean
@@ -1555,6 +1557,12 @@ export interface GisViewLinePatch extends Partial<GisViewLine> {
1555
1557
  channelId?: string | number
1556
1558
  }
1557
1559
 
1560
+ /**
1561
+ * patchLines 里的一条:给定位(id / 下标 / `{ id }` / `{ index }`),其余字段与 updateLine 的补丁同一套
1562
+ * (线路字段 + groupId / groupIndex / channelId 三个分组指令)。分组指令不会写进 lines。
1563
+ */
1564
+ export type GisViewLineUpdateItemEntry = GisViewPointRef | (GisViewLinePatch & { id?: string | number; index?: number })
1565
+
1558
1566
  /**
1559
1567
  * updateChannel 第三段的一条:`{ id | index, ...字段 }` —— 用 id / index 定位这条通道的成员回线
1560
1568
  * (id 优先、数字回落下标,与 updateLine 的 id 参数同一套解析),其余字段与 `GisViewLinePatch` 完全同一套写法
@@ -1566,6 +1574,35 @@ export type GisViewChannelLinePatch = GisViewLinePatch & {
1566
1574
  index?: number
1567
1575
  }
1568
1576
 
1577
+ /**
1578
+ * updateChannel 第二段 / patchChannels 每条通道补丁:通道自己的字段之外,还可以写单组补丁 `group`
1579
+ * (按 id 找组、只合并写出来的字段;同时写 `groups` 时以整份声明为准)。
1580
+ * 这里的 `groups` / `lineIds` 是通道声明:不会新建 / 删除顶层 `lines` 里的真实线路。
1581
+ * 成员回线的逐条字段放在 updateChannel 第三段 / patchChannels 的 `linePatches`;
1582
+ * 新建回线用 addChannelGroupLines / addLine(s),挂入 / 摘出用 addChannelLines / removeChannelLines,
1583
+ * 删除线路用 removeLine(s),删除 / 合并分组用 removeChannelGroup / mergeChannelGroups。
1584
+ */
1585
+ export interface GisViewChannelPatch extends Partial<GisViewChannel> {
1586
+ /** 只改一组:认 id / groupId(也认 groupId 别名),找不到就新加一组;不写 id 就是第一组 */
1587
+ group?: Partial<GisViewChannelGroup> & { groupId?: string | number }
1588
+ }
1589
+
1590
+ /**
1591
+ * patchChannels 的一条:给定位(id / 下标 / `{ id }` / `{ index }`),带不带自己的补丁都认。
1592
+ * - 扁平写法:`{ id, name, groups, lineIds }`,`lineIds` 不带 `linePatches` 时是通道成员声明;
1593
+ * - updateChannel 形状:`{ id, patch, linePatches, lineIds }`,此时 `lineIds` 是第四段整表对齐;
1594
+ * - 扁平 + 成员:`{ id, name, linePatches, lineIds }`,顶层 `lineIds` 与 `linePatches` 配对时也按整表对齐解释。
1595
+ * 需要同时给声明 lineIds 与成员补丁时,把声明写进 `patch.lineIds`(或公共第二段)。
1596
+ */
1597
+ export type GisViewChannelUpdateItemEntry = GisViewPointRef | (GisViewChannelPatch & {
1598
+ id?: string | number
1599
+ index?: number
1600
+ /** updateChannel 第二段(逐条形式);与扁平字段同给时这里的字段优先 */
1601
+ patch?: GisViewChannelPatch
1602
+ /** updateChannel 第三段:这条通道的成员回线补丁 */
1603
+ linePatches?: GisViewChannelLinePatch | GisViewChannelLinePatch[]
1604
+ })
1605
+
1569
1606
  /** 通道偏移方式:tangent 走最外侧切点(按宽度均分),inset 从切点再向内收一段距离 */
1570
1607
  export type GisViewChannelOffsetMode = 'tangent' | 'inset'
1571
1608
 
@@ -1592,6 +1629,8 @@ export interface GisViewChannelGroup {
1592
1629
  /**
1593
1630
  * 通道:多条回线并行敷设的走廊,所有回线共用一条骨架折线(中心线)。
1594
1631
  * 回线几何由骨架按偏移量推导,拐点也挂在骨架上:编辑任一回线的拐点都会同步整条通道。
1632
+ * 通道声明只保存线路 id(`lineIds` / `groups[].lineIds`),真正的线路对象统一在顶层 `lines`;
1633
+ * 组件不会读取或写入 `channel.lineData` —— 新增接口第二段的同名 `lineData` 只是入参。
1595
1634
  */
1596
1635
  export interface GisViewChannel {
1597
1636
  /** 通道标识:同 id 的通道在数据刷新之间保留已编辑过的骨架 */
@@ -1906,14 +1945,17 @@ export interface GisViewChannelGroupAddResult {
1906
1945
  skipped?: Array<string | number>
1907
1946
  }
1908
1947
 
1909
- /** removeChannelGroup 的选项:把要删的那一组并进哪一组(缺省前一组,没有前一组就用后一组) */
1948
+ /** removeChannelGroup 的选项:缺省把要删的那一组并进相邻组;removeLines 为 true 时改为连组内回线一起删 */
1910
1949
  export interface GisViewChannelGroupRemoveOptions {
1950
+ /** 合并目标组:缺省前一组,没有前一组就用后一组;removeLines 为 true 时忽略 */
1911
1951
  targetGroupId?: string | number
1952
+ /** true 时删除这一组下的真实回线数据,不再把成员并到相邻组;通道还有其它组时继续保留 */
1953
+ removeLines?: boolean
1912
1954
  }
1913
1955
 
1914
1956
  /**
1915
1957
  * 删除一个分组的结果:ok 为 false 时 reason 说明原因(这条通道只有一组、找不到分组 / 目标组…)。
1916
- * targetGroupId 是并进的那一组(并完只剩一组时是通道自己的 id)
1958
+ * targetGroupId 是并进的那一组(并完只剩一组时是通道自己的 id);removeLines 模式为 null
1917
1959
  */
1918
1960
  export interface GisViewChannelGroupRemoveResult {
1919
1961
  ok: boolean
@@ -1925,6 +1967,12 @@ export interface GisViewChannelGroupRemoveResult {
1925
1967
  targetGroupId?: string | number | null
1926
1968
  /** 被并走的回线 id */
1927
1969
  lineIds?: Array<string | number>
1970
+ /** removeLines 模式真正从数据里删掉的回线 */
1971
+ lines?: GisViewLine[]
1972
+ /** 这次是否走了「连组内回线一起删」分支 */
1973
+ removedLines?: boolean
1974
+ /** 删完后这条通道一条成员都不剩,整条通道也一起删掉了 */
1975
+ removedChannel?: boolean
1928
1976
  /** 改完之后这条通道的分组现状(与 getChannelGroups 同一份) */
1929
1977
  groups?: GisViewChannelGroupInfo[]
1930
1978
  }
@@ -2472,16 +2520,42 @@ export interface GisViewRemoveLineResult {
2472
2520
  removedChannel?: boolean
2473
2521
  }
2474
2522
 
2475
- /** removeChannel 的结果:lineIds / lines 是跟着通道一起消失的回线 */
2523
+ /** removeChannel 的结果:lineIds / lines 是跟着通道一起消失的回线;keepLines 时改为 keptLineIds 保留下来 */
2476
2524
  export interface GisViewRemoveChannelResult {
2477
2525
  ok: boolean
2478
2526
  reason?: string
2479
2527
  channelId?: string | number
2480
2528
  lineIds?: Array<string | number>
2481
2529
  lines?: GisViewLine[]
2530
+ /** keepLines 模式保留下来的原成员回线 id(数据仍在,之后按独立线路绘制) */
2531
+ keptLineIds?: Array<string | number>
2482
2532
  removedChannel?: boolean
2483
2533
  }
2484
2534
 
2535
+ /** removeChannels 的逐条结果:在单条 removeChannel 的读数上补原通道下标与被删通道对象 */
2536
+ export interface GisViewRemoveChannelsItemResult extends GisViewRemoveChannelResult {
2537
+ index?: number
2538
+ item?: GisViewChannel
2539
+ }
2540
+
2541
+ /** removeChannels 的结果:results 与传入的有效通道一一对应,skipped 是认不出 / 重复的引用 */
2542
+ export interface GisViewRemoveChannelsResult {
2543
+ ok: boolean
2544
+ reason?: string
2545
+ count: number
2546
+ results: GisViewRemoveChannelsItemResult[]
2547
+ channelIds: Array<string | number>
2548
+ /** 删除前这些通道在 channels 数组里的下标 */
2549
+ channelIndexes: number[]
2550
+ lineIds: Array<string | number>
2551
+ lines: GisViewLine[]
2552
+ /** 本次一起消失的全部通道(含因成员回线被删而空掉的通道) */
2553
+ removedChannels: GisViewChannel[]
2554
+ /** keepLines 模式保留下来的原成员回线 id */
2555
+ keptLineIds?: Array<string | number>
2556
+ skipped: Array<{ ref?: unknown; reason: string }>
2557
+ }
2558
+
2485
2559
  /** removeLines 的结果:entries 是每条被移除的线路(含下标与原属通道),lines / lineIds / indexes 是同一批的顺手读数 */
2486
2560
  export interface GisViewRemoveLinesResult {
2487
2561
  ok: boolean
@@ -2570,7 +2644,11 @@ export interface GisViewLineAddSpec {
2570
2644
  lineData?: GisViewChannelLineData
2571
2645
  }
2572
2646
 
2573
- /** 第二段线路数据(lineData):对象里的 id 就是回线 id(没写的自动编号),裸字符串 / 数字等价于 { id } */
2647
+ /**
2648
+ * 第二段线路数据(lineData):对象里的 id 就是回线 id(没写的自动编号),裸字符串 / 数字等价于 { id }。
2649
+ * 只用于 addChannel / addLine / commitAddChannel 等新增入口;落地后线路进顶层 lines,通道只记 lineIds,
2650
+ * 不会在 channel 上再保存一份 lineData。
2651
+ */
2574
2652
  export type GisViewChannelLineData = Partial<GisViewLine> | string | number | Array<Partial<GisViewLine> | string | number | undefined>
2575
2653
 
2576
2654
  /** 新签名 addChannel 第三段的一项:新通道的分组信息(id / 成员 / 中间拐点;缺省整条通道一组) */
@@ -3011,10 +3089,13 @@ export interface GisViewResolvedGeoJson {
3011
3089
  labels: GisViewResolvedBackgroundLabel[]
3012
3090
  /** 实际落到画面上的旋转角(度,顺时针,已归一到 [-180, 180)) */
3013
3091
  rotation: number
3092
+ /** geoJsonStyle.bounds / rotation 实际使用的缩放、平移与旋转;没有改位置时为 null */
3093
+ drawTransform: GisViewGeoDrawTransform | null
3014
3094
  /** 缩放前的真实坐标范围(aspectScale 生效前):相机、fitView 与经纬度换算用它 */
3015
3095
  rawBounds: GisViewBounds | null
3016
3096
  /** 这份底图实际使用的 aspectScale(默认 0.75) */
3017
3097
  aspectScale: number
3098
+ /** 最终画出来的轴对齐范围(含 aspectScale、geoJsonStyle.bounds 与 rotation) */
3018
3099
  bounds: GisViewBounds | null
3019
3100
  fills: number[]
3020
3101
  fillBuckets: Array<{ color: [number, number, number, number]; first: number; count: number }>
@@ -3031,14 +3112,27 @@ export interface GisViewResolvedGeoJson {
3031
3112
  shadow: { color: [number, number, number, number]; offsets: Array<[number, number]> } | null
3032
3113
  }
3033
3114
 
3115
+ /** 解析后 GeoJSON 的最终摆放参数:先按 aspectScale 生成源范围,再缩放 / 平移 / 旋转到画面 */
3116
+ export interface GisViewGeoDrawTransform {
3117
+ scaleX: number
3118
+ scaleY: number
3119
+ offsetX: number
3120
+ offsetY: number
3121
+ /** 旋转中心(世界坐标) */
3122
+ center: [number, number]
3123
+ /** 顺时针角度(度) */
3124
+ rotation: number
3125
+ }
3126
+
3034
3127
  /** 经纬度 ↔ GeoJSON 画出来的世界坐标的换算(aspectScale 只压经度,围绕整体范围中心) */
3035
3128
  export interface GisViewGeoProjection {
3036
3129
  /** 缩放前的真实经纬度范围 */
3037
3130
  rawBounds: GisViewBounds
3038
- /** 画出来的世界范围(已应用 aspectScale) */
3131
+ /** 最终画出来的世界范围(含 aspectScale、geoJsonStyle.bounds 与 rotation) */
3039
3132
  bounds: GisViewBounds
3040
3133
  aspectScale: number
3041
3134
  center: [number, number]
3135
+ /** 合成后的 x / y 基准比例(旋转后不再等价于单一轴对齐仿射,优先用 project / unproject) */
3042
3136
  scaleX: number
3043
3137
  scaleY: number
3044
3138
  /** 经纬度 → 画出来的世界坐标(与底图完全对齐) */
@@ -3049,8 +3143,8 @@ export interface GisViewGeoProjection {
3049
3143
 
3050
3144
  /** 数据坐标 → GeoJSON 坐标的映射参数 */
3051
3145
  export interface GisViewGeoMapperOptions {
3052
- /** 'lngLat' 数据本身就是经纬度(完全贴合底图)/ 'fit' 等比铺进 geojson 范围 / 'scale'(默认)按比例与偏移 */
3053
- mode?: 'lngLat' | 'fit' | 'scale'
3146
+ /** 'lngLat' 数据本身就是经纬度 / 'fit' 任意坐标系等比铺进 geojson 范围 / 'scale'(默认)经纬度基准上叠加比例与偏移 */
3147
+ mode?: 'lngLat' | 'fit' | 'world' | 'scale'
3054
3148
  /** 在基准变换之上再叠一层比例:节点与 geojson 的大小比例属性,绕 center(缺省 geojson 中心) */
3055
3149
  scale?: number
3056
3150
  scaleX?: number
@@ -3059,9 +3153,21 @@ export interface GisViewGeoMapperOptions {
3059
3153
  offsetX?: number
3060
3154
  offsetY?: number
3061
3155
  center?: [number, number]
3062
- /** fit 模式的数据范围;不传就从 data 里算 */
3156
+ /** fit 模式的数据范围;不传就从节点、线路几何、通道 / 分组路径与固定坐标装饰算 */
3063
3157
  bounds?: GisViewBounds | null
3064
- data?: { points?: Array<{ x: number; y: number }>; lines?: Array<{ path?: Array<[number, number]> }> } | null
3158
+ data?: {
3159
+ points?: Array<{ x: number; y: number; decorations?: Array<{ at?: GisViewCoordinate }> }>
3160
+ lines?: Array<{
3161
+ path?: GisViewCoordinate[]
3162
+ start?: GisViewCoordinate
3163
+ end?: GisViewCoordinate
3164
+ decorations?: Array<{ at?: GisViewCoordinate; position?: GisViewLineDecorationPosition }>
3165
+ }>
3166
+ channels?: Array<{
3167
+ path?: GisViewCoordinate[]
3168
+ groups?: Array<{ path?: GisViewCoordinate[]; waypointOffsets?: Record<string, GisViewCoordinate> }>
3169
+ }>
3170
+ } | null
3065
3171
  /** fit 模式四周留白(占 geojson 短边比例,0 ~ 0.45) */
3066
3172
  padding?: number
3067
3173
  /** fit 模式铺进哪份范围:'drawn'(默认,画出来的范围)/ 'raw'(aspectScale 之前的真实范围) */
@@ -3070,9 +3176,13 @@ export interface GisViewGeoMapperOptions {
3070
3176
  aspectScale?: number
3071
3177
  }
3072
3178
 
3073
- /** 数据坐标 → GeoJSON 坐标的映射器:map / unmap 换单个点,mapPoint / mapLine / mapChannel 换一份数据 */
3179
+ /**
3180
+ * 数据坐标 → GeoJSON 坐标的映射器:map / unmap 换单个点,mapPoint / mapLine / mapChannel 换一份数据。
3181
+ * 坐标同时认 `[x, y]` 与 `{ x, y }`;mapLine / mapChannel 会换 path / start / end 与固定坐标装饰,
3182
+ * mapChannel 还会换分组 path,并把 waypointOffsets 当向量映射(不叠平移)。
3183
+ */
3074
3184
  export interface GisViewGeoMapper {
3075
- mode: 'lngLat' | 'fit' | 'scale'
3185
+ mode: 'lngLat' | 'fit' | 'world' | 'scale'
3076
3186
  projection: GisViewGeoProjection
3077
3187
  pivot: [number, number]
3078
3188
  scaleX: number
@@ -3185,6 +3295,24 @@ export interface GisViewPointClusterOptions {
3185
3295
  minPoints?: number
3186
3296
  /** 相机比例 / 基准比例超过它之后展开原始点;0(缺省)表示不设上限 */
3187
3297
  maxZoom?: number
3298
+ /** 聚合圆 / 图标的填充色,缺省 '#2970db';SVG 图标的 currentColor 也取它 */
3299
+ color?: string
3300
+ /** 聚合圆描边色,缺省 '#ffffff';形状图标用自己的 strokeColor 时以图标为准 */
3301
+ strokeColor?: string
3302
+ /** 聚合圆描边宽度(CSS 像素),缺省 2,夹在 0 ~ 20 */
3303
+ strokeWidth?: number
3304
+ /** 聚合圆 / 图标的整体不透明度,缺省 1,夹在 0 ~ 1 */
3305
+ opacity?: number
3306
+ /** 数量文字颜色,缺省 '#ffffff' */
3307
+ textColor?: string
3308
+ /** 数量文字字号(CSS 像素);0(缺省)按聚合圆半径自动取 12 / 13 */
3309
+ fontSize?: number
3310
+ /** 聚合圆图标:内置 circle / square、SVG / 图片地址或自定义图元,缺省 'circle' */
3311
+ symbol?: GisViewSymbolInput
3312
+ /** 是否显示聚合数量文字,缺省 true;图标本身已经带数量时可以关掉 */
3313
+ showCount?: boolean
3314
+ /** 聚合圆整体尺寸倍数(含命中半径),缺省 1,夹在 0.25 ~ 4 */
3315
+ sizeScale?: number
3188
3316
  }
3189
3317
 
3190
3318
  /** getPointCluster() 的读数:归一化之后的配置 + 当前缩放档是否仍在聚合。 */
@@ -3203,6 +3331,17 @@ export interface GisViewCluster {
3203
3331
  screen: [number, number]
3204
3332
  radius: number
3205
3333
  bounds: GisViewBounds
3334
+ /** 多成员聚合圆的样式读数;单成员组不带这些字段 */
3335
+ color?: string
3336
+ strokeColor?: string
3337
+ strokeWidth?: number
3338
+ opacity?: number
3339
+ textColor?: string
3340
+ /** 数量文字的实际字号(fontSize: 0 时是按半径算出来的 12 / 13) */
3341
+ fontSize?: number
3342
+ symbol?: GisViewSymbolInput
3343
+ showCount?: boolean
3344
+ sizeScale?: number
3206
3345
  }
3207
3346
 
3208
3347
  /** 多成员聚合圆的拾取结果:item 永远为 null,index 为 -1,不进入普通要素选中集。 */
@@ -3225,6 +3364,11 @@ export interface GisViewClusterLabel {
3225
3364
  count: number
3226
3365
  screen: [number, number]
3227
3366
  radius: number
3367
+ /** 已经解析过的数量文字字号 */
3368
+ fontSize: number
3369
+ textColor: string
3370
+ /** false 时覆盖层不生成数量 DOM,读屏与导出一致 */
3371
+ showCount: boolean
3228
3372
  }
3229
3373
 
3230
3374
  /**
@@ -3942,6 +4086,8 @@ export interface GisViewPointMergePayload {
3942
4086
  impact: GisViewMergeImpact | null
3943
4087
  /** 合并后保留谁:'target'(缺省,碰撞目标)或 'source'(当前拖动的来源节点);确认时传 confirm({ keep }) */
3944
4088
  keep: GisViewMergeKeep
4089
+ /** 这一次合并采用的通道分组策略;confirm({ channelGroups }) / resolvePointMerge(true, { channelGroups }) 可覆盖全局配置 */
4090
+ channelGroups: GisViewMergeChannelGroups
3945
4091
  /**
3946
4092
  * confirm 阶段的合并结果(按 keep 决定的保留端业务字段优先、merge.maxKeys 列出的字段取双方最高值、
3947
4093
  * 尺寸取双方最大、图标用保留端):
@@ -3986,6 +4132,8 @@ export interface GisViewMergeResult {
3986
4132
  mergedChannels: number
3987
4133
  /** 端点改到目标节点的通道条数 */
3988
4134
  channelsChanged: number
4135
+ /** 决定撞在一起的两条通道怎么分组的策略(与 merge.channelGroups / 本次 options.channelGroups 同一口径) */
4136
+ channelGroups: GisViewMergeChannelGroups
3989
4137
  /** 与 confirm 阶段同一口径的影响读数;合并后需要按 id 查明细时也能直接用 */
3990
4138
  impact: GisViewMergeImpact
3991
4139
  /** 直接提交后端的完整变更集(删除来源节点、更新 / 删除线路与通道) */
@@ -4010,6 +4158,8 @@ export interface GisViewMergeFailure {
4010
4158
  removedLines: number
4011
4159
  removedChannels: number
4012
4160
  mergedChannels: number
4161
+ /** 这次调用采用的分组策略;失败载荷也带上,便于界面统一读同一字段 */
4162
+ channelGroups: GisViewMergeChannelGroups
4013
4163
  originalEvent: Event | null
4014
4164
  }
4015
4165
 
@@ -4037,6 +4187,8 @@ export interface GisViewMergeSelectedPayload {
4037
4187
  removedChannels: number
4038
4188
  mergedChannels: number
4039
4189
  channelsChanged: number
4190
+ /** 整批合并采用的通道分组策略(逐对 merge 结果里也各带一份) */
4191
+ channelGroups: GisViewMergeChannelGroups
4040
4192
  originalEvent: Event | null
4041
4193
  }
4042
4194
 
@@ -4071,6 +4223,12 @@ export interface GisViewMergeSelectedOptions {
4071
4223
  item?: Partial<GisViewPoint> | ((context: GisViewMergeSelectedItemContext) => Partial<GisViewPoint> | void)
4072
4224
  /** true 时连 mergeable: false 的节点也并(默认跳过它们) */
4073
4225
  force?: boolean
4226
+ /**
4227
+ * 覆盖 merge.channelGroups:撞成同一条的通道里,被并来源的回线怎么进保留通道。
4228
+ * 'keep' 各自保留 / 'merge' 合成一组 / 'newGroup' 收成一个新组 / 'first' 并进第一组 /
4229
+ * { groupId } 并进指定组(找不到回落第一组)
4230
+ */
4231
+ channelGroups?: GisViewMergeChannelGroups
4074
4232
  /** 这一步历史的标签(默认「合并选中节点」) */
4075
4233
  label?: string
4076
4234
  originalEvent?: Event | null
@@ -4245,6 +4403,7 @@ export type GisViewDataChangeType =
4245
4403
  | 'updatePoint'
4246
4404
  | 'updateLine'
4247
4405
  | 'updateChannel'
4406
+ | 'updateChannels'
4248
4407
  | 'pointDrag'
4249
4408
  | 'copyPoint'
4250
4409
  | 'copyPoints'
@@ -4264,6 +4423,7 @@ export type GisViewDataChangeType =
4264
4423
  | 'removeSelected'
4265
4424
  | 'removeLine'
4266
4425
  | 'removeChannel'
4426
+ | 'removeChannels'
4267
4427
  | 'channelGroups'
4268
4428
  /** 撤销 / 重做回放了一条历史记录(这是接口 undo() / redo() 与 Ctrl+Z / Ctrl+Shift+Z 发的那一条) */
4269
4429
  | 'undo'
@@ -4297,7 +4457,9 @@ export interface GisViewDataChangePayload {
4297
4457
  /** 动作对应的要素:更新的那一个、复制 / 合并出来的那一个、删掉的那一条线路或通道 */
4298
4458
  item?: GisViewPoint | GisViewLine | GisViewChannel
4299
4459
  /** 删掉 / 加上的那些要素(节点或线路) */
4300
- items?: Array<GisViewPoint | GisViewLine>
4460
+ items?: Array<GisViewPoint | GisViewLine | GisViewChannel>
4461
+ /** 批量更新的逐条定位结果(updateChannels / patchChannels 会带上认不出的引用) */
4462
+ skipped?: unknown[]
4301
4463
  /** 这次动到几个要素 */
4302
4464
  count?: number
4303
4465
  /** 拖拽结束:本次跟着改坐标的节点与线路(与 onPointDrag 的 points / lines 同一份) */
@@ -4319,6 +4481,8 @@ export interface GisViewDataChangePayload {
4319
4481
  /** 合并落地:与 onPointMerge 的 impact / changes 同一份(批量里逐条 mergePoints 也各带一份) */
4320
4482
  impact?: GisViewMergeImpact
4321
4483
  mergeChanges?: GisViewMergeChangeSet
4484
+ /** 合并落地:本次采用的通道分组策略 */
4485
+ channelGroups?: GisViewMergeChannelGroups
4322
4486
  /** 拐点增删:第几段(pathIndex)、坐标与所属集合 */
4323
4487
  pathIndex?: number
4324
4488
  phase?: string
@@ -5274,6 +5438,8 @@ export interface GisViewLineDecoration {
5274
5438
  size?: number
5275
5439
  /** 填充 / 色调:填进符号的 color,'currentColor' 一类的写法取的就是它;默认白色 */
5276
5440
  color?: string
5441
+ /** 所属线路被选中时是否改用其最终选中色:SVG path 写 strokeColor,其余符号写 color;缺省 false */
5442
+ followSelectColor?: boolean
5277
5443
  /** 描边色:符号里的 stroke: 'currentStrokeColor' 取的是它(默认透明,也就是不描边) */
5278
5444
  strokeColor?: string
5279
5445
  /** 描边宽度(CSS 像素),默认 0 */
@@ -5324,6 +5490,8 @@ export interface GisViewDecorationDraftOptions {
5324
5490
  size?: number
5325
5491
  /** 填充 / 色调,缺省白色 */
5326
5492
  color?: string
5493
+ /** 提交后的装饰是否跟随所属要素选中色:SVG path 写 strokeColor,其余符号写 color;缺省 false */
5494
+ followSelectColor?: boolean
5327
5495
  /** 描边色,缺省透明 */
5328
5496
  strokeColor?: string
5329
5497
  /** 描边宽度(CSS 像素),缺省 0 */
@@ -5415,6 +5583,7 @@ export interface GisViewDecorationDraftPayload {
5415
5583
  strokeWidth: number
5416
5584
  opacity: number
5417
5585
  parallel: boolean
5586
+ followSelectColor: boolean
5418
5587
  scope: GisViewDecorationDraftScope
5419
5588
  maxDistance: number
5420
5589
  maxPerLine: number
@@ -6114,9 +6283,10 @@ export interface GisViewMergeOptions {
6114
6283
  /**
6115
6284
  * 两个节点合到一块儿之后,它们之间的通道撞成同一条时怎么处理:
6116
6285
  * 'keep'(缺省)各自保留自己的分组(声明照旧,只是端点改到目标节点);
6117
- * 'merge' 合成一个分组(回线取并集)
6286
+ * 'merge' 合成一个分组(回线取并集);'newGroup' 把被并通道的回线收成一个新组;
6287
+ * 'first' 并进保留通道第一组;{ groupId } 并进指定组(找不到回落第一组)
6118
6288
  */
6119
- channelGroups?: 'keep' | 'merge'
6289
+ channelGroups?: GisViewMergeChannelGroups
6120
6290
  /**
6121
6291
  * 合并后取双方最高值的字段:只认列出来的键,缺省空表(不取任何最高值,全部保留目标节点字段)。
6122
6292
  * 例如 `['vn_kv', 'value']`;也接受 `'vn_kv,value'` 写法。字段两边都是有限数字时取 Math.max,
@@ -6135,6 +6305,26 @@ export interface GisViewMergeOptions {
6135
6305
  /** 拖拽合并的触发时机:两个节点的屏幕半径相碰 / 拖动节点中心进入目标节点区域 */
6136
6306
  export type GisViewMergeTrigger = 'collision' | 'center'
6137
6307
 
6308
+ /**
6309
+ * 两条通道合并时的分组策略:
6310
+ * - 'keep'(缺省)各自保留原分组;
6311
+ * - 'merge' 合成一个分组;
6312
+ * - 'newGroup' 把被并通道的回线收成一个新分组,追加在保留通道后面;
6313
+ * - 'first' 把被并通道的回线并进保留通道第一组;
6314
+ * - { groupId } 并进保留通道指定 id 的那一组,找不到时回落第一组;{ groupId } 省略 id 等价于 'first'。
6315
+ */
6316
+ export type GisViewMergeChannelGroups =
6317
+ | 'keep'
6318
+ | 'merge'
6319
+ | 'newGroup'
6320
+ | 'first'
6321
+ | GisViewMergeChannelGroupTarget
6322
+
6323
+ /** 合并分组指定目标组:groupId 省略 / 为空时并入保留通道第一组 */
6324
+ export interface GisViewMergeChannelGroupTarget {
6325
+ groupId?: string | number
6326
+ }
6327
+
6138
6328
  /** 通道选中模式:点中通道里的一条回线时选中什么 */
6139
6329
  export type GisViewChannelSelectMode =
6140
6330
  /** 缺省:只选点中的这一条回线 */
@@ -6181,6 +6371,8 @@ export interface GisViewSelectInBoxOptions {
6181
6371
  /** resolvePointMerge / payload.confirm 的参数:保留哪一端,以及最终节点(可只给要改的字段) */
6182
6372
  export interface GisViewPointMergeConfirmOptions {
6183
6373
  keep?: GisViewMergeKeep
6374
+ /** 覆盖本次合并的通道分组策略;不传沿用 merge.channelGroups */
6375
+ channelGroups?: GisViewMergeChannelGroups
6184
6376
  item?: Partial<GisViewPoint> | null
6185
6377
  }
6186
6378
 
@@ -6431,6 +6623,10 @@ export type GisViewFeatureName =
6431
6623
  | 'hover'
6432
6624
  /** 点击选中(onClick 与 select / selectInBox 这些接口入口不受它限制) */
6433
6625
  | 'select'
6626
+ /** 不按修饰键的多选:普通点击累加 / 取反 */
6627
+ | 'multiSelect'
6628
+ /** 再次点击已选要素时取消选中 */
6629
+ | 'toggleSelect'
6434
6630
  /** 框选(默认 Shift + 拖动,随 shortcuts.boxSelect 改变) */
6435
6631
  | 'boxSelect'
6436
6632
  /** 拖动节点(含整组拖动) */
@@ -6460,13 +6656,21 @@ export type GisViewFeatureName =
6460
6656
 
6461
6657
  /**
6462
6658
  * 功能开关表:**缺省全关** —— 什么都不写时只剩画布与数据,所有交互都要手动打开。
6463
- * **没写的开关跟随各自的详细配置**(`interactive` / `clickable` / `draggable` / `boxSelect` / `copy.enabled`…),
6659
+ * 平移 / 缩放 / 悬停 / 选中 / 框选 / 多选 / 取反 / 拖拽 / 拐点只有这一个入口,没有顶层详细配置;
6660
+ * 没写 = 关。copy / merge / remove 与标签 / 提示 / 鹰眼图仍跟随各自的详细配置,
6464
6661
  * 详细配置也没写时同样是关(标签 / 提示 / 鹰眼图这类「配了才有」:配了就等于手动打开);
6465
6662
  * 写了 `true` 强制打开、写了 `false` 强制关闭(详细配置写 true 也没用)。
6466
6663
  * 开关只决定「组件做不做某个交互」,不改变数据与样式:关掉 drag 之后节点还在、还能选中,只是拖不动;
6467
6664
  * 关掉 label 之后标签图层不再产生 DOM,数据与样式一律不动。
6468
6665
  */
6469
- export type GisViewFeatures = Partial<Record<GisViewFeatureName, boolean>>
6666
+ /**
6667
+ * `features` 里允许使用的详细配置别名:`draggable` 映射到 `drag`,`waypointEditable` 映射到 `waypoint`,
6668
+ * `interactive` 一次映射到 `pan` / `zoom` / `contextMenu`,`clickable` 一次映射到 `hover` / `select`。
6669
+ * 同一个对象里同时写了别名与规范名时规范名优先;别名只用于输入,`getFeatures()` 不返回别名键。
6670
+ */
6671
+ export type GisViewFeatureAliasName = 'draggable' | 'waypointEditable' | 'interactive' | 'clickable'
6672
+
6673
+ export type GisViewFeatures = Partial<Record<GisViewFeatureName | GisViewFeatureAliasName, boolean>>
6470
6674
 
6471
6675
  /**
6472
6676
  * 开关的当前有效值:把「跟随详细配置」也解析成 true / false(getFeatures 与 onFeatureChange 给的就是这一份)。
@@ -6829,9 +7033,12 @@ export interface GisViewOptions {
6829
7033
  * 功能开关:预设名('edit' / 'view' / 'static')、开关表或布尔值 ——
6830
7034
  * **缺省全关**:什么都不写时只剩画布与数据,想要哪一项就手动打开哪一项。
6831
7035
  * 'edit' 全开、'view' 一次打开查看类(能平移缩放、能悬停选中看提示,改不动数据)、
6832
- * 'static' 与缺省一致(全关)。没写的开关一律跟随各自的详细配置(interactive / clickable / draggable /
6833
- * boxSelect / copy.enabled…),详细配置也没写就是关(标签 / 提示 / 鹰眼图「配了才有」,配了就等于打开):
6834
- * 想开哪一项就写哪一项 —— `features: { drag: true }`、`interactive: true`、`clickable: true`、`draggable: true` 或 `copy: {…}`。
7036
+ * 'static' 与缺省一致(全关)。交互权限**只有 features 一个入口**:拖拽 / 平移 / 缩放 / 悬停 /
7037
+ * 选中 / 框选 / 多选 / 取反 / 拐点都写在这里。旧的顶层 `draggable` / `interactive` / `clickable` /
7038
+ * `boxSelect` / `multiSelect` / `toggleSelect` / `waypointEditable` 已移除,传入会经 onWarning
7039
+ * 提示迁移并忽略;features 表内仍可用 `draggable` / `interactive` / `clickable` / `waypointEditable` 别名。
7040
+ * copy / merge / remove 与 label / tooltip / minimap 的详细配置仍负责参数与内容:
7041
+ * 写了 copy / merge / remove 等于打开对应能力,features 可再强制开关;标签 / 提示 / 鹰眼图「配了才有」。
6835
7042
  * 运行时用 setFeatures() 换一份,getFeatures() 读当前有效值(把「跟随详细配置」也解析成 true / false)。
6836
7043
  */
6837
7044
  features?: GisViewFeaturesInput
@@ -7090,44 +7297,16 @@ export interface GisViewOptions {
7090
7297
  * 关掉之后交互 / 动画期与静止帧的画法完全一致(代价是十万级下慢 3 ~ 4 倍)。
7091
7298
  */
7092
7299
  interactionNoMsaa?: boolean
7093
- /**
7094
- * 查看类交互的「详细配置手动打开」写法:写 true 打开拖拽平移 / 滚轮缩放 / 右键回调
7095
- * (等价 features 的 pan / zoom / contextMenu),不写就是关(缺省全关)。
7096
- */
7097
- interactive?: boolean
7098
- /** 查看类交互的「详细配置手动打开」写法:写 true 打开悬停高亮与点击选中(等价 hover / select);要素自身可用 clickable: false 逐个关掉 */
7099
- clickable?: boolean
7100
7300
  /**
7101
7301
  * 光标:按状态与悬停目标分别配置,写法支持 CSS 关键字与自定义图片(url / 热点),
7102
7302
  * 还能配按住 Ctrl / ⌘ 时的另一套。不配时用 gis-view.css 里的 --gis-view-cursor-* 变量
7103
7303
  */
7104
7304
  cursorStyle?: GisViewCursorStyle
7105
- /** 点是否可拖拽,单个点可用 draggable 覆盖;**缺省关**(全关口径),要拖就写 draggable: true 或 features: { drag: true } */
7106
- draggable?: boolean
7107
7305
  /**
7108
7306
  * 拖动节点时线路是否实时跟随:默认 true(拖动过程中线路端点一路跟着走)。
7109
7307
  * 关掉之后拖动期间只移动节点本身,线路保持原样,停手(pointerup)时一次性更新到新位置。
7110
7308
  */
7111
7309
  liveDrag?: boolean
7112
- /** 是否允许按住框选快捷键(见 shortcuts.boxSelect,默认 Shift)拖动鼠标框选节点;**缺省关**,要框选就写 boxSelect: true */
7113
- boxSelect?: boolean
7114
- /**
7115
- * 多选开关(**缺省关**):打开之后不用按修饰键,直接单击节点 / 线路就能取反累加选中
7116
- * (与按住 shortcuts.multiSelect 点击同一套行为,命中时套用 multiSelectStyle);
7117
- * 关着时多选仍走框选(boxSelect)与按住多选快捷键(默认 Ctrl / ⌘)。
7118
- */
7119
- multiSelect?: boolean
7120
- /**
7121
- * 再次选中即取消(**缺省关**):打开后,普通点击已在选中集里的要素会把它取消;
7122
- * Ctrl / ⌘ 先选中、再普通点击同一要素也同样取消。单击 / 双击两种 selectTrigger 都适用,
7123
- * 双击会按一次操作处理(第一下取反、第二下保持),不会因为双击的两下连点而反复切换。
7124
- * 命中通道回线时按 channelSelectMode 决定取消单条回线 / 当前分组 / 整条通道,其他选中项保留;
7125
- * 该组 / 通道只选中一部分、或点到组内另一条回线时,也按同一展开范围整体取消;
7126
- * 该组 / 通道已经完整选中时,即使 channelSelectMode 为 line 也整组 / 整条取消。
7127
- * 这条取消路径不受 selectionKinds 限制;取消生效时同一来源的点击级联也会一起收掉。
7128
- * 与 multiSelect 同时打开时沿用 multiSelect 的累加取反口径;运行时走 updateOptions({ toggleSelect })。
7129
- */
7130
- toggleSelect?: boolean
7131
7310
  /**
7132
7311
  * 选中触发方式:缺省 'click'(单击选中);写 'dblClick' 后第一次点击只派发 onClick,
7133
7312
  * 第二次(双击判定命中)才更新选中集,并同时派发 onClick 与 onDblClick。
@@ -7154,8 +7333,8 @@ export interface GisViewOptions {
7154
7333
  */
7155
7334
  selectionBoxPersistent?: boolean
7156
7335
  /**
7157
- * 选中的要素是否画在所有要素之上(默认 true):抬层的包括点击 / 拖动 / 待确认合并的节点,
7158
- * 以及选中线路所在的整条通道 —— 选中了就一定看得见,与 zIndex 无关;
7336
+ * 选中的要素是否画在所有要素之上(默认 true):抬层的包括点击 / 拖动 / 待确认合并的节点、
7337
+ * 选中线路所在的整条通道,以及它们的 decorations —— 选中了就一定看得见,与 zIndex 无关;
7159
7338
  * 关掉之后完全按 zIndex 与数据顺序绘制(十万级数据下抬层会让整份重排一次)
7160
7339
  */
7161
7340
  selectionOnTop?: boolean
@@ -7187,11 +7366,6 @@ export interface GisViewOptions {
7187
7366
  copy?: GisViewCopyOptions
7188
7367
  /** 合并节点(**缺省关**:写了这份配置才算开):把一个节点拖到另一个节点上(考虑碰撞)时怎么确认与怎么并 */
7189
7368
  merge?: GisViewMergeOptions
7190
- /**
7191
- * 是否允许编辑线路拐点:Ctrl + 点击添加、拖动移动、双击或 Delete 删除;**缺省关**,单条线可用 waypointEditable 覆盖。
7192
- * `false`(以及 `features: { waypoint: false }`)会同时关闭新增、移动与删除;没有只关其中一项的细分开关
7193
- */
7194
- waypointEditable?: boolean
7195
7369
  /** 拐点显示时机:selected 只在线路被选中(或刚加过拐点)时显示,always 始终显示;默认 selected */
7196
7370
  waypointVisibility?: 'selected' | 'always'
7197
7371
  /** 拐点样式,缺省为小圆点 */
@@ -8112,8 +8286,12 @@ export interface GisViewSceneCluster {
8112
8286
  fill: string
8113
8287
  stroke: string
8114
8288
  strokeWidth: number
8289
+ opacity: number
8115
8290
  textColor: string
8116
8291
  fontSize: number
8292
+ showCount: boolean
8293
+ /** 配了非缺省图标时的屏幕坐标符号原语;缺省圆仍按 fill / stroke 画 */
8294
+ icon?: GisViewSceneNode
8117
8295
  }
8118
8296
 
8119
8297
  export interface GisViewSceneSnapshot {
@@ -8133,7 +8311,10 @@ export interface GisViewSceneSnapshot {
8133
8311
  points: GisViewSceneNode[]
8134
8312
  clusters: GisViewSceneCluster[]
8135
8313
  backgroundPoints: GisViewSceneNode[]
8314
+ /** 普通装饰(未随所属要素抬层) */
8136
8315
  decorations: GisViewSceneNode[]
8316
+ /** 跟着选中线路 / 节点 / 选中线路端点抬层的装饰:画在 raisedLines 之后、raised 之前 */
8317
+ raisedDecorations: GisViewSceneNode[]
8137
8318
  waypoints: GisViewSceneNode[]
8138
8319
  /** 选中 / 拖动中的节点(画在最上面) */
8139
8320
  raised: GisViewSceneNode[]
@@ -8492,6 +8673,19 @@ export interface GisViewInstance {
8492
8673
  createGeoMapper(options?: GisViewGeoMapperOptions): GisViewGeoMapper | null
8493
8674
  /** 直接把一份点 / 线 / 通道数据映射到 GeoJSON 坐标上(复制,不改原数据);没有 GeoJSON 底图时是 null */
8494
8675
  mapDataToGeoJson<T extends { points?: GisViewPoint[]; lines?: GisViewLine[]; channels?: GisViewChannel[] }>(data: T, options?: GisViewGeoMapperOptions): T | null
8676
+ /**
8677
+ * 把当前网架的世界坐标 x / y 转成 GeoJSON 经纬度:不传 data 时转换当前 points / lines / channels。
8678
+ * 使用此刻最终画出来的底图投影(含 aspectScale、背景编辑后的 bounds 与 rotation);返回复制后的数据,原数据与视图都不变;
8679
+ * 没有 GeoJSON 底图时是 null。存档回灌用 mapLngLatToData(),不要跳过它直接把 x=经度 / y=纬度 的数据 updateData 回去。
8680
+ */
8681
+ mapDataToLngLat<T extends { points?: GisViewPoint[]; lines?: GisViewLine[]; channels?: GisViewChannel[] } = { points: GisViewPoint[]; lines: GisViewLine[]; channels: GisViewChannel[] }>(data?: T, options?: GisViewGeoMapperOptions): T | null
8682
+ /**
8683
+ * mapDataToLngLat() 的逆变换:把 x / y 存着经纬度的 points / lines / channels 按当前底图投影写回世界坐标。
8684
+ * 覆盖线路路径 / 端点、固定坐标装饰、通道分组路径与 waypointOffsets 向量;返回副本,不改传入数据。
8685
+ * 没有 GeoJSON 底图时为 null。典型用法:`updateData(view.mapLngLatToData(saved))`;
8686
+ * 底图 bounds / rotation 改过时,经纬度会按调用当时最终画出来的底图重新落位。
8687
+ */
8688
+ mapLngLatToData<T extends { points?: GisViewPoint[]; lines?: GisViewLine[]; channels?: GisViewChannel[] }>(data: T, options?: GisViewGeoMapperOptions): T | null
8495
8689
  pick(x: number, y: number): GisViewHitResult | null
8496
8690
  /**
8497
8691
  * 按浏览器客户端坐标拾取(鼠标事件里的 clientX / clientY):与指针事件载荷同一份读数,另加 target
@@ -8647,7 +8841,12 @@ export interface GisViewInstance {
8647
8841
  * 返回 `{ ok, item, linesChanged, removedLines, removedChannels, mergedChannels }`,
8648
8842
  * 并不了返回 ok: false 并另发一条 `phase: 'merge', ok: false` 的事件
8649
8843
  */
8650
- mergePoints(source: GisViewPointRef, target: GisViewPointRef, options?: { originalEvent?: Event | null; item?: GisViewPoint }): GisViewMergeOutcome
8844
+ mergePoints(source: GisViewPointRef, target: GisViewPointRef, options?: {
8845
+ originalEvent?: Event | null
8846
+ item?: GisViewPoint
8847
+ /** 覆盖 merge.channelGroups 的通道分组策略;不传沿用全局配置 */
8848
+ channelGroups?: GisViewMergeChannelGroups
8849
+ }): GisViewMergeOutcome
8651
8850
  /**
8652
8851
  * 把一个节点拆成多份(mergePoints 的逆操作):parts 省略 / null / [] 且节点带 mergeInfo 时自动解除合并,
8653
8852
  * 恢复全部来源节点与合并前的线路 / 通道;给 parts 时第一份复用原下标与 id,其余追加到 points 末尾。
@@ -8901,12 +9100,21 @@ export interface GisViewInstance {
8901
9100
  addPoint(item: GisViewPoint, options?: { emit?: boolean; select?: boolean }): GisViewAddPointResult
8902
9101
  addPoints(items: GisViewPoint | GisViewPoint[], options?: { emit?: boolean; select?: boolean }): GisViewAddItemsResult<GisViewPoint>
8903
9102
  addLines(items: GisViewLine | GisViewLine[], options?: { emit?: boolean; select?: boolean }): GisViewAddItemsResult<GisViewLine>
8904
- /** 移除一条线路(撤销刚落地的新增线路):挂在通道上的回线会从通道声明里一起摘掉,通道空了整条删掉 */
9103
+ /** 移除一条线路(撤销刚落地的新增线路):挂在通道上的回线会从通道声明里一起摘掉;剩余成员按顶层 lineIds 与 groups 的并集判断,空了才整条删掉 */
8905
9104
  removeLine(lineId: string | number): GisViewRemoveLineResult
8906
- /** 一次移除多条线路(传数组):通道声明与分组跟着收拾,删空的通道整条走 */
9105
+ /** 一次移除多条线路(传数组):通道声明与分组跟着收拾;groups: [] 不会遮掉仍有成员的顶层 lineIds,删空的通道才整条走 */
8907
9106
  removeLines(lineIds: string | number | Array<string | number>): GisViewRemoveLinesResult
8908
- /** 移除整条通道:它名下的回线一条条摘掉,通道声明与回线一起消失 */
8909
- removeChannel(channelId: string | number): GisViewRemoveChannelResult
9107
+ /**
9108
+ * 移除整条通道:缺省连同成员回线一起删;options.keepLines 为 true 时只删通道声明,
9109
+ * 回线留在数据里成为独立线路,返回 keptLineIds 是保留下来的原成员引用
9110
+ */
9111
+ removeChannel(channelId: string | number, options?: { keepLines?: boolean }): GisViewRemoveChannelResult
9112
+ /**
9113
+ * 一次移除多条通道(removeChannel 的批量版):成员回线合成一次 removeLines,整批只重排一次、
9114
+ * 只记一步历史、只发一条 `removeChannels` 数据变更。重复引用只处理一次,认不出的引用进 `skipped`;
9115
+ * options.keepLines 为 true 时只删通道声明、回线全部保留;options.emit 传 false 时只改数据不发通知
9116
+ */
9117
+ removeChannels(channelIds: string | number | Array<string | number>, options?: { emit?: boolean; label?: string; keepLines?: boolean }): GisViewRemoveChannelsResult
8910
9118
  /** 改某个节点的数据(坐标 / 样式 / 符号)并重渲染:绑在它身上的线路与以它为锚点的通道跟着重排 */
8911
9119
  updatePoint(id: string | number, patch: Partial<GisViewPoint>): GisViewInstance
8912
9120
  /**
@@ -8923,15 +9131,30 @@ export interface GisViewInstance {
8923
9131
  * (id / index 之外的字段就是这一条的补丁),或者 `patchPoints(['a', 'b'], { status: 1 })`
8924
9132
  * 把同一份补丁盖到一批节点上。认不出来的记进 skipped,不影响其余条目;
8925
9133
  * 返回 `{ ok, indexes, items, count, skipped }`,只记一条历史、只发一条 updatePoints 数据变更。
8926
- * 与 `updateData({ points })` 的分工:那一条是整份替换节点数据,这里只动点到的这几条
9134
+ * 与 `updateData({ points })` 的分工:那一条是整份替换节点数据,这里只动点到的这几条。
9135
+ * 与 updatePoint 的分工是「一批 vs 一条」;旧的 updatePoints(points) 已按去重收口删除
8927
9136
  */
8928
9137
  patchPoints(entries: GisViewUpdateItemEntry<GisViewPoint> | Array<GisViewUpdateItemEntry<GisViewPoint>>, patch?: Partial<GisViewPoint>): GisViewUpdateItemsOutcome<GisViewPoint>
8929
9138
  /**
8930
- * 批量给线路打补丁:与 patchPoints 同一套写法(`patchLines([{ id: 'l1', width: 4 }])` /
8931
- * `patchLines(['l1', 'l2'], { color: '#f00' })`),返回 `{ ok, indexes, items, count, skipped }`,
8932
- * 只记一条历史、只发一条 updateLines 数据变更
9139
+ * updateLine 的批量版:与 patchPoints 同一套写法(`patchLines([{ id: 'l1', width: 4 }])` /
9140
+ * `patchLines(['l1', 'l2'], { color: '#f00' })`),每条与公共补丁都支持 updateLine 的线路字段和
9141
+ * `groupId` / `groupIndex` / `channelId` 分组指令。分组指令不写进线路数据;只给分组指令的条目不发
9142
+ * updateLines,有数据字段时整批只发一条 updateLines。一次调用只记一条历史;
9143
+ * 整份替换用 `updateData({ lines })`,旧的 updateLines(lines) 已按去重收口删除
8933
9144
  */
8934
- patchLines(entries: GisViewUpdateItemEntry<GisViewLine> | Array<GisViewUpdateItemEntry<GisViewLine>>, patch?: Partial<GisViewLine>): GisViewUpdateItemsOutcome<GisViewLine>
9145
+ patchLines(entries: GisViewLineUpdateItemEntry | GisViewLineUpdateItemEntry[], patch?: GisViewLinePatch): GisViewUpdateItemsOutcome<GisViewLine>
9146
+ /**
9147
+ * updateChannel 的批量版:`patchChannels([{ id: 'c1', name: '甲' }, { index: 2, width: 8 }])`
9148
+ * 一次改几条,或者 `patchChannels(['c1', 'c2'], { visible: false })` 把同一份通道补丁盖到一批上。
9149
+ * 也支持 `patchChannels(entries, patch?, linePatches?, lineIds?)` 以及逐条
9150
+ * `{ id, patch, linePatches, lineIds }`,三段与 updateChannel 的第二 / 三 / 四段同义。
9151
+ * 声明整批只推一次引擎;成员补丁、补建 / 整表少了删在同一 batch 内收尾,历史只算一步,
9152
+ * 主变更是一条 `updateChannels`;改过分组 / 成员表的通道另发 `channelGroups` / `channelGroupChange` 明细。
9153
+ * 旧扁平写法的 `groups` / `lineIds` 仍是声明级增删;逐条 `lineIds` 与 `linePatches` 配对时是整表对齐。
9154
+ * 认不出的定位、空表 / 不成对的整表进 `skipped`,不影响其余条目。整份换声明用
9155
+ * `updateData({ channels })`,旧的 updateChannels(channels) 已按去重收口删除
9156
+ */
9157
+ patchChannels(entries: GisViewChannelUpdateItemEntry | GisViewChannelUpdateItemEntry[], patch?: GisViewChannelPatch, linePatches?: GisViewChannelLinePatch | GisViewChannelLinePatch[], lineIds?: string | number | Array<string | number>): GisViewUpdateItemsOutcome<GisViewChannel>
8935
9158
  /**
8936
9159
  * 改某个通道的数据(分组、宽度、端点等)并重渲染(与整份换声明的 `updateData({ channels })` 一对):
8937
9160
  * 成员表没变时只把成员回线换成新几何,成员表换了(改 lineIds)整份重解析。
@@ -8956,7 +9179,7 @@ export interface GisViewInstance {
8956
9179
  * 什么都不做。只写 groups 缩小时回线留在数据里,被移出通道、又不在别的通道上的各报一句 warning;
8957
9180
  * 不属于这条通道的条目跳过并报一句 warning(同一个条目只提醒一次)
8958
9181
  */
8959
- updateChannel(id: string | number, patch: Partial<GisViewChannel>, linePatches?: GisViewChannelLinePatch | GisViewChannelLinePatch[], lineIds?: string | number | Array<string | number>): GisViewInstance
9182
+ updateChannel(id: string | number, patch: GisViewChannelPatch, linePatches?: GisViewChannelLinePatch | GisViewChannelLinePatch[], lineIds?: string | number | Array<string | number>): GisViewInstance
8960
9183
  /** 逐要素的复合改法:同时处理多种字段、通道分组或成员回线时用这些入口;单项字段直接用 updatePoint / updateLine / updateChannel */
8961
9184
  /** 挪一个节点:`movePoint('n1', { x, y })` / `movePoint('n1', [x, y])` / `movePoint('n1', x, y)` 都认,绑定线路与锚定通道跟着重排 */
8962
9185
  movePoint(id: string | number, coordinate: GisViewCoordinate): GisViewInstance
@@ -9311,9 +9534,9 @@ export interface GisViewEngineOptions {
9311
9534
  networkOpacity?: number
9312
9535
  /** 背景编辑模式(见 GisViewOptions.backgroundEditing):true 时屏蔽网架指针与数据快捷键,仅保留滚轮缩放 */
9313
9536
  backgroundEditing?: boolean
9314
- /** 写 true 打开拖拽平移 / 滚轮缩放 / 右键回调(= pan / zoom / contextMenu),**缺省关** */
9537
+ /** 引擎内部总闸:组件层固定为 true,具体权限由 features 换算出的 pan / zoom / contextMenu 等字段决定 */
9315
9538
  interactive?: boolean
9316
- /** 写 true 打开悬停拾取与点击选中(= hover / select),**缺省关** */
9539
+ /** 引擎内部总闸:组件层固定为 true,具体权限由 features 换算出的 hover / select 等字段决定 */
9317
9540
  clickable?: boolean
9318
9541
  /**
9319
9542
  * 平移 / 缩放 / 悬停 / 选中 / 右键各自的开关(组件层的 features 就是按这几个字段下发的):
@@ -9336,7 +9559,7 @@ export interface GisViewEngineOptions {
9336
9559
  hoverThreshold?: number
9337
9560
  /** 光标配置:逐键合并,只想改一个分类时只写那一项即可 */
9338
9561
  cursorStyle?: GisViewCursorStyle
9339
- /** 点是否可拖拽,**缺省关**(组件层由 features.drag 与 options.draggable 一起算,写了 true 才开) */
9562
+ /** 点是否可拖拽(引擎内部字段):组件层由 features.drag 计算后下发,**缺省关** */
9340
9563
  draggable?: boolean
9341
9564
  /** 拖动节点时线路是否实时跟随,默认 true;false 表示停手后一次性更新线路 */
9342
9565
  liveDrag?: boolean
@@ -9344,14 +9567,14 @@ export interface GisViewEngineOptions {
9344
9567
  boxSelect?: boolean
9345
9568
  /** 多选开关(**缺省关**):打开后不用按修饰键,直接单击要素就取反累加(与按住 shortcuts.multiSelect 点击同一套行为) */
9346
9569
  multiSelect?: boolean
9347
- /** 再次选中即取消(**缺省关**),语义见 GisViewOptions.toggleSelect */
9570
+ /** 再次选中即取消(**缺省关**):组件层由 features.toggleSelect 下发 */
9348
9571
  toggleSelect?: boolean
9349
9572
  /** 框选 / Ctrl 多选允许的要素类型,写法与缺省口径见 GisViewOptions.selectionKinds */
9350
9573
  selectionKinds?: GisViewSelectionKindsInput
9351
9574
  selectionBoxStyle?: GisViewSelectionBoxStyle | null
9352
9575
  /** 框选后保留矩形,并允许拖动矩形平移框内选中节点;缺省 false */
9353
9576
  selectionBoxPersistent?: boolean
9354
- /** 选中 / 拖动 / 待确认合并的节点与选中通道是否画在所有要素之上,默认 true */
9577
+ /** 选中 / 拖动 / 待确认合并的节点、选中通道以及它们的 decorations 是否画在所有要素之上,默认 true */
9355
9578
  selectionOnTop?: boolean
9356
9579
  /**
9357
9580
  * 通道选中模式:点中通道里的一条回线时选中什么 —— 'line'(缺省)只选这一条、'group' 连它所在分组、
@@ -9372,7 +9595,7 @@ export interface GisViewEngineOptions {
9372
9595
  copy?: GisViewCopyOptions
9373
9596
  /** 合并节点的配置(**缺省关**:写了才算开):开关、触发时机、像素容差、确认方式与数据合并规则 */
9374
9597
  merge?: GisViewMergeOptions
9375
- /** 是否允许编辑拐点,**缺省关** */
9598
+ /** 是否允许编辑拐点,**缺省关**:组件层由 features.waypoint 下发 */
9376
9599
  waypointEditable?: boolean
9377
9600
  waypointVisibility?: 'selected' | 'always'
9378
9601
  waypointStyle?: GisViewPointStyle | null
@@ -9715,6 +9938,9 @@ export declare const createGisViewEngine: (canvas: HTMLCanvasElement, options?:
9715
9938
  /** 全部开关名(顺序与界面一致),界面按它列复选框 */
9716
9939
  export declare const FEATURE_NAMES: GisViewFeatureName[]
9717
9940
 
9941
+ /** 详细配置别名 -> 一个或多个规范开关;别名只在输入时展开,`getFeatures()` 不返回别名键 */
9942
+ export declare const FEATURE_ALIASES: Record<GisViewFeatureAliasName, GisViewFeatureName[]>
9943
+
9718
9944
  /** 预设表:键是开关名、值是布尔;**没列出来的开关取 featureDefault**(全关;「配了才有」的那几项不给值) */
9719
9945
  export declare const FEATURE_PRESETS: Record<GisViewFeaturePreset, GisViewFeatures>
9720
9946