1. 7 海图GIS平台开发
Shipxy
  • 船讯网API服务概述
  • 注册与创建应用
  • 多语言SDK引入
  • AI大模型接入MCP服务
  • 视频监控AI识别预警服务
    • 视频监控服务接入指南
    • 视频监控API服务说明
    • 视频监控场景应用指南
    • 视频监控服务FAQ与最佳实践
  • AI智能体应用
    • 运力资源智能体
    • 船舶风控智能体
    • 运输规划智能体
    • 航次时效预测智能体
    • 船舶安全监控智能体
    • 多式联运协同智能体
    • 大宗贸易态势分析智能体
  • 1 船舶查询
    • 1.1 船舶位置查询
      • 1.1.1 单船位置查询
      • 1.1.2 多船位置查询
      • 1.1.3 船队位置查询
    • 1.2 船舶模糊查询
      GET
    • 1.3 周边船舶查询
      GET
    • 1.4 区域船舶查询
      GET
    • 1.5 船舶船籍查询
      GET
    • 1.6 船舶档案查询
      GET
  • 2 港口查询
    • 2.1 港口信息查询
    • 2.2 港口当前靠泊船查询
    • 2.3 港口当前到锚船查询
    • 2.4 港口预抵船舶查询
  • 3 历史行为
    • 3.1 船舶历史轨迹查询
    • 3.2 船舶互相搭靠记录查询
  • 4 挂靠记录
    • 4.1 船舶历史挂靠记录
    • 4.2 船舶挂靠指定港口记录
    • 4.3 船舶当前挂靠信息
    • 4.4 港口挂靠历史船舶
  • 5 航线规划
    • 5.1 点到点航线规划
    • 5.2 港到港航线规划
    • 5.3 预计到达时间(ETA)查询
  • 6 天气气象
    • 6.1 新全球气象
      • 6.1.1 实时气象数据
      • 6.1.2 未来气象预报
    • 6.2 全球台风
      • 6.2.1 获取全球台风列表
      • 6.2.2 获取单个台风信息
    • 6.3 国内港口潮汐
      • 6.3.1 查询国内潮汐观测站列表
      • 6.3.2 查询单个观测站潮汐详情
    • 6.4 全球港口潮汐
      • 6.4.1 查询全球潮汐观测站列表
      • 6.4.2 查询单个观测站潮汐详情
    • 6.5 海区气象
    • 6.6 单点海洋气象
    • 6.7 历史气象记录
  • 7 海图GIS平台开发
    • 7.1 快速入门:从注册到接入
    • 7.2 地图引擎基础:地图控制与业务绘制
    • 7.3 船位展示服务
    • 7.4 历史轨迹服务
    • 7.5 图层与气象服务
    • 7.6 航线绘制与区域回放服务
    • 7.7 Vue项目接入指南
    • 7.8 API Key安全实践:后端代理接入
  • 8 海事数据
    • 8.1 航行警告查询
  • 9 监控推送
    • 9.1 监控船队管理
      • 9.1.1 创建船队
      • 9.1.2 更新船队信息
      • 9.1.3 查询船队
      • 9.1.4 删除船队
      • 9.1.5 船队船舶增加
      • 9.1.6 船队船舶批量更新
      • 9.1.7 船队船舶删除
    • 9.2 区域监控推送
      • 9.2.1 区域创建
      • 9.2.2 区域更新
      • 9.2.3 区域查询
      • 9.2.4 区域删除
      • 9.2.5 区域监控推送内容
    • 9.3 船舶航速提醒推送
      • 9.3.1 新增船舶订阅
      • 9.3.2 删除订阅船舶信息
      • 9.3.3 查询订阅船舶列表
      • 9.3.4 船舶航速异常推送
    • 9.4 实时船位推送
    • 9.5 船舶到离港事件推送
    • 9.6 船舶动态ETA推送
    • 9.7 船舶AIS信号消失事件推送
    • 9.8 船舶搭靠事件推送
  • 文档附录
    • 船舶类型对照表
    • 服务码返回说明
    • 海区对照表
    • 航行状态对照表
    • 绕航节点清单
    • 航标类型对照表
  1. 7 海图GIS平台开发

7.7 Vue项目接入指南

适用版本:ElaneMap H5 API 3.5
前置阅读:7.1-快速入门、7.2-地图引擎基础
适用读者:使用 Vue2 / Vue3 技术栈(vue-cli、Vite 等)的开发接入人员

一、为什么 Vue 项目需要特殊处理#

