1. 课程导入与船舶航行数据认知
船舶在海上航行时,并不是"凭感觉"在走。驾驶台上的电子海图、雷达屏幕、自动舵,以及岸基的船舶交通管理中心,背后都依赖同一类东西——航行数据。理解这些数据从哪里来、长什么样、怎么被处理,是后续用 Python 做航行数据分析的起点。本节先建立整体认知,再动手搭好环境、加载一份示例数据做初步观察。
一、航行数据从哪里来
船上产生航行数据的设备可以按"测什么"来分类。最核心的是位置与运动信息:GPS 接收机给出经纬度、对地航速(SOG)和对地航向(COG);罗经(电罗经或磁罗经)给出船首向(Heading),注意它和 COG 不是一回事——有风流时船头指向与航迹方向会存在偏差;计程仪(Log)测量相对水的航速和累计航程,是推算船位和计算滑失的基础。其次是目标与环境信息:雷达探测周围物标,AIS(船舶自动识别系统)则通过 VHF 广播收发他船的识别码、位置、航向、船型等静态与动态信息,两者互补——AIS 看得远但依赖对方设备,雷达不依赖协作但受天气影响。此外还有测深仪、气象仪、GNSS 罗经等辅助设备。
这些设备的数据最终会汇聚到航行数据记录仪(VDR)、电子海图显示与信息系统(ECDIS)或综合驾驶台系统(IBS)。对数据分析而言,我们通常拿到的是这些系统导出的记录文件,而不是直接接设备。
二、常见数据格式
NMEA 0183 是航海设备间最通用的串口通信协议,以 ASCII 语句按行传输,每条语句以 $ 开头、以校验和结尾。例如一条常见的 GPS 定位语句:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
其中字段依次为 UTC 时间、纬度、南北半球、经度、东西半球、定位质量、卫星数、水平精度因子、海拔高度等。另一类 $GPRMC 语句则包含日期、SOG、COG。NMEA 的优点是设备通用、可读性强,缺点是字段位置固定、单位混杂(度分格式、节、米),解析时需要仔细处理。
CSV 是分析场景中最常见的落地格式,通常由 VDR 或岸基系统按固定时间间隔导出,每行一个时刻,列为时间戳、经纬度、SOG、COG、Heading 等,便于用表格工具和 pandas 直接读取。JSON 则多见于 AIS 数据服务平台或 Web 接口,字段带名称、支持嵌套,适合表达一条船的多层属性(如静态信息 + 动态位置数组)。三种格式各有适用场景,实际项目中经常需要互相转换。
三、从原始数据到可用结论的处理流程
一份原始航行记录往往不能直接拿来分析:可能有重复时间戳、经纬度跳变、字段缺失、单位不统一。典型处理链路是:读取 → 解析字段与单位 → 清洗异常与缺失 → 重采样/对齐时间 → 计算派生量(如航迹距离、转向率)→ 分析或可视化。下图把设备来源、格式与处理链路串在一起,帮助建立整体印象。
四、搭建 Python 环境并加载示例数据
建议使用 Python 3.10 及以上版本,创建独立虚拟环境,安装数据分析三件套与 NMEA 解析库:
python -m venv venv
# Windows: venv\Scripts\activate macOS/Linux: source venv/bin/activate
pip install pandas numpy matplotlib pynmea2
假设我们有一份示例 CSV 文件 sample_voyage.csv,字段为 timestamp,lat,lon,sog,cog,heading,时间间隔 1 秒,共约 3600 行(约 1 小时航程)。下面加载并做初步观察:
import pandas as pd
df = pd.read_csv("sample_voyage.csv", parse_dates=["timestamp"])
print(df.shape) # (3600, 6)
print(df.head(3))
print(df.isna().sum()) # 各列缺失数量
print(df.describe()) # sog/cog/heading 的分布与极值
观察时重点看几件事:时间是否连续(相邻时间差是否恒为 1 秒)、经纬度范围是否落在合理海域、SOG 是否出现异常大值(例如超过 30 节,对普通货船基本可判为跳变)、Heading 是否在 0~360 之间。若数据来自 NMEA 原始语句,则需逐行解析:
import pynmea2
with open("sample.nmea", encoding="ascii", errors="ignore") as f:
for line in f:
if line.startswith(("$GPGGA", "$GPRMC")):
msg = pynmea2.parse(line)
# msg.latitude / msg.longitude 已转为十进制度
print(msg.timestamp, msg.latitude, msg.longitude)
这一步的产出不是"跑通就行",而是要形成对数据的基本判断:这份数据能不能直接用于后续分析?缺失比例多高?是否存在需要剔除的异常段?把这些结论记下来,就是下一阶段清洗的依据。
五、典型应用场景
掌握上述流程后,可以支撑不少实际任务:航迹回放与复现、偏航与转向行为分析、航速与油耗关系建模、基于 AIS 与雷达数据的碰撞风险识别、自动生成航行报告等。它们的共同点是——都建立在"把原始记录变成干净、带派生量的结构化表"这一基础之上。本节搭好的环境和观察方法,会在后续章节反复用到。