gis-view-webgl2 0.1.1 → 0.1.2

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 (34) hide show
  1. package/README.md +13 -1
  2. package/dist/gis-view.css +1 -1
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +255 -3
  5. package/dist/index.js +1 -1
  6. package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +65 -0
  7. package/docs/GisView.md +1 -1
  8. 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 +58 -0
  9. package/docs/demos/ChannelDemo.vue +566 -6
  10. package/docs/demos/CopyMergeDemo.vue +57 -6
  11. package/docs/demos/LabelDemo.vue +67 -11
  12. package/docs/demos/api-index.js +13 -3
  13. 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 +4 -2
  14. package/docs/format/04-/351/200/232/351/201/223/344/270/216/346/240/207/347/255/276.md +5 -4
  15. package/docs/manual/02-/345/235/220/346/240/207/344/270/216/346/225/260/346/215/256.md +7 -2
  16. package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +21 -5
  17. 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 +100 -0
  18. 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 +38 -0
  19. package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +5 -5
  20. package/docs/manual/09-/351/200/232/351/201/223/344/270/216/345/244/232/345/233/236/347/272/277.md +58 -8
  21. 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 +27 -2
  22. package/docs/manual/12-/346/240/207/347/255/276/344/270/216/350/243/205/351/245/260.md +45 -1
  23. package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +7 -1
  24. package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +8 -0
  25. package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +28 -0
  26. package/docs/manual/20-/346/200/247/350/203/275/344/270/216/345/244/247/346/225/260/346/215/256.md +3 -0
  27. 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 +1 -1
  28. package/docs/steps/README.md +8 -6
  29. package/docs/steps/selftest-demos.html +194 -29
  30. package/docs/steps/selftest-docs.html +7 -6
  31. package/docs/steps/selftest-features.html +213 -1
  32. package/docs/steps/selftest-labels.html +249 -4
  33. package/docs//346/216/245/345/217/243/345/215/217/350/256/256.md +17 -11
  34. package/package.json +2 -2
@@ -325,7 +325,7 @@ HTTP `409 Conflict` 示例:
325
325
  "channelId": "channel-a",
326
326
  "action": { "type": "splitGroups", "groupIds": ["channel-a", "channel-a::2"] },
327
327
  "groups": [
328
- { "id": "channel-a", "lineIds": ["line-0", "line-1"], "path": [[18.0, 10.2], [20.5, 11.1]] },
328
+ { "id": "channel-a", "lineIds": ["line-0", "line-1"], "path": [[18.0, 10.2], [20.5, 11.1]], "waypointOffsets": { "1": [1.2, -0.8] } },
329
329
  { "id": "channel-a::2", "lineIds": ["line-2"], "path": [] }
330
330
  ],
331
331
  "baseVersion": 12,
@@ -337,10 +337,11 @@ HTTP `409 Conflict` 示例:
337
337
  | --- | --- | --- |
338
338
  | `channelId` | `string \| number` | 通道 id,必须与路径参数一致 |
339
339
  | `action` | `object` | 审计用动作:`splitGroups` / `mergeGroups` / `moveLine` / `addGroup` / `setGroups`;服务端不应依赖它恢复数据 |
340
- | `groups` | `Array<{ id, lineIds, path }>` | **整份**分组声明;顺序就是后续回线排布顺序 |
340
+ | `groups` | `Array<{ id, lineIds, path, waypointOffsets? }>` | **整份**分组声明;顺序就是后续回线排布顺序 |
341
341
  | `groups[].id` | `string \| number` | 分组稳定 id |
342
342
  | `groups[].lineIds` | `Array<string \| number>` | 这一组包含的回线 id;同一条回线在整份声明里只能出现一次 |
343
343
  | `groups[].path` | `[number, number][]` | 分组公共骨架的中间拐点;`[]` 是合法的「直连」,不能当成没提交 |
344
+ | `groups[].waypointOffsets` | `Record<string, [number, number] \| { x, y }>` | `vertex` 拖动的分组刚性偏移:键是含首尾端点的骨架顶点序号(只认中间拐点),值是组内所有回线共用的世界坐标增量;省略或空对象表示不带偏移 |
344
345
 
345
346
  `groups` 至少保留一组。若业务允许空通道,建议另走 `DELETE /gis/channels/{channelId}`,不要把空分组声明当作删除通道的隐式约定。
346
347
 
