1. 平台通用能力
插件化手册
  • FH2 插件开发手册
    • 产品简介
    • 典型场景
    • 发版说明
    • 快速开始
      • 快速开始总览
      • 第一个插件
      • 后端插件
      • 全栈闭环
    • AI辅助开发
      • AI 开发 Skill
      • 安装与复验
      • 第一个工程
      • 真实需求示例:现场问题上报
      • 改造已有工程
      • 调试与交付
    • 开发指南
      • 开发指南
      • 基础概念
        • 基础概念总览
        • 什么是插件开发
        • 平台架构
        • 前端宿主、扩展点与能力
        • 后端运行时、入口与权限
        • 开发流程
        • 安全与隔离
        • 支持范围与问题反馈
      • 开发指南
        • 开发指南总览
        • 前端插件
          • 前端插件深度指南
          • 前端工程结构
          • 插件清单(fh2-plugin.json)
          • 入口与生命周期
          • 界面与状态
          • 多宿主插件
          • 跨宿主通信服务
          • HTTP、WebSocket 与事件
          • 存储、Blob 与定时器
          • 工具链与本地调试页面
        • 后端插件
          • 后端开发深度指南
          • 后端插件的结构
          • 后端源清单 fh2-plugin.json
          • HTTP 接口处理函数
          • 消息订阅与事件处理函数
          • ctx 与能力注入
          • 数据存储与缓存
          • 流程编排
          • 触发方式
          • 连接外部系统
          • 流程编排练习(DAG)
        • 前后端协作
          • 前后端协作总览
          • 前后端共享契约
          • 端到端幂等
          • 事件、通知与状态
          • 统一错误模型
          • 链路标识与诊断日志
        • 完整练习
          • 环境准备
          • 第一个前端插件
          • 第一个后端插件
          • 第一个全栈插件
      • 能力总览
        • 能力地图
        • 能力可用性矩阵
        • 前端能力
          • 平台通用能力
            • 平台通用能力总览
            • 基础运行时:HTTP、事件、WebSocket 与存储
            • 导航、位置与通知
            • 弹窗、音频与剪贴板
            • 地图能力
            • 项目设备能力
            • WPMZ 与航线预览
            • 受控对象上传
          • 项目宿主
            • 项目宿主总览
            • 项目上下文
            • 项目侧边栏入口
            • 项目插件路由
            • 项目工作区
          • 消息宿主
            • 消息宿主总览
            • 消息告警弹层
            • 消息导航与通知
          • 计划库宿主
            • 计划库宿主总览
            • 计划库表单上下文
            • 计划库表单扩展
            • 校验、提交与 `biz_ext`
          • 驾驶舱
            • 驾驶舱插件能力总览
            • 驾驶舱扩展点
            • 上下文与遥测
            • 相机、检测与 AI
            • 场景几何与直播指针
            • 飞控、云台与任务
            • 驾驶舱平台事件
        • 后端能力
          • 后端能力地图
          • 后端能力总览
          • 配置、受管出网与集成连接
          • 事件与流程
          • 飞行任务与违停巡逻
          • 数据存储
          • 媒体与前端通知
          • 资源租约
          • 作业、目标轨迹与视频处理
      • 调试与测试
        • 调试与测试总览
        • 快速入门排错
        • 本地开发
        • Web IDE:打开工程与保存改动
        • 工作流编辑器:节点、接线与交付
        • 知识与 MCP:先判断需要哪一层事实
        • 前端本地调试
        • 后端运行时与流程调试
        • 模拟数据与测试数据
        • 集成测试与 E2E
        • 日志与链路追踪
        • 常见问题排查
      • 完整示例
        • 示例与案例总览
        • 项目侧边栏与工作区
        • 消息告警卡片
        • 计划表单任务清单
        • 驾驶舱动作与左侧面板
        • 最小后端插件
        • 最小全栈插件
        • 多宿主插件实战
        • 事故快处
        • 交通抓拍
        • 违停巡逻完整案例
      • 构建发布与安全
        • 构建、发布与安全
        • 质量门禁
        • 行业包构建与打包
        • 能力版本发布
        • 安装、升级与回滚
        • 安全基线
      • API参考
        • API 参考总览
        • 前端
          • 前端 API 参考
          • 前端插件清单结构
          • 前端 SDK API
          • 前端扩展点目录
          • 前端能力目录
          • 前端平台事件目录
          • 跨宿主通信服务 API
          • 工具链命令行参考(`fh2-plugin`)
        • 后端
          • 后端 API 参考
          • 后端插件源清单
          • 后端 HTTP 接口参考
          • 后端事件消费参考
          • 后端脚本上下文(`ctx`)
          • 后端数据存储
          • 流程编排语言
          • 流程触发器参考
          • 后端能力目录
          • 后端 HTTP API
        • 共享契约
          • 共享契约参考
          • 类型与契约目录
          • 错误模型
          • 版本兼容性
      • 附录
        • 错误码
        • 术语表
        • 常见问题
  1. 平台通用能力

WPMZ 与航线预览

这两个能力都由主应用提供、四个宿主可用,但职责不同:platform:wpmz 处理航线文件(KMZ/WPMZ)的解析和受控改写,platform:wayline-preview 在公共地图上画临时航线。清单分别声明 platform:wpmz、platform:wayline-preview 权限,await ctx.capabilities.get(...) 获取并判空。
fh2-plugin-sdk 是插件开发 SDK;下文模块名用于说明,实际导入路径保留生成工程配置。模块名不表示已发布的 npm 包名。

platform:wpmz:解析与改写航线文件#

