news 2026/4/20 13:11:18

免费获取船舶轨迹数据?手把手教你从中国海洋卫星数据网站下载AIS数据(附Python处理脚本)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
免费获取船舶轨迹数据?手把手教你从中国海洋卫星数据网站下载AIS数据(附Python处理脚本)

从零获取船舶轨迹数据:中国海洋卫星数据网站全流程指南与Python自动化处理

清晨的海港,数以万计的船舶正在全球航线上穿梭。这些钢铁巨兽的每一次移动,都在AIS系统中留下数字足迹——而今天,我们将解锁这些宝贵数据的免费获取方式。不必再为商业平台高昂的数据订阅费发愁,中国海洋卫星数据网站提供了完整的船舶轨迹信息,只需掌握正确方法,就能将这些数据转化为研究或商业分析的金矿。

1. 认识AIS数据与免费获取渠道

船舶自动识别系统(AIS)是现代航运的神经末梢,每艘超过300吨的商船都强制安装这种广播应答器。它持续发射船舶的"数字身份证":包括MMSI识别码、经纬度位置、航速航向、吃水深度等关键信息。这些实时数据对于海事安全、物流优化、渔业监管等领域具有不可替代的价值。

商业AIS数据平台通常采用订阅制收费,单次查询可能就需要数百元。而中国海洋卫星数据网站(https://osdds.nsoas.org.cn/#/)作为国家级数据开放平台,提供了完全免费的HY系列卫星AIS数据下载服务。其L1A级产品包含以下核心字段:

字段名数据类型说明
MMSI字符串船舶唯一识别码
时间戳日期时间UTC格式的定位时间
经度浮点数WGS84坐标系
纬度浮点数WGS84坐标系
航速浮点数节(knots)
航向整型0-359度

提示:L1A数据已经过初步质量控制和格式标准化,适合大多数分析场景。更高级别的L2产品包含传感器原始数据,需要专业处理能力。

2. 数据获取全流程拆解

2.1 账户注册与审批

首次访问中国海洋卫星数据网站时,需要完成实名认证注册:

  1. 点击首页右上角"注册"按钮,填写机构邮箱(个人可用.edu或工作邮箱)
  2. 上传身份证正反面扫描件(需小于2MB)
  3. 填写详细的研究用途说明(200字以上通过率更高)

审批通常需要1-3个工作日,遇到节假日可能延长。如果超过5天未收到激活邮件,建议:

# 查询审批状态的建议邮件模板 主题:AIS数据使用申请审批进度查询(申请号:XXXXXX) 尊敬的平台管理员: 您好!我于YYYY-MM-DD提交了AIS数据使用申请(申请号XXXXXX), 目前尚未收到审批结果。能否协助确认审批进度? 此致 敬礼 [您的姓名] [联系方式]

2.2 高效数据检索技巧

登录后,按以下路径获取数据:

  1. 导航栏选择"数据获取"→"海洋水色卫星数据"
  2. 时间范围选择建议不超过30天(大数据量需分批次)
  3. 产品类型勾选"HY-1C/D L1A"
  4. 地理范围可通过地图框选或输入经纬度

注意:批量选择时,网站存在页面自动刷新的问题。建议每次勾选5-10个文件后,立即点击"加入订单"按钮,避免重复操作。

2.3 下载加速方案

审批通过后,订单页面会生成多个.tar.gz压缩包链接。传统浏览器下载大文件容易中断,推荐以下两种方案:

方案一:DownThemAll插件(Firefox)

  1. 安装插件后右键订单页面
  2. 选择"用DownThemAll下载所有链接"
  3. 设置并发线程数为5(避免被封IP)

方案二:Python自动化脚本

import requests from concurrent.futures import ThreadPoolExecutor def download_file(url, save_path): with requests.get(url, stream=True) as r: r.raise_for_status() with open(save_path, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) urls = [ 'https://example.com/data1.tar.gz', 'https://example.com/data2.tar.gz' ] # 替换为实际下载链接 with ThreadPoolExecutor(max_workers=3) as executor: for i, url in enumerate(urls): executor.submit(download_file, url, f'ais_data_{i}.tar.gz')

3. 数据预处理实战

3.1 解压与文件整理

下载得到的.tar.gz文件需要二次解压。这个Python脚本可自动处理整个目录:

import tarfile import os from pathlib import Path def batch_extract(input_dir, output_dir): Path(output_dir).mkdir(exist_ok=True) for file in Path(input_dir).glob('*.tar.gz'): print(f'Processing {file.name}...') with tarfile.open(file) as tar: tar.extractall(output_dir) # 使用示例 batch_extract('downloads/', 'extracted/')

解压后的文件结构通常为:

20230101_HY1C/ ├── HY1C_20230101_0010.L1A ├── HY1C_20230101_0020.L1A └── ...

3.2 关键字段提取

AIS报文有27种类型,我们主要处理以下三类:

  • Type1/3:位置报告(含速度、航向)
  • Type5:静态信息(船舶尺寸、类型)
  • Type27:长距离位置报告

这个Pandas脚本提取指定船舶的轨迹:

import pandas as pd from datetime import datetime def process_ais_file(input_file, mmsi): df = pd.read_csv(input_file, header=None) df = df[df[5] == mmsi] # 筛选特定船舶 records = [] for _, row in df.iterrows(): msg_type = row[4] timestamp = datetime.strptime(row[1], '%Y-%m-%d %H:%M:%S') if msg_type in ['1', '3']: records.append({ 'time': timestamp, 'speed': float(row[9]), 'lon': float(row[11]), 'lat': float(row[12]) }) elif msg_type == '27': records.append({ 'time': timestamp, 'speed': float(row[12]), 'lon': float(row[10]), 'lat': float(row[11]) }) return pd.DataFrame(records).sort_values('time') # 示例:处理单个文件 trajectory = process_ais_file('HY1C_20230101_0010.L1A', '123456789') trajectory.to_csv('ship_123456789.csv', index=False)

4. 高级分析与可视化

4.1 轨迹密度热力图

使用GeoPandas和Matplotlib绘制航线热点:

import geopandas as gpd import matplotlib.pyplot as plt from shapely.geometry import Point # 创建GeoDataFrame geometry = [Point(xy) for xy in zip(trajectory.lon, trajectory.lat)] gdf = gpd.GeoDataFrame(trajectory, geometry=geometry, crs="EPSG:4326") # 转换为Web墨卡托投影 gdf = gdf.to_crs("EPSG:3857") # 生成热力图 fig, ax = plt.subplots(figsize=(12, 8)) ax.set_title('船舶轨迹密度分析', fontsize=16) gdf.plot(ax=ax, markersize=2, alpha=0.5, column='speed', cmap='hot_r', legend=True) plt.tight_layout() plt.savefig('heatmap.png', dpi=300)

4.2 停泊事件检测

通过速度变化识别靠港行为:

def detect_anchorage(df, speed_threshold=1, min_duration='4H'): # 标记低速点 df['is_stopped'] = df['speed'] < speed_threshold # 合并连续低速段 df['group'] = (~df['is_stopped']).cumsum() # 计算停泊时长 stoppages = df[df['is_stopped']].groupby('group').agg({ 'time': ['min', 'max', 'count'], 'lon': 'mean', 'lat': 'mean' }) stoppages['duration'] = stoppages[('time', 'max')] - stoppages[('time', 'min')] # 筛选有效停泊 return stoppages[stoppages['duration'] > pd.Timedelta(min_duration)] anchorage_events = detect_anchorage(trajectory) print(f"检测到{len(anchorage_events)}次停泊事件")

4.3 轨迹平滑与异常值处理

原始AIS数据可能存在噪声,使用Savitzky-Golay滤波器进行平滑:

from scipy.signal import savgol_filter def smooth_trajectory(df, window_size=15, poly_order=3): df = df.sort_values('time') # 应用滤波器 df['lon_smoothed'] = savgol_filter(df['lon'], window_size, poly_order) df['lat_smoothed'] = savgol_filter(df['lat'], window_size, poly_order) # 计算修正距离 from geopy.distance import geodesic df['correction_m'] = df.apply( lambda r: geodesic((r['lat'], r['lon']), (r['lat_smoothed'], r['lon_smoothed'])).m, axis=1 ) return df smoothed = smooth_trajectory(trajectory) print(f"最大位置修正:{smoothed['correction_m'].max():.2f}米")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 13:02:50

基于序列化宏编译的游戏技能自动化系统

基于序列化宏编译的游戏技能自动化系统 【免费下载链接】GSE-Advanced-Macro-Compiler GSE is an alternative advanced macro editor and engine for World of Warcraft. 项目地址: https://gitcode.com/gh_mirrors/gs/GSE-Advanced-Macro-Compiler GSE-Advanced-Macr…

作者头像 李华
网站建设 2026/4/20 13:01:06

Zephyr OS:从内核裁剪到应用部署,构建物联网设备的一站式RTOS指南

1. Zephyr OS入门&#xff1a;为什么选择这个物联网RTOS&#xff1f; 第一次接触Zephyr OS是在2018年一个智能手环项目上。当时我们需要一个能在256KB内存的Cortex-M4芯片上流畅运行的操作系统&#xff0c;试遍了市面上各种RTOS后&#xff0c;最终被Zephyr的模块化设计所吸引。…

作者头像 李华
网站建设 2026/4/20 13:00:18

华为eNSP实战:从零构建Eth-Trunk链路聚合网络

1. 为什么企业网络需要Eth-Trunk链路聚合&#xff1f; 记得去年给一家电商公司做网络升级时&#xff0c;他们的客服系统经常在促销期间卡顿。排查后发现核心交换机的千兆上行链路已经跑满了&#xff0c;但暂时又没法全部更换万兆设备。这时候&#xff0c;Eth-Trunk技术就成了性…

作者头像 李华