1. 文档附录
Shipxy
  • 船讯网API服务概述
  • 文档目录
  • 注册与创建应用
  • 多语言SDK引入
  • 标准API服务
    • 1 船舶查询
      • 1.1 船舶位置查询
        • 1.1.1 单船位置查询
        • 1.1.2 多船位置查询
        • 1.1.3 船队位置查询
      • 1.2 船舶模糊查询
      • 1.3 周边船舶查询
      • 1.4 区域船舶查询
      • 1.5 船舶船籍查询
      • 1.6 船舶档案查询
      • 1.7 档案服务扩展
    • 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后端代理接入
      • 7.9 坐标系转换指南
      • 7.10 私有化部署开发指南
        • 01 私有化地图加载绘制
        • 02 船舶与轨迹绘制实践
        • 03 气象图层效果绘制
    • 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 船舶搭靠事件推送
    • 文档附录
      • 船舶类型对照表
      • 服务码返回说明
      • 海区对照表
      • 航行状态对照表
      • 绕航节点清单
      • 航标类型对照表
      • 区域船二进制解析说明
      • 常见问题
  • AI智能体应用
    • AI大模型接入MCP服务
    • 智能体场景应用
      • 运力资源智能体
      • 船舶风控智能体
      • 运输规划智能体
      • 航次时效预测智能体
      • 船舶安全监控智能体
      • 多式联运协同智能体
      • 大宗贸易态势分析智能体
  • 视频监控AI识别预警服务
    • 视频监控服务接入指南
    • 视频监控API服务说明
    • 视频监控场景应用指南
    • 视频监控服务FAQ与最佳实践
  • 场景化开发示例
    • 大宗物流运输智能决策平台
      • 1、港口运力监控与找船
      • 2、船队货运跟踪与 ETA
      • 3、货运异常预警中心
      • 4、大宗航运态势分析与经营决策大屏
      • 5、航次时效预测与滞期费测算
      • 6、航次能效与碳强度管理
    • 海上设施安全监管与决策平台
      • 1、监管区域与事件推送(总览大屏)
      • 2、设施周边安全监控
      • 3、偏航识别与轨迹回放
      • 4、气象海况与航行警告
      • 5、海上安全态势监管大屏与执法效能分析
      • 6、水域通航密度与碰撞风险预测
      • 7、设施运维作业窗口智能排程与船舶调度
  1. 文档附录

区域船二进制解析说明