@@ -350,7 +351,7 @@ HTTP `409 Conflict` 示例:
350
351
  {
351
352
  "channelId": "channel-a",
352
353
  "groups": [
353
- { "id": "channel-a", "lineIds": ["line-0", "line-1"], "path": [[18.0, 10.2], [20.5, 11.1]] },
354
+ { "id": "channel-a", "lineIds": ["line-0", "line-1"], "path": [[18.0, 10.2], [20.5, 11.1]], "waypointOffsets": { "1": [1.2, -0.8] } },
354
355
  { "id": "channel-a::2", "lineIds": ["line-2"], "path": [] }
355
356
  ],
356
357
  "groupCount": 2,
@@ -358,11 +359,11 @@ HTTP `409 Conflict` 示例:
358
359
  }
359
360
  ```
360
361
 
361
- 服务端应校验 channel 存在、`lineIds` 全部属于这条通道且不重复、每个 `path` 点都是有限数值;返回落库后的整份快照,前端用 `groups` 覆盖本地对应通道。
362
+ 服务端应校验 channel 存在、`lineIds` 全部属于这条通道且不重复、每个 `path` 点都是有限数值,以及 `waypointOffsets` 的键都落在中间拐点、值都是有限增量;返回落库后的整份快照,前端用 `groups` 覆盖本地对应通道。
362
363
 
363
364
  ### 5.2 `PATCH /gis/channels/{channelId}/groups/waypoints`
364
365
 
365
- 覆盖一条通道里某一组的**公共骨架**。`path` 只包含中间拐点,两端由通道绑定的节点补齐。拖动过程中 `phase: 'start' / 'move'` 不发请求,只在 `add` / `remove` / `end` 发一条。
366
+ 覆盖一条通道里某一组的**公共骨架与分组刚性偏移**。`path` 只包含中间拐点,两端由通道绑定的节点补齐;`waypointOffsets` 是 `channelWaypointDragMode: 'vertex'` 拖出来的按骨架序号偏移。拖动过程中 `phase: 'start' / 'move'` 不发请求,只在 `add` / `remove` / `end` 发一条。
366
367
 
367
368
  请求体:
368
369
 
@@ -372,6 +373,7 @@ HTTP `409 Conflict` 示例:
372
373
  "channelId": "channel-a",
373
374
  "groupId": "channel-a::2",
374
375
  "path": [[18.0, 10.2], [20.5, 11.1]],
376
+ "waypointOffsets": { "1": [1.2, -0.8] },
375
377
  "phase": "end",
376
378
  "scope": "group",
377
379
  "baseVersion": 12,
@@ -384,8 +386,9 @@ HTTP `409 Conflict` 示例:
384
386
  | `channelId` | `string \| number` | 通道 id |
385
387
  | `groupId` | `string \| number` | 分组 id |
386
388
  | `path` | `[number, number][]` | 整份公共骨架的中间拐点;空数组表示直连 |
389
+ | `waypointOffsets` | `Record<string, [number, number] \| { x, y }>` | 分组刚性偏移:键按含首尾端点的骨架序号算,只接受中间拐点;省略或空对象表示普通平行骨架 |
387
390
  | `phase` | `'add' \| 'remove' \| 'end'` | 实际落地阶段;`select` / `start` / `move` 不应发请求 |
388
- | `scope` | `'group'` | 公共骨架的存储范围;组内每条回线的偏移拐点是由它派生的,不单独落库 |
391
+ | `scope` | `'group'` | 公共骨架与分组刚性偏移的存储范围;组内每条回线的车道偏移是由它派生的,不单独落库 |
389
392
 
390
393
  响应 `data.result`:
391
394
 
@@ -393,10 +396,13 @@ HTTP `409 Conflict` 示例:
393
396
  {
394
397
  "target": { "type": "channelGroup", "channelId": "channel-a", "groupId": "channel-a::2", "scope": "group" },
395
398
  "path": [[18.0, 10.2], [20.5, 11.1]],
399
+ "waypointOffsets": { "1": [1.2, -0.8] },
396
400
  "pointCount": 2
397
401
  }
398
402
  ```
399
403
 
404
+ 服务端必须把 `path` 与 `waypointOffsets` 一起落库并一起返回:只收 `path` 会丢掉非平行拖动结果,刷新后分组又回到旧骨架。
405
+
400
406
  ### 5.3 `PATCH /gis/lines/{lineId}/path`
401
407
 
402
408
  覆盖独立线路的整条折线。与通道分组不同,这里 `path` **包含首尾端点**,因为独立线路不依赖通道节点补端点。
@@ -446,9 +452,9 @@ HTTP `409 Conflict` 示例:
446
452
  ### 6.3 通道分组 / 拐点
447
453
 
448
454
  1. 只在真实落地的 `add` / `remove` / `end` 发请求;`start` / `move` 的中间态不发。