const wpmz = await ctx.capabilities.get('platform:wpmz')
if (!wpmz) return
方法输入返回
parseCoordinates{ url, referenceAltitude? }Promise<readonly GeoPoint[]>
rewrite{ target: { projectId, waylineId }, changes: { missionConfig? } }Promise<{ waylineId, changed }>
parseCoordinates 下载 KMZ,读取 wpmz/waylines.wpml 中每个航点的坐标和 executeHeight。非法点会跳过;referenceAltitude 会加到每个点的高度上,但不会修改原文件。
rewrite 当前只允许改写 missionConfig:
finishAction?: 'no-action'|'go-home'|'auto-land'|'goto-first-waypoint'
rcLost?: { behavior: 'continue' } | { behavior: 'execute-action'; action: 'go-home'|'land'|'hover' }
takeOffReference?: { longitude; latitude; altitude; aglHeight? }
限制:
只接受计划表单生成的 TaskWayline 副本;改写后必须返回原 waylineId,返回新 ID 会被拒绝。
内容没有变化时返回 changed: false,不会上传。
旧 WPMZ 缺少起飞参考点节点时会被跳过(不会创建节点);finishAction 等必需节点缺失会失败。
下载 URL 受浏览器 CORS 和有效期影响。
计划表单内改写任务航线的推荐时机是 plan.form-extensions 的 onSubmit,不要在 validate 里产生副作用:
const wpmz = await ctx.capabilities.get('platform:wpmz')
await wpmz?.rewrite({
  target: {
    projectId: input.context.projectId,
    waylineId: input.form.wayline_uuid,
  },
  changes: { missionConfig: { finishAction: 'no-action' } },
})

platform:wayline-preview:地图上预览航线#

const preview = await ctx.capabilities.get('platform:wayline-preview')
if (!preview) return
方法输入返回
show{ points, startPosition, destination }句柄:update(input)、dispose()
destination 为 { position, kind: 'alert' | 'home' } | null:alert 用告警点图标,home 用返航点图标。
update() 替换整份输入,不是局部修改。
多个插件的预览会并存,没有"当前航线"仲裁;退出业务时记得 dispose()。
预览不会自动把地图视野对准航线,需要自己调 platform:map 的 recenter。
终点高度为 0 时会贴地显示。
调用要求全局地图已就绪,未就绪时保留无预览降级。

集成片段#

先按第一个前端插件建立可运行工程。下面不是完整的 fh2-plugin.json,不可整份替换:将 permissions 去重合并到现有清单,保留现有宿主扩展、界面声明/注册和入口。权限不会触发激活;清单若只有 extensions: [],activate() 不会执行。
合并到 fh2-plugin.json 的字段:
{
  "permissions": [
    "platform:http",
    "platform:wpmz",
    "platform:wayline-preview",
    "platform:map"
  ]
}
下面的 definePlugin 只示范入口逻辑组织,不是可直接替换完整工程的入口;保留生成工程的 SDK 导入路径,将能力逻辑合入已有 activate 和业务收尾,保留原有扩展贡献与界面注册。/incidents/current/route、可下载的 WPMZ 和已就绪的公共地图是业务前提。
// plugin.ts
import { definePlugin } from 'fh2-plugin-sdk'

interface RouteResponse {
  code: number
  data: {
    wpmzUrl: string
    start: { lng: number; lat: number; height: number }
    alert: { lng: number; lat: number; height: number }
  }
}

export default definePlugin({
  async activate (ctx) {
    const [wpmz, preview, map] = await Promise.all([
      ctx.capabilities.get('platform:wpmz'),
      ctx.capabilities.get('platform:wayline-preview'),
      ctx.capabilities.get('platform:map'),
    ])
    if (!wpmz || !preview) {
      ctx.logger.warn('航线解析或预览能力不可用')
      return
    }

    const response = await ctx.apiCall<RouteResponse>('/incidents/current/route')
    if (response.code !== 0) throw new Error('路线查询失败')
    const points = await wpmz.parseCoordinates({
      url: response.data.wpmzUrl,
      referenceAltitude: 12,
    })
    if (points.length < 2) throw new Error('WPMZ 中没有可预览的有效航点')

    const input = {
      points,
      startPosition: response.data.start,
      destination: {
        position: response.data.alert,
        kind: 'alert' as const,
      },
    }
    const handle = await preview.show(input)
    await map?.recenter({ points, padding: 48 })

    // 业务切换为返航时复用同一个预览句柄。
    async function showReturnRoute (returnPoints: typeof points) {
      await handle.update({
        points: returnPoints,
        startPosition: response.data.alert,
        destination: { position: response.data.start, kind: 'home' },
      })
      await map?.recenter({ points: returnPoints, padding: 48 })
    }
    ctx.logger.debug('返航预览更新函数已就绪', { callable: typeof showReturnRoute === 'function' })

    return {
      async dispose () {
        await handle.dispose()
      },
    }
  },
})

常见问题#

现象原因与处理
parseCoordinates 返回点很少非法航点会被跳过;检查 KMZ 内容是否完整
rewrite 被拒绝只接受计划表单生成的 TaskWayline 副本,且不能改变 waylineId
改写"成功"但文件没变内容无变化时返回 changed: false 并跳过上传,属正常行为
预览互相覆盖不会覆盖——多个预览并存;自行管理句柄的创建与释放
预览位置不在视野内预览不自动回中,配合 platform:map 的 recenter 使用
修改于 2026-10-22 07:06:53
上一页
项目设备能力
下一页
受控对象上传
Built with