Files
frontend-miniapp/static/sgs-map-sdk/sdk-bridge-contract.md
lyf 72885b7f54
Some checks failed
CI / verify (push) Has been cancelled
升级 SGS Map SDK 至 2.5.0
2026-07-16 09:43:52 +08:00

1161 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SGS Map SDK Bridge 契约文档
> 版本: 2.5.0 | 最后更新: 2026-07-15 | 基于独立 `/engine/` 渲染引擎实际实现
## 概述
本文档记录 SGS Map SDK客户端 JS 库)与独立发布的 `/engine/` 渲染引擎之间的 `postMessage` 通信契约。运行时引擎源码位于 `sgs-frontend-map/sdk-engine`,发布产物位于 `sgs-map-sdk-release/engine`
**核心架构**:
```
┌─────────────┐ postMessage ┌───────────────────┐ REST API ┌──────────┐
│ 宿主页面 │ ◄───────────► │ /engine/ 引擎 │ ◄──────────► │ 后端 │
│ (SDK.js) │ SGS_MAP_* │ (page.tsx iframe) │ /app-api/* │ Spring │
└─────────────┘ └───────────────────┘ └──────────┘
```
## 通信协议
### 请求格式(宿主 → 基座)
```ts
{
type: 'SGS_MAP_COMMAND',
action: string, // 指令名(如 'CHANGE_FLOOR'
requestId: string, // 唯一请求 ID用于匹配响应
payload: object // 指令参数
}
```
### 响应格式(基座 → 宿主)
```ts
{
type: 'SGS_MAP_RESPONSE',
action: string, // 原样回显请求的 actionA2.6 规约)
requestId: string, // 原样回显请求的 requestId
payload: object, // 响应数据(含 success: boolean
error?: { // 仅失败时存在
code: string,
message: string
}
}
```
### 事件格式(基座 → 宿主,主动推送)
```ts
{
type: 'SGS_MAP_EVENT',
action: string, // 事件名(如 'ENGINE_READY', 'ON_POI_CLICK'
payload: object
}
```
### Origin 安全校验
基座通过 URL 参数 `?targetOrigin=<origin>` 启用 origin 白名单校验。若 `targetOrigin``*` 且与 `event.origin` 不匹配,消息将被静默丢弃。
---
## Bridge 支持矩阵
> ✅ = 代码中存在对应 `case` 分支,已实际实现
> ❌ = 代码中无对应 `case` 分支
| # | SDK 方法名 | postMessage action | /engine/ 支持 | 最低版本 | 类别 |
|---|-----------|-------------------|:---:|---------|------|
| 1 | `自动握手` | `HELLO` | ✅ | 1.0.0 | 生命周期 |
| 2 | `changeFloor()` | `CHANGE_FLOOR` | ✅ | 1.0.0 | 地图控制 |
| 3 | `focusTo()` | `FOCUS_TO` | ✅ | 1.0.0 | 地图控制 |
| 4 | `setViewMode()` | `SET_VIEW_MODE` | ✅ | 2.3.0 | 地图控制 |
| 5 | `addMarker()` | `ADD_MARKER` / `ADD_BUSINESS_MARKER` | ✅ | 1.0.0 | 图钉 |
| 6 | `removeMarker()` | `REMOVE_MARKER` / `REMOVE_BUSINESS_MARKER` | ✅ | 1.0.0 | 图钉 |
| 7 | `clearMarkers()` | `CLEAR_MARKERS` | ✅ | 1.0.0 | 图钉 |
| 8 | `planRoute()` / `planRouteV2()` | `PLAN_ROUTE` | ✅ | 1.0.0 | 路径规划 |
| 9 | `highlightPolygon()` | `HIGHLIGHT_POLYGON` | ✅ | 1.0.0 | 地图控制 |
| 10 | `clearRoute()` | `CLEAR_ROUTE` | ✅ | 1.0.0 | 路径规划 |
| 11 | `resetView()` | `RESET_VIEW` | ✅ | 1.0.0 | 地图控制 |
| 12 | `getState()` | `GET_STATE` | ✅ | 1.0.0 | 状态查询 |
| 13 | `toggleLayer()` | `TOGGLE_LAYER` | ✅ | 1.5.0 | 图层控制 |
| 14 | `setVisibleLayers()` | `SET_VISIBLE_TYPES` | ✅ | 1.5.0 | 图层控制 |
| 15 | `getManifest()` | `GET_MANIFEST` | ✅ | 2.1.0 | 数据查询 |
| 16 | `loadFloorBundle()` | `LOAD_FLOOR_BUNDLE` | ✅ | 2.1.0 | 数据查询 |
| 17 | `getFloorPois()` | `GET_FLOOR_POIS` | ✅ | 2.1.0 | 数据查询 |
| 18 | `getPois()` | `GET_POIS` | ✅ | 1.0.0 | 数据查询 |
| 19 | `getSpaces()` | `GET_SPACES` | ✅ | 2.1.0 | 数据查询 |
| 20 | `getGuideStops()` | `GET_GUIDE_STOPS` | ✅ | 2.1.0 | 数据查询 |
| 21 | `getGuideStopsByHall()` | `GET_GUIDE_STOPS_BY_HALL` | ✅ | 2.1.0 | 数据查询 |
| 22 | `getNavigablePlaces()` | `GET_NAVIGABLE_PLACES` | ✅ | 2.3.0 | 数据查询 |
| 23 | `preloadFloor()` | `PRELOAD_FLOOR` | ✅ | 2.1.0 | 性能优化 |
| 24 | `clearModelCache()` | `CLEAR_MODEL_CACHE` | ✅ | 2.1.0 | 性能优化 |
| 25 | `getPerformanceStats()` | `GET_PERFORMANCE_STATS` | ✅ | 2.1.0 | 诊断 |
| 26 | `getDiagnostics()` | `GET_DIAGNOSTICS` | ✅ | 2.3.0 | 诊断 |
| 27 | `getFloorDiagnostics()` | `GET_FLOOR_DIAGNOSTICS` | ✅ | 2.3.0 | 诊断 |
### 仅 mock-release 模式专用指令(非公开 SDK 方法)
| # | postMessage action | /engine/ 支持 | 说明 |
|---|-------------------|:---:|------|
| M1 | `GET_RELEASE_MANIFEST` | ✅ | 仅 `env=mock-release` 时可用 |
| M2 | `GET_MODEL_RESOURCES` | ✅ | 仅 `env=mock-release` 时可用 |
| M3 | `GET_LAYER_TREE` | ✅ | 仅 `env=mock-release` 时可用 |
| M4 | `LOAD_MOCK_RELEASE_ROUTE` | ✅ | 仅 `env=mock-release` 时可用 |
> 以上 M1M4 已在 SDK v2.3.0 中标记为废弃 (`deprecated`),新接入方不应使用。
---
## 各指令详细规格
---
### 1. HELLO
握手协议。SDK 创建 iframe 后自动发送,基座收到后立即触发 `ENGINE_READY` 事件。
| 项目 | 值 |
|------|---|
| **postMessage action** | `HELLO` |
| **SDK 方法** | 自动握手SDK 内部调用,不暴露公开方法) |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**:
```ts
{ version?: string } // SDK 版本号(可选)
```
**成功响应**: 无显式 `SGS_MAP_RESPONSE`。基座通过 `SGS_MAP_EVENT` 发送 `ENGINE_READY`:
```ts
// type: 'SGS_MAP_EVENT', action: 'ENGINE_READY'
{
engineVersion: "2.0.0",
protocolVersion: 2,
sdkVersion: "2.3.0",
floorId: string | number,
poiCount: number,
hasRouteNetwork: boolean
}
```
**错误响应**: N/A
---
### 2. CHANGE_FLOOR
切换当前显示楼层。触发 GPU 显存回收、状态重置和新楼层数据加载。
| 项目 | 值 |
|------|---|
| **postMessage action** | `CHANGE_FLOOR` |
| **SDK 方法** | `sdk.changeFloor(floorId, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**:
```ts
{
floorId: string | number // 目标楼层 ID 或 floorCodereal-preview 模式支持)
}
```
**成功响应**:
```ts
{
success: true,
floorId: string | number // 实际切换到的楼层 ID
}
```
**错误响应**: N/A当前实现始终返回 success
**特殊行为**:
- 若目标楼层与当前楼层相同,直接返回 success不触发重新加载防抖
- `real-preview` 模式下支持通过 `floorCode`(如 `"L2"`)匹配楼层
---
### 3. FOCUS_TO
镜头聚焦到指定 POI、坐标或场景节点支持自适应半径 FlyTo 动画。
| 项目 | 值 |
|------|---|
| **postMessage action** | `FOCUS_TO` |
| **SDK 方法** | `sdk.focusTo(node)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**(三种模式):
```ts
// 模式 1: 坐标聚焦
{
type: "coord",
x: number, // GLB X 坐标(米)
z: number, // GLB Z 坐标(米)
y?: number, // 高度,默认 0.2
radius?: number // 聚焦半径,默认 3.0
}
// 模式 2: POI ID 聚焦
{
type: "poiId",
value: string | number // POI ID
}
// 模式 3: 节点名聚焦
{
type: "nodeName",
value: string // GLB 节点名或 POI 名称
}
// 模式 4: 字符串简写
"Hall_Dinosaur" // 直接传 POI 名称字符串
```
**成功响应**: 无显式响应fire-and-forget 模式)
**错误响应**: 无显式响应,仅 console.warn
**备注**: 基座会同时在 POI 列表和讲解点列表中检索匹配项,按 `name` / `nameEn` / `id` / `guideStopId` 匹配。
---
### 4. SET_VIEW_MODE
切换 2D 俯视 / 3D 透视模式。
| 项目 | 值 |
|------|---|
| **postMessage action** | `SET_VIEW_MODE` |
| **SDK 方法** | `sdk.setViewMode(mode)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.3.0 |
**请求 payload**:
```ts
{
mode: "2d" | "3d"
}
```
**成功响应**:
```ts
{
success: true,
mode: "2d" | "3d"
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_INVALID_MODE",
message: "Invalid mode: <value>. Expected '2d' or '3d'"
}
```
---
### 5. ADD_MARKER / ADD_BUSINESS_MARKER
添加业务图钉。两个 action 名共享同一处理逻辑,均可使用。
| 项目 | 值 |
|------|---|
| **postMessage action** | `ADD_MARKER``ADD_BUSINESS_MARKER` |
| **SDK 方法** | `sdk.addMarker(config)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**:
```ts
{
id: string, // 唯一图钉 ID重复 id 会覆盖已有图钉)
name: string, // 显示名称
iconUrl: string, // 图标 URL
anchorNodeName?: string, // 可选,绑定到 GLB 场景节点
position?: [number, number, number] // [x, y, z] 世界坐标
}
```
**成功响应**: 无显式响应fire-and-forget 模式)
**错误响应**: N/A
---
### 6. REMOVE_MARKER / REMOVE_BUSINESS_MARKER
移除指定业务图钉。两个 action 名共享同一处理逻辑。
| 项目 | 值 |
|------|---|
| **postMessage action** | `REMOVE_MARKER``REMOVE_BUSINESS_MARKER` |
| **SDK 方法** | `sdk.removeMarker(markerId)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**:
```ts
{
markerId: string // 要移除的图钉 ID
}
```
**成功响应**: 无显式响应fire-and-forget 模式)
**错误响应**: N/A
---
### 7. CLEAR_MARKERS
清空所有业务图钉。
| 项目 | 值 |
|------|---|
| **postMessage action** | `CLEAR_MARKERS` |
| **SDK 方法** | `sdk.clearMarkers()` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**: `{}` (空对象)
**成功响应**: 无显式响应fire-and-forget 模式)
**错误响应**: N/A
---
### 8. PLAN_ROUTE
路径规划。支持同层和跨层 NavMesh 寻路,起终点支持 POI 名称、POI ID 和坐标三种模式。
| 项目 | 值 |
|------|---|
| **postMessage action** | `PLAN_ROUTE` |
| **SDK 方法** | `sdk.planRoute(from, to, options?, timeout?)` / `sdk.planRouteV2(...)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**:
```ts
{
startNode: string | SgsMapNode, // 起点POI 名称字符串或结构化节点)
endNode: string | SgsMapNode, // 终点
options?: {
mode?: "walk" | "accessible", // 路线模式
wheelchair?: boolean // 无障碍路线
}
}
```
其中 `SgsMapNode`:
```ts
type SgsMapNode =
| { type: "coord"; floorId: string | number; x: number; z: number }
| { type: "poiId"; value: string | number }
| string // POI 名称
```
**成功响应**:
```ts
{
success: true,
distance: number, // 总距离(米)
duration: number, // 预计耗时(秒)
segments: Array<{ // 分段路线
floorId: string | number,
transferType: "WALK" | "ELEVATOR" | "STAIRS" | "ESCALATOR",
points: Array<{ x: number; y: number; z: number }>,
pathGeoJson?: string
}>
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_INVALID_PARAMS" | "ERR_ROUTING_FAILED",
message: string
}
```
---
### 9. HIGHLIGHT_POLYGON
高亮 POI 关联的多边形边界或空间面。
| 项目 | 值 |
|------|---|
| **postMessage action** | `HIGHLIGHT_POLYGON` |
| **SDK 方法** | `sdk.highlightPolygon(nodeName)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**:
```ts
{
nodeName?: string, // POI/空间面名称
name?: string, // 备选字段
id?: string | number // 备选字段
}
```
**成功响应**: 无显式响应fire-and-forget 模式)
**错误响应**: N/A
**备注**: 先在 POI 列表中查找(匹配 `polygonWkt`),若无结果再在空间面列表中查找(匹配 `boundaryWkt`)。
---
### 10. CLEAR_ROUTE
清除当前导航路线。
| 项目 | 值 |
|------|---|
| **postMessage action** | `CLEAR_ROUTE` |
| **SDK 方法** | `sdk.clearRoute()` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**: `{}` (空对象)
**成功响应**:
```ts
{
success: true
}
```
**错误响应**: N/A
---
### 11. RESET_VIEW
重置相机视角,清除聚焦和高亮状态,将视角模式恢复为 3D。
| 项目 | 值 |
|------|---|
| **postMessage action** | `RESET_VIEW` |
| **SDK 方法** | `sdk.resetView()` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**: `{}` (空对象)
**成功响应**:
```ts
{
success: true
}
```
**错误响应**: N/A
**备注**: 不会清除导航路线(`routeSegments`),仅重置选中 POI、聚焦目标和高亮节点。视角模式恢复为 `"3d"`
---
### 12. GET_STATE
获取基座当前内部状态快照。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_STATE` |
| **SDK 方法** | `sdk.getState()` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**: `{}` (空对象)
**成功响应**:
```ts
{
success: true,
floorId: string | number,
poiCount: number,
isNavActive: boolean,
engineVersion: "2.0.0",
routeSegments: any[],
activeSegmentIndex: number,
hasRouteNetwork: boolean,
spatialAreas: Array<{ id: any; name: string; wkt: string }>,
// mock-release 模式附加字段
envMode?: "mock-release",
floorCode?: string,
manifest?: { version: string; releaseId: string; totalFloors: number } | null
}
```
**错误响应**: N/A
---
### 13. TOGGLE_LAYER
切换指定 POI 类型图层的显示/隐藏。
| 项目 | 值 |
|------|---|
| **postMessage action** | `TOGGLE_LAYER` |
| **SDK 方法** | `sdk.toggleLayer(types, visible, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.5.0 |
**请求 payload**:
```ts
{
types: string[], // POI 类型列表(如 ["TOILET", "ELEVATOR"]
visible: boolean // true = 显示, false = 隐藏
}
```
**成功响应**:
```ts
{
success: true,
visibleTypes: string[] // 操作后的完整可见类型白名单
}
```
**错误响应**: N/A
---
### 14. SET_VISIBLE_TYPES
设置当前可见的图层类型列表(完全替换模式)。
| 项目 | 值 |
|------|---|
| **postMessage action** | `SET_VISIBLE_TYPES` |
| **SDK 方法** | `sdk.setVisibleLayers(types, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.5.0 |
**请求 payload**:
```ts
{
types: string[] // 可见类型列表
}
```
特殊值语义:
- `[]` → 切换为 `space` 模式(仅显示空间面)
- `["space"]` → 空间面模式
- `["guide_stop"]` → 仅讲解点
- `["poi"]` → 仅 POI
- 其他 → 自定义类型白名单
**成功响应**:
```ts
{
success: true,
visibleTypes: string[]
}
```
**错误响应**: N/A
---
### 15. GET_MANIFEST
获取地图 Manifest地图名称、楼层摘要、能力声明
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_MANIFEST` |
| **SDK 方法** | `sdk.getManifest(timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.1.0 |
**请求 payload**:
```ts
{
mapId?: string | number // 地图 ID默认 "1"
}
```
**成功响应**:
```ts
{
success: true,
mapId: string | number,
mapName: string,
sdkVersion: string,
protocolVersion: number,
dataVersion: string,
updatedAt: string,
coordinateSystem: string,
floors: SgsSdkFloorSummary[],
capabilities: { ... }
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_NETWORK" | "ERR_FAILED",
message: string
}
```
---
### 16. LOAD_FLOOR_BUNDLE
一次性加载指定楼层的完整数据包模型、POI、空间面、讲解点、路网摘要
| 项目 | 值 |
|------|---|
| **postMessage action** | `LOAD_FLOOR_BUNDLE` |
| **SDK 方法** | `sdk.loadFloorBundle(floorId, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.1.0 |
**请求 payload**:
```ts
{
floorId?: string | number // 目标楼层 ID默认当前楼层
}
```
**成功响应**:
```ts
{
success: true,
floor: { floorId, floorCode, floorName, sortOrder },
model: { modelUrl, fallbackModelUrl, compressionType, sizeBytes },
pois: SgsPoi[],
spaces: SgsSpaceArea[],
guideStops: SgsGuideStop[],
routeSummary: { hasRouteNetwork, nodeCount, edgeCount },
hiddenSceneNodeNames: string[],
dataVersion: string
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_NETWORK" | "ERR_FAILED",
message: string
}
```
---
### 17. GET_FLOOR_POIS
获取指定楼层 POI 列表。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_FLOOR_POIS` |
| **SDK 方法** | `sdk.getFloorPois(floorId, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.1.0 |
**请求 payload**:
```ts
{
floorId?: string | number // 目标楼层 ID默认当前楼层
}
```
**成功响应**:
```ts
{
success: true,
pois: SgsPoi[]
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_FAILED",
message: string
}
```
---
### 18. GET_POIS
获取当前楼层 POI 列表(直接返回基座内存中的 POI 数据)。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_POIS` |
| **SDK 方法** | `sdk.getPois(floorCode, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 1.0.0 |
**请求 payload**: `{}` (空对象)
**成功响应**:
```ts
{
success: true,
pois: any[], // 当前基座内存中的 POI 数组
floorCode: string // 当前楼层代码
}
```
**错误响应**: N/A
---
### 19. GET_SPACES
获取指定楼层空间面列表。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_SPACES` |
| **SDK 方法** | `sdk.getSpaces(floorId, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.1.0 |
**请求 payload**:
```ts
{
floorId?: string | number // 目标楼层 ID默认当前楼层
}
```
**成功响应**:
```ts
{
success: true,
spaces: SgsSpaceArea[]
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_FAILED",
message: string
}
```
---
### 20. GET_GUIDE_STOPS
获取指定楼层讲解点列表。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_GUIDE_STOPS` |
| **SDK 方法** | `sdk.getGuideStops(floorId, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.1.0 |
**请求 payload**:
```ts
{
floorId?: string | number // 目标楼层 ID默认当前楼层
}
```
**成功响应**:
```ts
{
success: true,
guideStops: SgsGuideStop[]
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_FAILED",
message: string
}
```
---
### 21. GET_GUIDE_STOPS_BY_HALL
按展厅 ID 获取讲解点列表。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_GUIDE_STOPS_BY_HALL` |
| **SDK 方法** | `sdk.getGuideStopsByHall(hallId, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.1.0 |
**请求 payload**:
```ts
{
hallId: string | number // 必填,展厅 ID
}
```
**成功响应**:
```ts
{
success: true,
guideStops: SgsGuideStop[]
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_INVALID_PARAMS", // hallId 为空时
message: "hallId 不能为空"
}
// 或
{
code: "ERR_FAILED",
message: string
}
```
---
### 22. GET_NAVIGABLE_PLACES
获取指定楼层可导航目的地列表。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_NAVIGABLE_PLACES` |
| **SDK 方法** | `sdk.getNavigablePlaces(floorId, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.3.0 |
**请求 payload**:
```ts
{
floorId?: string | number // 目标楼层 ID默认当前楼层
}
```
**成功响应**:
```ts
{
success: true,
navigablePlaces: SgsNavigablePlace[]
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_INVALID_PARAMS", // floorId 为空时
message: "floorId 不能为空"
}
// 或
{
code: "ERR_NETWORK" | "ERR_FAILED",
message: string
}
```
---
### 23. PRELOAD_FLOOR
后台预加载指定楼层的 bundle 数据到缓存LRU最多缓存 2 个楼层),不切换当前视图。
| 项目 | 值 |
|------|---|
| **postMessage action** | `PRELOAD_FLOOR` |
| **SDK 方法** | `sdk.preloadFloor(floorId, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.1.0 |
**请求 payload**:
```ts
{
floorId: string | number // 必填,要预加载的楼层 ID
}
```
**成功响应**:
```ts
{
success: true,
cached: boolean, // true = 命中已有缓存, false = 新加载
loadMs?: number // 新加载时的耗时(仅 cached=false 时存在)
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_INVALID_PARAMS", // floorId 为空时
message: "floorId 不能为空"
}
// 或
{
code: "ERR_NETWORK" | "ERR_FAILED",
message: string
}
```
---
### 24. CLEAR_MODEL_CACHE
清空客户端 bundle 缓存。
| 项目 | 值 |
|------|---|
| **postMessage action** | `CLEAR_MODEL_CACHE` |
| **SDK 方法** | `sdk.clearModelCache()` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.1.0 |
**请求 payload**: `{}` (空对象)
**成功响应**:
```ts
{
success: true
}
```
**错误响应**: N/A
---
### 25. GET_PERFORMANCE_STATS
获取渲染基座的性能统计数据。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_PERFORMANCE_STATS` |
| **SDK 方法** | `sdk.getPerformanceStats(timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.1.0 |
**请求 payload**: `{}` (空对象)
**成功响应**:
```ts
{
success: true,
currentFloorId: string | number,
manifestLoadMs?: number,
bundleLoadMs?: number,
modelParseMs?: number,
firstRenderMs?: number,
dracoUsed?: boolean,
fallbackUsed?: boolean
}
```
**错误响应**: N/A
---
### 26. GET_DIAGNOSTICS
获取地图整体诊断信息。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_DIAGNOSTICS` |
| **SDK 方法** | `sdk.getDiagnostics(timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.3.0 |
**请求 payload**:
```ts
{
mapId?: string | number // 地图 ID默认 "1"
}
```
**成功响应**:
```ts
{
success: true,
mapId: string | number,
mapName: string,
sdkVersion: string,
status: "OK" | "WARN" | "ERROR",
floors: SgsFloorDiagnosticsSummary[],
summary: {
floorCount: number,
modelReadyFloorCount: number,
poiCount: number,
spaceCount: number,
guideStopCount: number,
navigablePlaceCount: number,
routeNodeCount: number,
routeEdgeCount: number
},
warnings: string[]
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_NETWORK" | "ERR_FAILED",
message: string
}
```
---
### 27. GET_FLOOR_DIAGNOSTICS
获取单个楼层的详细诊断信息。
| 项目 | 值 |
|------|---|
| **postMessage action** | `GET_FLOOR_DIAGNOSTICS` |
| **SDK 方法** | `sdk.getFloorDiagnostics(floorId, timeout?)` |
| **/engine/ 支持** | ✅ |
| **最低版本** | 2.3.0 |
**请求 payload**:
```ts
{
floorId?: string | number // 目标楼层 ID默认当前楼层
}
```
**成功响应**:
```ts
{
success: true,
floorId: string | number,
floorCode: string,
floorName: string,
status: "OK" | "WARN" | "ERROR",
modelReady: boolean,
poiCount: number,
spaceCount: number,
guideStopCount: number,
navigablePlaceCount: number,
routeNodeCount: number,
routeEdgeCount: number,
routePlanningReady: boolean,
warnings: string[]
}
```
**错误响应**:
```ts
{
success: false
}
// error:
{
code: "ERR_INVALID_PARAMS", // floorId 为空时
message: "floorId 不能为空"
}
// 或
{
code: "ERR_NETWORK" | "ERR_FAILED",
message: string
}
```
---
## 基座主动事件一览
以下事件由基座通过 `SGS_MAP_EVENT` 类型主动推送,无需 SDK 请求:
| 事件 action | 触发时机 | payload 关键字段 |
|-------------|---------|-----------------|
| `ENGINE_READY` | 引擎初始化完成 / HELLO 响应 | `engineVersion`, `protocolVersion`, `sdkVersion`, `floorId`, `poiCount`, `hasRouteNetwork` |
| `ON_MODEL_LOADING` | 模型开始加载 | `floorId`, `modelUrl` |
| `ON_MODEL_READY` | 模型解析完成 | `floorId`, `parseTimeMs` |
| `ON_MODEL_ERROR` | 模型加载失败/超时 | `floorId`, `error`, `fallbackUsed` |
| `ON_FLOOR_BUNDLE_READY` | 楼层 bundle 数据加载完成 | `floorId`, `dataVersion` |
| `ON_POI_CLICK` | 用户点击 POI | `id`, `name`, `type`, `floorId` |
| `ON_ROUTE_TRANSFER` | 跨楼层换乘提示 | `currentFloorId`, `targetFloorId`, `transferType` |
---
## 错误码汇总
| 错误码 | 说明 | 出现指令 |
|--------|------|---------|
| `ERR_INVALID_MODE` | `SET_VIEW_MODE` 参数非法 | SET_VIEW_MODE |
| `ERR_INVALID_PARAMS` | 必填参数缺失或无效 | PLAN_ROUTE, GET_GUIDE_STOPS_BY_HALL, GET_NAVIGABLE_PLACES, PRELOAD_FLOOR, GET_FLOOR_DIAGNOSTICS |
| `ERR_ROUTING_FAILED` | NavMesh 路径规划失败 | PLAN_ROUTE |
| `ERR_NETWORK` | 后端 API 网络异常 | GET_MANIFEST, LOAD_FLOOR_BUNDLE, GET_NAVIGABLE_PLACES, PRELOAD_FLOOR, GET_DIAGNOSTICS, GET_FLOOR_DIAGNOSTICS |
| `ERR_FAILED` | 通用失败 | 多个异步指令的 catch 兜底 |
| `ERR_UNSUPPORTED` | 基座不支持该指令 | 未识别的 actiondefault 分支、mock-release 专用指令在非 mock 模式下调用 |
---
## 版本演进
| 版本 | 新增 action |
|------|------------|
| 1.0.0 | HELLO, CHANGE_FLOOR, FOCUS_TO, ADD_MARKER, ADD_BUSINESS_MARKER, REMOVE_MARKER, REMOVE_BUSINESS_MARKER, CLEAR_MARKERS, PLAN_ROUTE, HIGHLIGHT_POLYGON, CLEAR_ROUTE, RESET_VIEW, GET_STATE, GET_POIS |
| 1.5.0 | TOGGLE_LAYER, SET_VISIBLE_TYPES |
| 2.1.0 | GET_MANIFEST, LOAD_FLOOR_BUNDLE, GET_FLOOR_POIS, GET_SPACES, GET_GUIDE_STOPS, GET_GUIDE_STOPS_BY_HALL, PRELOAD_FLOOR, CLEAR_MODEL_CACHE, GET_PERFORMANCE_STATS |
| 2.3.0 | SET_VIEW_MODE, GET_NAVIGABLE_PLACES, GET_DIAGNOSTICS, GET_FLOOR_DIAGNOSTICS |