适用接口:GET https://api.shipxy.com/apicall/v3/GetAreaShip(区域船舶查询,output=0 即二进制 Base64 编码返回)
请求参数依据:船讯网官方在线文档《1.4 区域船舶查询》(https://apidocs.shipxy.com/475744022e0)
二进制结构依据:《船讯网 API 开发文档 V2》表 11「区域船舶返回结果-二进制」、表 58「8.2 详细数据」、附录 2 / 3 / 5
目标读者:需要对接二进制返回格式、将其反序列化为标准 AIS 船舶数据的后端研发人员

1. 接口概述#

1.1 接口功能#

区域船舶查询按照区域范围,一次请求该区域内的所有船舶 AIS 数据。可以传多个经纬度坐标点绘制任意多边形查询区域。单次请求的区域建议在 1°×1° 范围以内,这样单次请求即可全部返回数据;范围更大时可自行将区域切分成小区域请求,或使用 scode 分页获取剩余船舶(见 §1.4)。
服务规则与限制:
2 小时未上报数据的船舶不返回——此时无法判定船舶是否还在区域内;
JSON 格式单次约可返回 2600 条船,二进制格式单次约可返回 8000 条船;
使用本服务前需在船讯网控制台创建应用的 key 并联系商务开通权限;购买服务后会设定总的区域查询范围,每次请求的经纬度坐标都不能超出该范围,超出后无法返回数据;
如需更大范围或更高频率的数据,船讯网支持定制 TCP/IP、Kafka 等推送方式接入,可设定区域范围、船舶类型/长度/固定船队列表等筛选方式及推送频率,定制开通请联系商务。

1.2 请求地址与请求参数#

请求地址:GET https://api.shipxy.com/apicall/v3/GetAreaShip
参数类型必填说明
keystring必需船讯网授权码,验证服务权限。需在控制台创建并开通权限;官方文档示例中的 key 已绑定域名,直接使用会返回 status 14(来源域错误),请使用自己的 key
regionstring必需查询区域,经纬度逗号分隔、多个点减号分隔,格式 lng,lat-lng,lat-lng,lat。规则:① 多个坐标点必须按顺时针或逆时针依次输入;② 坐标点必须超过 2 个(2 个点只能连一条线,无法划分区域);③ 必须按先经度后纬度顺序输入;④ 区域不可超出分配的权限范围;⑤ 权限范围内可根据场景自行拆分多个小区域分别请求
data_typeinteger可选数据返回类型:0 仅船舶;1 仅航标;2 仅网位仪;3 船舶+航标;4 船舶+网位仪;5 船舶+航标+网位仪。默认 0
outputinteger可选输出数据格式:0 为二进制 Base64 编码,1 为 JSON 格式,默认 1。注意:当返回数据带有航标或网位仪时(data_type ≠ 0),output 只能是 JSON
scodeinteger可选查询某一区域的会话令牌。区域较大、数据过多无法单次返回时,使用首次请求返回的 scode 再次请求剩余数据,详见 §1.4
请求调用示例:
https://api.shipxy.com/apicall/v3/GetAreaShip?key=<你的key>&region=121.289063,35.424868-122.783203,35.281501-122.167969,33.979809&output=0

1.3 返回格式选择(output 参数)#

output格式说明
0二进制 Base64紧凑、单次可容纳约 8000 艘船,需按本文档反序列化;仅支持纯船舶数据(data_type=0)
1(默认)JSON字段名可直接读,单次约 2600 艘,字段语义与二进制完全一致;含航标/网位仪时只能选此格式
两种格式承载同一套逻辑字段(8.2 详细数据表定义),二进制格式只是去掉了字段名、按固定规则紧凑打包。研发联调阶段建议先抓一份 output=1 的 JSON 响应与二进制解析结果比对核验。

1.4 大数据量分页(scode 与 continue)#

HTTP 请求单次返回的数据最大为 2666 条船;超出部分需使用首次查询时返回的 scode 再次发起请求;
使用 scode 翻页时查询区域不可变动,否则会生成一个新的查询记录;
关注返回结果中的 continue 字段:为 0 时代表区域内全部船舶数据已经查完,无需再请求;为 1 时代表还有剩余数据,填入 scode 继续请求;
二进制格式下,scode 在公共头第 15–18 字节返回(见 §3),count 为本次返回的船舶条数。

1.5 二进制记录版本说明#

二进制记录存在 v=2 / v=4 两个版本:v=4 在 v=2 基础上额外返回 cnname(中文船名)与 newtype(新船舶类型,附录 5)两个字段,记录中相应多出 newtype 定长字段与 cnname 变长字符串。本文档的记录布局按 v=4 描述(样例数据即 v=4 格式);对接 v=2 时按 §4.3 的说明裁剪即可。

2. 响应整体结构#

外层 HTTP 响应体是 JSON,data 字段为 Base64 字符串,解码后才是真正的二进制负载:
HTTP Response Body (application/json)
└── { "status": 0, "msg": "", "data": "<Base64>" }
        └── base64 decode
            └── Binary Payload
                ├── 公共头 23 字节
                └── 船舶记录 × count(变长,紧密排列,无分隔符)
status:数据返回状态,0 表示成功,其他值见官方附录 1;
msg:状态描述;
data:Base64 编码的二进制负载。
样例数据规模:二进制 27 759 字节,公共头声明船舶数 271,实测逐条解析 271/271 条全部成功、结束偏移与总长精确吻合。

3. 公共头(23 字节)#

依据官方表 11,Base64 解码后的前 23 字节为公共头:
偏移字节类型字段说明
04u32 LEdataLength数据包长度(样例 27753 = 总长 27759 − 6)
42u16 LEdataType数据包类型(样例 0)
61u8保留字节样本中恒为 0x00
78i64 LEserviceTime服务器当前时间,unix 秒(样例 1789441918 = 2026-09-15 11:11:58 北京时间)
154u32 LEscode会话令牌,客户端需保存并在下次请求时回传
194u32 LEcount船舶数量(样例 271)
官方表 11 依次列出 dataLength、dataType、serviceTime、scode、船舶数五个字段;实测样本在 dataType 与 serviceTime 之间存在 1 个保留字节,即记录区从偏移 23 开始。解析时建议做双重校验:count 与实际解出的记录数一致,且最后一条记录的结束偏移等于 len(buf)。

4. 船舶记录结构(stShipDetail)#

记录区紧跟公共头,每条记录对应一艘船,变长(样例 72–132 字节,平均约 102 字节),依次紧密排列,无长度前缀、无分隔符——记录长度由内部变长字段自然累加得出,这也是二进制格式紧凑的原因。字段顺序与官方表 58 一致:

4.1 记录布局总览#

┌─────────────── 定长段 24 字节 ───────────────┬────── 变长字符串段 ──────┬─ 尺寸 ─┬─ dest ─┬─ eta ─┬─ 动态尾段 26 字节 ─┐
│ ShipID u64 │ From u32 │ MMSI u32 │ shiptype │ newtype │ imo u32 │ name │ cnname │ callsign │ L/W/LF/TR/DR │ dest │ eta[4] │ navistat…lasttime │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

4.2 字段明细表#

#偏移类型字段官方定义(表 58)样例值
①0u64ShipID船舶 ID(与 MMSI 相同)412302277
②8u32From数据来源:0 岸基 AIS,1 卫星 AIS0
③12u32MMSI船舶 MMSI,9 位数字412302277
④16u16shiptype船舶类型,见附录 230(捕捞)
⑤18u16newtype新船舶类型(v=4 返回),见附录 512(渔船)
⑥20u32imoIMO 号,7 位;0 = 未提供,2147483647 = 无效值0
⑦24u16 len + UTF-8name船舶名称SUGANYUYUN02277
⑧变长u16 len + UTF-8cnname中文船名(v=4 返回,部分船舶为空)苏赣渔运02277
⑨变长u16 len + UTF-8callsign船舶呼号,4–5 位数字或字母,中国籍船舶以 B 开头02277
⑩变长5 × u16length / width / left / trail / draught船长、船宽、左舷距、尾距(分米);吃水(毫米)380 / 80 / 40 / 120 / 0
⑪变长u16 len + UTF-8dest目的地(AIS 设备原始输入,可能为空或无意义内容)"0"
⑫变长4 × u8eta预到时间,[MM][DD][HH][MM] 逐字节存放01 01 01 01
⑬变长u16navistat航行状态,见附录 3;255 = 无数据255
⑭+2i32lat纬度,1/1000000 度,[-90000000, 90000000]34400077
⑮+6i32lon经度,1/1000000 度,[-180000000, 180000000]121917450
⑯+10u16hdg船首向,1/100 度,[0, 35900];超上限即无数据51100(无数据)
⑰+12u16cog航迹向,1/100 度,[0, 35990];超上限即无数据16580
⑱+14u16sog对地航速,毫米/秒,[0, 52576](即 0–52.576 m/s,约 0–102 节)977
⑲+16i16rot转向率,1/100 度/秒,[-1200, 1200],顺时针为正;32767 = 无数据0
⑳+18i64lasttime数据更新时间,unix 时间戳(秒)1789440605
偏移量:①–⑥ 为记录内绝对偏移(0–23);⑦–⑫ 变长顺次累加;⑬–⑳ 为动态尾段内相对偏移,尾段共 26 字节固定长度。

4.3 对接 v=2 版本的裁剪#

v=2 记录相比 v=4:无 newtype(⑤,2 字节)、无 cnname(⑧变长串)。对接 v=2 时删去这两项即可,其余完全一致。判断依据:下发二进制数据时服务端使用的记录版本。

4.4 关键编码规则#

字节序:所有多字节整数均为小端序(little-endian)。
字符串:UTF-8 编码,无 NUL 终止符,前置 u16 长度前缀(字节数,非字符数)。
定点数:全程不使用 IEEE-754 浮点,坐标 /1e6、角度 /100、sog /1000(米/秒)、rot /100、尺寸 /10(米)、吃水 /1000(米)。
有符号性:lat、lon、rot、lasttime、serviceTime 为有符号整数,其余为无符号。跨南北纬、东西经区域 lat/lon 出现负值,务必按有符号解析。
时间:lasttime / serviceTime 为 unix 秒时间戳,转北京时间 +8 小时。

4.5 无数据标识与处理约定#

部分 AIS 船载设备未上报某些字段,二进制中按官方约定的标识值填充。建议统一转换为 null(Python None),避免输出负数之类的非物理值:
字段标识值出现原因处理建议
hdg / cog> 35900 / > 35990(常见 51100)AIS 缺省航向 511°(ITU-R M.1371 规定)输出 null
rot32767设备未上报转向率输出 null
navistat255设备未上报航行状态输出 null
imo0 或 2147483647未提供 / 无效值输出 null
eta全 0、01-01 00:00、01-01 01:01,或月/日/时/分超出合法范围AIS 设备未设置 ETA 时的缺省填充输出 null
draught / length 等0设备未上报按实际值 0 输出或上层判空
样例统计(271 条):hdg 无数据 190 条、rot 无数据 108 条、navistat 无数据 227 条、eta 未设置 221 条——渔船及小型船设备上报不全属于常态,业务侧必须按「字段可能缺失」设计。

5. 完整解析代码(Python 3.10+)#

枚举字典 SHIPTYPE_NAMES / NEWTTYPE_NAMES / NAVISTAT_NAMES 的完整内容见附录 A/B/C;含命令行入口的完整可运行代码见 §9 附录。

6. 解析结果样例(真实样本节选)#

输入样例:27 759 字节二进制、271 条记录(2026-09-15 连云港附近海域)。

6.1 记录样例 1(渔船,v=4 含中文船名)#

{
  "mmsi": 412302277,
  "data_source": 0,
  "shiptype": 30,
  "shiptype_name": "捕捞",
  "newtype": 12,
  "newtype_name": "渔船",
  "imo": null,
  "name": "SUGANYUYUN02277",
  "cnname": "苏赣渔运02277",
  "callsign": "02277",
  "length_m": 38.0,
  "width_m": 8.0,
  "left_m": 4.0,
  "trail_m": 12.0,
  "draught_m": 0.0,
  "dest": "0",
  "eta": null,
  "navistat": null,
  "navistat_name": "未知",
  "lat": 34.400077,
  "lon": 121.91745,
  "hdg": null,
  "cog": 165.8,
  "sog_ms": 0.977,
  "sog_kn": 1.9,
  "rot": 0.0,
  "last_time_utc": 1789440605,
  "last_time": "2026-09-15 10:50:05"
}
典型渔船记录:imo / eta / navistat / hdg 未上报(null),位置与航速正常。

6.2 记录样例 2(集装箱船,全字段上报)#

{
  "mmsi": 477832300,
  "data_source": 0,
  "shiptype": 100,
  "shiptype_name": "集装箱",
  "newtype": 3,
  "newtype_name": "集装箱船",
  "imo": 9484390,
  "name": "COSCO VALENCIA",
  "cnname": "",
  "callsign": "VRLY7",
  "length_m": 261.0,
  "width_m": 32.0,
  "left_m": 10.0,
  "trail_m": 68.0,
  "draught_m": 10.3,
  "dest": "CN ZOS",
  "eta": "09-16 09:00",
  "navistat": 0,
  "navistat_name": "在航(主机推动)",
  "lat": 34.935742,
  "lon": 121.640362,
  "hdg": 206.0,
  "cog": 134.9,
  "sog_ms": 0.514,
  "sog_kn": 1.0,
  "rot": 0.01,
  "last_time_utc": 1789440881,
  "last_time": "2026-09-15 10:54:41"
}
商船全字段上报:IMO、ETA(次日 09:00)、航行状态(在航)齐全;hdg=206.0° 与 cog=134.9° 差异大是该船正在转向/掉头(rot=0.01°/s),属正常现象。

7. 对接注意事项#

1.
首条记录从偏移 23 开始:dataType 之后有 1 个保留字节,直接从偏移 7 读 serviceTime 会错位。正确做法:serviceTime @7、scode @15、count @19、记录区 @23。
2.
记录无分隔符,靠链式推进:从偏移 23 起按字段表逐条解析,上一条的结束位置即下一条的开始位置;解析完 count 条后校验结束偏移是否等于总长,不等说明结构理解有误(此时应优先检查是否漏/多读了 v=4 的 newtype 或 cnname)。
3.
不要用模式匹配扫 MMSI 定边界:MMSI 是 9 位数字但渔船 MMSI 前缀多样(102/412/413…),字符串内容也可能恰好构成合法 MMSI,模式扫描存在漏检与误检风险;链式解析天然无此问题。
4.
无数据字段输出 null,不要输出 -1 或原样标识值:船速、航向等物理量非负,输出负数会污染下游统计;统一转 null 后由业务侧判空。
5.
eta 缺省识别:00-00 00:00、01-01 00:00、01-01 01:01 以及非法日期(如 11-31)均为设备未设置,应输出 null,不要当真实到港时间入库。
6.
dest 为设备自由输入文本:样例中大量出现 "0"、"11"、"13 B#" 等无意义内容,不能直接当港口名;需要标准港口时应使用 JSON 格式(output=1)返回的 dest_std / destcode(由船讯网港口库标准化),二进制格式不含这两个字段。
7.
大区域记得用 scode 翻页:单次请求最多返回 2666 条船,超出后把本次返回的 scode(二进制在公共头 @15)填入下次请求继续拉取剩余船舶;翻页期间 region 必须保持原样,直到 continue=0 表示区域内全部查完。
8.
lasttime 与 2 小时规则:官方规则为 2 小时未上报的船不返回,lasttime 可作为数据新鲜度依据;样例 lasttime 最老 24 小时内(卫星通道数据时间跨度更长)。
9.
字符串长度前缀是 u16:单字段理论最长 65535 字节,实际船名/目的地远短于此;解析时仍建议对异常长度(如 > 256)做防御性校验。
10.
样本分布特征:渔船占多数时 hdg/navistat/eta 的无数据比例很高(本样例约 70–80%),属于船载设备上报能力差异,不代表接口异常。

8. 附录#

附录 A:船舶类型(shiptype,附录 2 摘录)#

编号类型编号类型
20–29地效应船50引航船
30捕捞51搜救船
31拖引52拖轮
32拖引且船长>200m或船宽>25m53港口供应船
33疏浚或水下作业54载有防污染装置和设备的船舶
34潜水作业55执法艇
35参与军事行动56–57备用(当地任务分配)
36帆船航行58医疗船
37娱乐船59符合 18 号决议(Mob-83)的船舶
40–49高速船60–69客船
70–79货船80–89油轮
90–99其他类型的船舶100集装箱

附录 B:新船舶类型(newtype,附录 5 摘录)#

编号类型编号类型
1散货船8滚装船
2杂货船9其它货船(shiptype 70–79)
3集装箱船(对应 shiptype=100)10其它油船(shiptype 80–89)
4油船11客船(shiptype 60–69)
5化学品船12渔船(shiptype=30)
6LNG13拖轮/引航船(shiptype 50/52)
7LPG99其它

附录 C:航行状态(navistat,附录 3 摘录)#

编号状态编号状态
0在航(主机推动)8靠帆船提供动力
1锚泊9保留(HSC 航行状态修正)
2失控10保留(WIG 航行状态修正)
3操纵受限11–14保留(将来使用)
4吃水受限15未定义,缺省
5靠泊255无数据(非官方枚举,实测样本出现)
6搁浅
7捕捞作业

附录 D:单位换算速查#

原始字段原始单位换算常用单位
lat / lon1/1000000 度÷ 1e6度(WGS84)
hdg / cog1/100 度÷ 100度
sog毫米/秒÷ 1000(× 1.943844)米/秒(节)
rot1/100 度/秒÷ 100度/秒
length / width / left / trail分米÷ 10米
draught毫米÷ 1000米
lasttime / serviceTimeunix 秒+8h(北京时)日期时间

9. 附录:完整解析器代码(shipxy_binary_parser.py)#

以下为完整可运行版本(含枚举字典与命令行入口),可直接复制保存为 shipxy_binary_parser.py 使用,271/271 条样例实测通过:
说明:为与文档对外发布版本保持一致,命令行入口仅保留基础演示输出(公共头 + 3 条记录样例);统计验证逻辑可在此基础上按需扩展。

本文档请求参数依据船讯网官方在线文档《1.4 区域船舶查询》(https://apidocs.shipxy.com/475744022e0)。
上一页
航标类型对照表
下一页
常见问题