MATLAB GUI构建一个AIS自动船舶系统

系统设计与实现思路

一个基本的AIS船舶显示系统,其数据处理和显示流程可参考以下步骤:
AIS数据输入
数据解析与解码
计算船舶图形与航向
更新地图显示
刷新船舶信息面板

关键实现步骤与代码

1. 设计GUI界面

MATLAB GUI主要包括图形控件和功能代码两部分。你可以使用GUIDE工具或appdesigner进行可视化设计。主要界面元素可参考:

  • 地图显示区域 :使用axes控件。
  • 船舶信息列表 :使用uitabellistbox控件。
  • 控制面板:包含"加载数据"、"开始/停止"等按钮。
2. AIS数据解析

AIS数据通常来自文件(如txt、xls)或串口/网络。数据解析是关键,你需要根据AIS报文格式提取船舶动态信息(位置、航向、速度等)和静态信息(船名、MMSI等)。

以下是一个解析AIS数据的函数框架,注意实际解析需根据AIS报文实际格式调整:

matlab 复制代码
function [ships] = parseAISData(filename)
    % 打开AIS数据文件
    fileID = fopen(filename);
    % 读取文件内容,具体方式需视文件格式而定
    C = textscan(fileID, '%f %f %f %f %f %f %f %f %f %f %f', 'Delimiter', ',');
    fclose(fileID);
    
    % 将解析后的数据赋值给ships结构体
    ships.MMSI = C{3};        % MMSI号码
    ships.latitude = C{9};    % 纬度
    ships.longitude = C{8};   % 经度
    ships.course = C{10};     % 航向
    ships.speed = C{6};       % 航速
    % ... 解析其他字段
end
3. 实现地图显示

绘制底图

  • 可以使用百度地图API(通过webmapwebread获取,需注意API调用权限变化),或加载本地地理信息数据。

  • 一个简易方法是使用一幅地图图片作为背景:

    matlab 复制代码
    % 在指定的axes控件中显示地图图片
    axes(handles.mapAxes);
    img = imread('map.jpg');
    imshow(img);
    hold on;

绘制船舶

船舶通常用箭头或简化图形表示,并根据航向旋转。以下函数计算船舶图形顶点:

matlab 复制代码
function [x1, y1, x2, y2, xs, ys, xs1, ys1, xs2, ys2, xs3, ys3] = drawboat(longitude, latitude, course, speed)
    % 根据船舶位置、航向和速度计算船舶图形的各个顶点坐标
    % 这里可以根据需要定义船舶图形的形状,例如一个箭头
    % 示例中返回了多个点的坐标,用于绘制船舶图形和航向线
    % ... 具体计算过程略,可参考相关资料实现 ...
end
4. 实现动态更新

为了实现船舶位置的动态更新,可以使用MATLAB的timer定时器对象。

初始化定时器(通常在GUI的OpeningFcn中):

matlab 复制代码
function AISshow_OpeningFcn(hObject, eventdata, handles, varargin)
    handles.output = hObject;
    % 创建定时器
    h = timer;
    handles.timerHandle = h;
    set(handles.timerHandle, 'ExecutionMode', 'fixedRate'); % 循环执行
    set(handles.timerHandle, 'Period', 0.5); % 定时间隔0.5秒
    set(handles.timerHandle, 'TimerFcn', {@updateDisplay, handles}); % 设置定时回调函数
    start(handles.timerHandle); % 启动定时器
    guidata(hObject, handles);

定时更新函数

matlab 复制代码
function updateDisplay(hObject, eventdata, handles)
    % 更新船舶位置索引
    global currentTimeIndex;
    currentTimeIndex = currentTimeIndex + 1;
    
    % 获取当前时刻的船舶数据
    % ...
    
    % 清除上一帧图形
    cla(handles.mapAxes);
    
    % 重新绘制底图
    % ...
    
    % 绘制所有船舶
    for i = 1:length(ships)
        % 计算船舶图形顶点
        [x1, y1, x2, y2, xs, ys, xs1, ys1, xs2, ys2, xs3, ys3] = ...
            drawboat(ships(i).longitude(currentTimeIndex), ...
                     ships(i).latitude(currentTimeIndex), ...
                     ships(i).course(currentTimeIndex), ...
                     ships(i).speed(currentTimeIndex));
        % 在mapAxes上绘制船舶
        plot(handles.mapAxes, [ships(i).longitude(currentTimeIndex), x1], ...
                              [ships(i).latitude(currentTimeIndex), y1], 'k');
        % ... 绘制船舶其他部分,参考的绘图方式
    end
    
    % 更新信息表格
    set(handles.infoTable, 'Data', {ships.MMSI; ships.longitude(currentTimeIndex); ...});
    
    % 强制刷新图形
    drawnow;
5. 添加交互功能
  • 船舶选择 :为图形对象添加ButtonDownFcn回调,点击船舶时显示详细信息。
  • 地图缩放和平移 :可利用zoompan功能。

参考代码 AIS自动船舶显示系统 www.youwenfan.com/csb/82510.html

注意

  1. 数据格式:AIS数据源格式可能存在差异,解析前需仔细分析其格式。
  2. 坐标转换:有时需要进行坐标系统转换(如WGS-84到UTM)以便在地图上准确显示。
  3. 性能优化:船舶数量多、更新频繁时,注意优化绘图和数据处理效率,避免界面卡顿。
  4. 定时器管理:在GUI关闭时,务必停止并删除定时器,释放资源。
相关推荐
方也_arkling20 小时前
【Java-Day08】static / final / 枚举
java·开发语言
风吹夏回21 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei1121 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_11221 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding21 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋921 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
xiaoshuaishuai821 小时前
C# 内存管理与资源泄漏
开发语言·c#
lsx2024061 天前
SVN 检出操作
开发语言
basketball6161 天前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++
旺仔来了1 天前
不联网的Linux下部署python环境
linux·开发语言·python