船讯网海图GIS平台 H5 API 3.5 是较早期版本的传统 JavaScript 库,具有以下特点:
1.
非 npm 包:没有发布到 npm,无法 npm install 后 import,只能通过 <script> 标签远程加载;
2.
全局命名空间:加载后挂载到 window 上,暴露 ShipxyAPI、Leaflet 全局对象 L,并依赖其自带的 jQuery;
3.
加载时序敏感:必须等脚本加载完成后才能 new ShipxyAPI.Map(...),而 Vue 组件的生命周期与脚本异步加载时序需要手动协调;
4.
非响应式对象:地图实例是命令式对象,不应放入 Vue 的响应式系统中,否则会产生性能问题甚至死循环。
因此 Vue 项目接入的核心思路是:在合适的生命周期时机动态加载脚本 → 创建地图实例并保存在非响应式变量中 → 组件销毁时正确释放资源。
下面给出三种接入方式,按推荐程度排序。

二、方式一(推荐):index.html 静态引入 + 组件封装#

适合密钥由运维统一管理的项目,最简单稳定。

2.1 在 index.html 中引入#

在 public/index.html(vue-cli / Vite 项目根目录的 index.html)的 <head> 中加入:
注意:密钥会出现在 index.html 中,属于前端明文,上线前请务必阅读《08-API Key安全实践》做域名绑定等防护。

2.2 封装地图组件 ShipxyMap.vue(Vue3 组合式 API 示例)#

2.3 在页面中使用#

2.4 Vue2 选项式 API 写法#


三、方式二:组件内动态加载脚本#

适合不想改动 index.html、或需要在多个密钥/环境间切换的场景。

3.1 封装脚本加载工具 loadShipxyApi.js#

3.2 在组件中使用#


四、方式三:密钥由后端下发(推荐用于生产环境)#

前端不硬编码密钥,先从自己的后端接口获取密钥,再动态加载 API。完整的安全方案见《08-API Key安全实践》,这里给出与方式二结合的骨架:
注意:密钥经后端下发到浏览器后仍然可见,此方式只解决"密钥不硬编码进代码仓库"的问题,不能替代域名绑定等防护措施,详见 08 篇。

五、Vue 接入的关键注意事项#

5.1 不要把地图实例放进响应式数据#

5.2 容器尺寸问题#

Vue 路由切换、弹窗(Dialog)内嵌地图时,容器可能在初始化瞬间还没有实际尺寸,导致地图渲染异常:
确保容器在 onMounted 时已有确定宽高(CSS 显式指定);
在弹窗/Tab 中使用时,等弹窗打开动画结束后再初始化地图,或调用 Leaflet 原生方法 map.invalidateSize() 强制重算尺寸。

5.3 路由切换与资源释放#

单页应用路由切换不会刷新页面,务必在 onBeforeUnmount(Vue3)/ beforeDestroy(Vue2)中:
1.
调用 map.remove() 销毁地图;
2.
清除业务服务的定时刷新(如船位服务的自动刷新依赖地图销毁,若自建了 setInterval 定时器也要一并 clearInterval);
3.
解除自定义事件监听。
否则反复进出页面会造成内存泄漏和重复请求。

5.4 jQuery 冲突#

API 自带的 jQuery 会挂载到 window.$。若项目自身也使用 jQuery(较少见),注意加载顺序,必要时用 jQuery.noConflict() 处理。Vue 项目本身不依赖 jQuery,一般无冲突。

5.5 类型提示(可选)#

TypeScript 项目中可声明全局类型,避免编辑器报错:

六、常见问题 FAQ#

Q1:控制台报 ShipxyAPI is not defined?
A:脚本尚未加载完成就初始化了地图。用方式二的 Promise 等待加载完成,或确认 index.html 中 script 标签位置正确且无网络拦截。
Q2:地图只显示灰色/蓝色背景,没有海图?
A:依次检查:容器是否有实际宽高;密钥是否替换为真实 Key(?k= 和 ak 两处);浏览器控制台是否有瓦片请求 403(密钥无效或未绑定域名)。
Q3:路由切走再切回来,地图空白或报错?
A:上次的地图实例没有被 remove(),同一容器重复初始化导致。检查 5.3 节的资源释放逻辑。
Q4:弹窗里的地图显示不全、瓦片错位?
A:容器尺寸在初始化后发生了变化,调用 map.invalidateSize()(Leaflet 原生方法)刷新。
Q5:Vue 的 devtools 变得很卡?
A:地图实例被放进了响应式系统,devtools 会尝试递归序列化它。按 5.1 节改为非响应式保存。
Q6:keep-alive 缓存的页面地图怎么处理?
A:keep-alive 场景组件不会销毁,改用 activated 中 map.invalidateSize() 恢复显示,deactivated 中可选择暂停船位自动刷新等业务定时器。
上一页
7.6 航线绘制与区域回放服务
下一页
7.8 API Key安全实践:后端代理接入