449
- 2. 请求体永远是操作完成后的**整份** `groups` 或 `path`,从 `view.getChannelGroups()` / `view.getChannelGroupWaypoints()` 重新读。
455
+ 2. 请求体永远是操作完成后的**整份** `groups`,或成对的 `path` + `waypointOffsets`,从 `view.getChannelGroups()` / `view.getChannelGroupWaypoints()` 重新读。
450
456
  3. 同一条通道的写请求串行发送;拖动期间只保留最后一个 `end`。
451
- 4. 成功用响应里的 `groups` / `path` 覆盖本地快照;如果服务端做了归一化,以服务端为准。
457
+ 4. 成功用响应里的 `groups` / `path` / `waypointOffsets` 覆盖本地快照;如果服务端做了归一化,以服务端为准。
452
458
  5. 409 优先使用错误包里的 `data.current` 做局部恢复;没有 `current` 时先拉最新文档。
453
459
 
454
460
  ### 6.4 前端落地映射:拿到 `data.result` 之后
@@ -582,7 +588,7 @@ else {
582
588
 
583
589
  const opId = crypto.randomUUID() // rebase 是一次新提交,不能复用旧 opId
584
590
  const nextBody = {
585
- ...rebuildRequestFromCurrentView(), // 从恢复后的视图重新读整份 groups / path
591
+ ...rebuildRequestFromCurrentView(), // 从恢复后的视图重新读整份 groups / path + waypointOffsets
586
592
  baseVersion: failure.currentVersion,
587
593
  opId
588
594
  }
@@ -611,7 +617,7 @@ const nextBody = {
611
617
  - **事务边界**:成功应用与幂等记录、版本推进在同一个数据库事务里提交;否则会出现「数据已写但幂等表没写」的重复应用风险。
612
618
  - **稳定 id**:所有分组、线路、通道都优先按 id 对账,不要用数组下标当业务主键。客户端生成 id 时,后端要校验唯一性。
613
619
  - **空 `path`**:是合法值,表示直连。校验时只检查「是否是数组 + 坐标是否有限」,不要用 truthy 判断吞掉空数组。
614
- - **响应快照**:分组 / 拐点接口返回落库后的最新 `groups` / `path`;复制返回 `idMap`;合并返回事务实际涉及的 id 集合。
620
+ - **响应快照**:分组 / 拐点接口返回落库后的最新 `groups` / `path` / `waypointOffsets`;复制返回 `idMap`;合并返回事务实际涉及的 id 集合。
615
621
  - **审计**:记录 `requestId` / `traceId` / `opId` / `transactionId` / `actor` / 资源 id,日志里不要只记一个 URL。
616
622
  - **顺序**:同文档的写请求按版本串行;客户端也应对同一条通道 / 同一份文档做串行化,避免多个成功响应相互覆盖。
617
623
 
@@ -622,7 +628,7 @@ const nextBody = {
622
628
  | 批量复制与合并 | 框选后复制 | `POST /gis/copies/batch` | `transactionId`、`created`、`counts`、`idMap` |
623
629
  | 批量复制与合并 | 拖拽 / 选中后合并 | `POST /gis/merges` | `retainedPointIds`、`removedPointIds`、删线 / 删通道 id |
624
630
  | 通道与数据 | 拆 / 并 / 挪回线 / 新建组 | `PATCH /gis/channels/{id}/groups` | `groups` 最新快照、`groupCount`、`lineCount` |
625
- | 通道与数据 | 通道分组加 / 删 / 拖拐点 | `PATCH /gis/channels/{id}/groups/waypoints` | `target`、`path`、`pointCount` |
631
+ | 通道与数据 | 通道分组加 / 删 / 拖拐点 | `PATCH /gis/channels/{id}/groups/waypoints` | `target`、`path`、`waypointOffsets`、`pointCount` |
626
632
  | 通道与数据 | 独立线路拐点 | `PATCH /gis/lines/{id}/path` | `target`、`path`、`pointCount` |
627
633
 
628
634
  两个演示的面板都提供:正常 200、网络失败、服务端 500、版本冲突 409;“重试最近失败请求”保留原 `opId`,「重放最近成功请求」用于验证幂等回放不推进版本。请求预览区会同时打印请求头、body、HTTP 状态与完整响应包。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gis-view-webgl2",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "WebGL2 矢量视图:点、线与 GeoJSON / 图片背景层,无内置界面,点击 / 双击 / 拖拽可配置",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -40,4 +40,4 @@
40
40
  "vite-plugin-lib-inject-css": "^2.2.2",
41
41
  "vue": "^3.5.32"
42
42
  }
43
- }
43
+ }