基于Qt的电子海图研究与实现(上)

发布时间:2012-11-27 阅读量:2346 来源: 发布人:

【导读】本文是在电子海图显示与信息系统应用越来越广泛的趋势下,结合中国船舶工业集团船舶系统工程部研制的某型号电子海图系统功能尚需完善的实际情况,在Linux系统下,对基于Qt的ECDIS,特别是航线设计、航行监控及海图显示等方面进行设计与实现。

相关阅读:基于Qt的电子海图研究与实现(下)

电子海图显示与信息系统配备高分辨率的彩色显示屏,为综合导航系统提供人机交互界面,它能够将航海地理信息与地理要素信息以海图的形式显示出来,是整个综合导航系统的重要组成部分。ECDIS的出现使得航海作业模式发生了巨大的变化,它极大地减轻航海作业人员的劳动强度,与船舶自动化系统配合使用,ECDIS能够让航行实现自动化。

Qt是一个跨平台的C++应用程序开发框架,广泛用于GUI程序开发。Qt提供了丰富的应用程序接口(API),可以建立艺术级的图形用户界面;Qt使用类型安全的信号/槽机制代替回调函数,使得各个元件之间的协同工作变得十分简单;Qt独有的项视图模式可以非常简单地实现海图元素显示。当前,Linux作为一种主流操作系统,不仅性能卓越,而且有着完备的软件开发工具和广泛的硬件厂商支持,在安全方面也十分出色。正是基于以上种种优点,本课题最终选择在Linux系统下开发基于Qt的电子海图。

本文对电子海图重要模块的实现原理及过程进行了分析。对于电子海图来说,最重要的功能就是状态监控、船舶导航以及信息显示,这一过程涉及到航线设计模块、监控模块和显示模块等。最后详细阐述了系统的开发过程,包括环境的搭建,Qt的GUI开发方法及系统程序的整体设计。
 
电子海图显示与信息系统概述

在现代渔业生产和航运业中,保证航行安全非常重要,GPS(全球卫星定位系统)、雷达/ARPA(自动标绘雷达)以及INMARSAT(国际移动卫星通讯系统)等已被广泛使用,而电子海图显示和信息系统(electronic chart display and information system,ECDIS)的应用提高了船舶驾驶自动化的程度,也保障了船舶航行的安全。与简单的纸海图相比,电子海图系统含有更多的地理和文字信息,且使用简单,操作容易。电子海图具有自动判定功能,能够快速定位碍航物、导航标志及图示物标等物体的位置,对航行安全有重要意义。
[member]
电子海图系统是一种能够把需要向航海人员显示和解释的各种信息融合成一体的实时导航系统,被认为是继雷达/ARPA之后在船舶导航方面又一项伟大的技术革命。ECDIS已充分证明其在动态目标处理及实时信息显示方面的强大能力,具有传统海图无法比拟的优点,国际水道组织早已意识到现代航海对ECDIS的需求,相关技术也在上世纪末被开发出来。通常所指的“电子海图”是一个很模糊的概念,各种数字式的海图及其应用系统一般被统称为电子海图。目前,电子海图包括以下几方面内容。

1、电子航海图(electronic nautical / navigational chart,ENC)。ENC是国家官方机构发布、专门供ECDIS使用且符合国际标准的数据库。ENC除了包含有安全航行所必需的海图信息,此外还可能含有港口概况、航路指南等其它有用信息。其数据格式主要有栅格方式和矢量方式两种。

2、电子海图(electronic chart,EC)。主要是指非标准的数字式海图。通常用于专业的应用系统,其显示方式、数据格式和表示内容均可以由设计者自行定义。

3、电子海图系统(electronic chart system,ECS)。与EC类似,ECS是指各种非标准的电子海图应用系统,一般应用于一些专业领域。

4、电子海图显示与信息系统(electronic chart display and information system,ECDIS)。ECDIS是电子海图的核心内容,专指符合相关国际标准的电子海图系统。它以电子航海图(ENC)为基础,以计算机为核心,连接测深、定位、雷达等设备,综合反映船舶的航行状态参数,为驾驶人员提供信息查询、量算和航海记录等工具,属于专题地理信息系统。

国内外电子海图发展现状

国外发展现状

ECDIS是伴随着计算机技术、地理信息技术、卫星定位技术和航海技术的发展而兴起的一项新技术,始于二十世纪七十年代,自二十世纪九十年代开始得到迅速发展。从本质上讲,ECDIS是一种能够同时显示导航信息和海图信息的自动化导航系统。在计算机的控制下,它能够进行集中处理雷达信息、海图信息、船位信息及船舶动态参数等数据,以图文与视听的方式综合表现各种复杂的航海形貌。自问世以来,ECDIS已经引起了很多国家的极大兴趣,其保证航行安全的特点越来越为人们所认可,产业化的步伐及产品的更新速度也正在加快。

目前,国际海事组织(IM0)、国际海道测量组织(IH0)和国际电工委员会(IEC)是与电子海图密切相关的三个国际组织,ECDIS的各种标准和规范均已确立,如海图内容与显示规范(S-52)、海图数据传输交换标准(S-57)、 IMOPS性能标准及 IEC61174规范等。

目前,在一些拥有先进技术的发达国家中,ECDIS的研究与开发己经取得了显著的成果,如日本、美国等国已经拥有了领先几代的ECDIS系统,尤其在日本,大多数商船和渔船都装备了不同复杂程度的设备;此外,英国、法国、俄罗斯、德国、挪威、荷兰等国家也在积极研究各种新型的ECDIS产品。目前,从ECDIS的功能、已销售的产品数量、海图信息的提供和更新等方面看,全球最具实力的ECDIS产品有以下几种:德国STN Atlas Electronik公司研制的ChartPilot型导航工作站,英国Transas Marine公司的Navi-Sailor2400型ECDIS,英国Racal-Ceeea公司的Chart Master CM500型ECDIS等。

国内发展现状

在国内,由于科技技术的发展和国外相比有些落后,另外电子海图技术的研究工作起步也稍晚,我国的电子海图技术水平和西方国家相比存在差距,不过,目前我国也在电子海图的显示、应用技术研究和船舶航行信息处理等方面取得了一些可喜的成果和经验。交通部、相关的科研院所和一些海军院校己经开发出了多种版式的电子海图,中国海军目前也己制定了我国的电子海图标准,并制作出中国海区的数字海图供用户使用。由大连海事大学牵头开发的中国船位报告系统,就是以数字海图为基础的,并且为海军航保部门开发了符合S-57国际标准的海图自动改正平台。此外,天津海事局己开发的数字海图航标导航系统和电子引航系统,也都已经投入应用了。国家海事系统已经制定了中国沿海海区的电子海图分幅规划,分别完成了比例尺为1:100000、1:300000及1:500000的沿海电子海图制作工作,在2007年完成了大比例尺的港口航道电子海图的制作,海事系统电子海图中心硬件建设工作也已完成了。

目前在大多数的个人游艇、中小型的渔船中所使用的ECDIS是在基于PC平台中所开发的系统,该ECDIS产品有着诸多的优点,但硬件成本较高,比较适合在大型船舶及舰艇中使用,而将电子海图技术与嵌入式技术相结合,按照电子海图相关国际标准要求在基于嵌入式系统开发的简化ECDIS,它不仅开发的体积小,而且硬件成本也比较低,与基于PC平台的ECDIS相比,更加适合于在小型渔船及游艇中应用[17]。在国内,基于嵌入式平台的ECDIS研究目前尚处于起步阶段。

相关下载:

技术论文:基于Qt的电子海图研究与实现(上)
http://www.52solution.com/data/datainfo/id/6766
技术论文:基于Qt的电子海图研究与实现(下)
http://www.52solution.com/data/datainfo/id/6767
 
本文研究的内容及意义

研究内容


本文主要研究如何实现基于Qt图形库的电子海图显示与信息系统,该系统的开发工作是在Windows XP平台上进行的,开发完成后会移植到Linux平台,最终产品可以在Windows和Linux平台下运行。

本文将详细介绍使用Qt进行开发的优势,尤其是其信号与槽机制、图形视图框架、优良的跨平台特性等,为开发工作带来了极大的方便。本课题开发的电子海图信息与显示系统重点实现以下内容:

界面设计,利用Qt提供的图形库实现简洁、美观的人机界面;

海图显示,根据墨卡托投影原理实现海图平面显示,并提供海图要素查询功能;

航线设计,包括大圆航法计算,航线评估,制定临时航线等;

航行监控,包括偏航报警,抛锚监控,走锚监控等;

训练区设计,实现多种形状的训练区显示,方便航海长进行航线设计;

模拟推演,根据需要模拟各种航行情况,推演船舶的航行结果。

研究意义

随着海洋开发和航海事业的发展,对组合导航系统功能要求越来越高,组合导航系统的内涵已被大大拓宽,它不仅要具有接收和处理导航定位信息、水文气象信息、雷达和声纳目标信息等实时设备发送的数据信息,而且要具有提供并处理更多更复杂的航海信息的能力,如水深、底质、助航标志、碍航物、潮汐、海流等等各种形式的航海资料信息,为船舶航行提供全方位的安全信息保障。信息化、智能化是组合导航系统发展的新方向,ECDIS正是在这种形势之下应运而生的。

ECDIS是地理信息技术与导航技术相结合的产物,将航海地理信息系统引入船舶组合导航系统具有重大意义。船舶导航是一个很古老也很现实的问题,从最初的观星看海到指南针,再到陀螺仪、无线电以及卫星导航,航海作业人员始终需要在纸海图上手工作业。如果能够充分发挥地理信息系统的空间数据分析功能以及空间辅助决策支持功能,我们将能够改变当前的航海作业模式,这可以大大减轻航海作业人员的劳动强度和工作负担。

航海地理信息库将各种与航行有关的地理要素信息以一定的数据格式存储在计算机内,在计算机技术支持下,这些信息就成了活的数字地理信息,利用导航系统计算机强大的查询检索和逻辑推理功能,船舶导航系统自动判别当前位置周围情况,并根据航行需要显示与航行有关的地理信息,进行地理信息分层显示,快速查找指定地理要素,自动识别危险地理要素,并提供参考避险措施,辅助航海人员作出避险决策。
 
由于电子海图在保障船舶航行安全方面的重要性,近几年来国际上对应用ECDIS的要求越来越高。例如,IMO在2006年12月对高速船的导航设备作了规定:从2008年7月1日起,新造的高速船必须配备电子海图显示与信息系统(ECDIS),非新造高速船在2010年7月1日前也必须执行该规定。我国政府已经在海图数据发布、船舶配备规范、PSC检查、ECDIS培训等方面加快了工作进度,以确保“航运更安全、海洋更清洁”目标的实现。因此,在国内研究并开发出符合标准的ECDIS是非常有必要的。

电子海图的相关开发技术

Qt开发环境介绍

Qt是挪威奇趣(Trol1Tech)公司的一个产品。Qt是一个跨平台的C++应用程序开发框架,广泛用于开发GUI(图形用户界面)程序,它提供给应用程序开发者建立图形用户界面应用程序所需的所有功能;也可用于开发非GUI程序,如控制台工具和服务器等。Qt|使用于OPIE、Skype、VLC media player、Adobe Photoshop Elements、VirtualBox 与 Mathematica等产品,并且被Autodesk、欧洲空间局、梦工厂、Google、HP、KDE、卢卡斯影业、西门子、富豪集团、华特迪士尼动画制作公司、三星集团、飞利浦、Panasonic等著名公司所使用。

2008年6月17日奇趣公司被诺基亚公司收购,公司更名为Qt Software。在2009年5月11日,诺基亚Qt Software宣布Qt源代码管理系统面向公众开放,Qt开发人员可通过为Qt以及与Qt相关的项目贡献代码、翻译、示例以及其他内容,协助引导和塑造Qt未来的发展。为了便于这些内容的管理,Qt Software启用了基于Git和Gitorious开源项目的Web源代码管理系统。

Qt开放源代码,并且提供自由软件的用户协议。使得它可以被广泛地应用在各平台上的开放源代码软件开发中。Qt所有版本都支持广泛的编译器,包括GCC的C++ 编译器和Windows平台的Visual Studio。

自1995年至今,Qt C++ 框架一直是商业应用程序的核心。Qt 的类功能全面,提供一致性接口,更易于学习使用,可减轻开发人员的工作负担、提高编程人员的效率。基本上,Qt同X Window上的Motif,Openwin,GTK 等图形界面库和Windows 平台上的MFC,OWL,VCL,ATL是同类型的东西,但是 Qt 具有下列优点:

1、优良的跨平台特性: Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT/XP/Vista/Win7, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64) , Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。
2、面向对象
3、丰富的 API
4、支持 2D/3D 图形渲染,支持 OpenGL。
5、大量的开发文档。
6、XML 支持。

 
Qt的信号与槽机制说明

1、信号与槽使用方法


Qt下对象间的通讯用信号和槽用的机制来实现[27],信号与槽机制是Qt的核心机制,要精通Qt编程就必须了解信号和槽。信号与槽被用于对象之间的通信,它是一种高级接口,也是Qt区别于其它工具包的重要地方。图2.1直观地表示了这种机制是如何工作的。

信号、槽机制示意c图
图2.1  信号、槽机制示意c图

信号与槽是Qt自定义的通信机制,它独立于标准的C/C++语言,要正确的处理信号与槽,需要借助一个被称为moc(Meta Object Compiler)的工具,moc是一个C++预处理程序,它用来为高层次的事件自动生成相关的附加代码。

在很多常见的GUI工具包中,窗口部件都是通过回调函数来响应触发它们的动作的,回调函数其实就是一个指向函数的指针。但在Qt中,回调函数被信号和槽取代了,这使得程序非常简洁明了。

所有从QObject或其子类派生的类都能够包含信号和槽。当对象的状态发生变化时,该对象就会发射(emit)相应的信号,对象要做的仅仅是发射信号,它不知道这个信号最终会被谁接收。通过这样的信息封装,可以使对象被当作一个软件组件来使用。槽会接收这些被发射的信号,在实现上槽只是普通的成员函数。槽并不知道与自己相连接的是哪些信号。此外,对象也不了解具体的通信机制。

一个的槽可以连接多个信号,一个的信号也可以连接多个槽,甚至信号与信号之间也可以相互连接,但槽之间不能相互连接。当一个信号连接另一个信号时,在第一个信号被发射后,系统会立刻发射第二个信号。总之,信号与槽构成了一个强大的通信机制。

2、信号

当某个对象的状态发生变化时,对应的信号会被发射。只有定义过该信号的类(或派生类)能够发射这个信号,信号被发射后,与之相关联的槽函数会被执行,结果就象是函数被调用了一样。信号与槽机制是完全独立于GUI事件循环的,只有在所有与其相连的的槽函数返回以后发射函数才会返回,当信号被发射后,这些槽函数会一个接一个地被执行,但是无法确定它们执行的顺序,程序员无法设定哪个先执行、哪个后执行。

可以在头文件中声明信号,Qt专有的signals关键字用来表示信号声明区,在信号声明区里声明信号。下面的例子声明了三个信号:
signals:
void signal();
void signal(int data); 
void signal(int data1, int data2);

在上面的定义中,signals是Qt的关键字,并非C/C++的。之后的的一行void signal()定义了信号signal1,该信号没有参数;下一行void signal(int data)则定义了重名信号signal,它有一个整形参数,这和 C++ 中的重载函数很相似。信号的声明在形式上和普通的C++ 函数无异,不过信号只有声明,没有函数体定义,而且信号的返回值类型必须是void型,信号不会返回任何信息。信号是由moc工具自动产生的,无须在.cpp文件中实现。

3、槽(函数)

槽是普通的C++ 成员函数,可以被直接调用,唯一的特殊性就是可以与一个或多个信号相连接。与其相连接的信号被发射后,这个槽函数就会被调用执行。槽可以有参数,但参数不能有缺省值。因为槽是普通的C++ 成员函数,与其它的成员函数一样,槽函数可以声明为虚函数,也有存取权限,类型分为三种,即 private slots 、public slots和protected slots。
private slots:在私有区内声明的槽函数只能在类内将其与信号相连接,同普通函数一样,私有槽函数不能被子类继承,在类外也无法被访问。这适用于声明那些与类联系很紧密的槽函数。

public slots:在公有区内声明的槽函数可以在任何地方与信号连接。对于组件编程这点非常重要,用户能够创建许多独立的对象,只需连接它们的信号和槽就可以传递信息了。

protected slots:在保护区内声明的槽函数表示在当前类和子类中可以将其与信号相连。保护类型的槽函数是类实现的一部分,但是只能在类内调用

和信号一样,槽函数也是在头文件中声明的,下面声明了三个槽函数:

public slots:
void slot();
void slot(int data);
void slot(int data1, int data2);

4、信号与槽的关联

信号与槽函数是通过QObject 对象的 connect 函数来连接的。信号和槽的机制是类型安全的:相互连接的信号和槽函数的签名要相一致,不过实际上槽的签名可以比信号的签名少,因为槽函数可以忽略多出的签名。由于签名一致,这样编译器就可以检测类型是否匹配。信号与槽的连接是很宽松的:信号发射后对象并不知道也不用知道该信号会被哪个槽函数接收。这种信号与槽机制完全类型安全的,不会再有回调核心转储(core dump)。
连接函数定义如下:

bool QObject::connect(const QObject *sender, const char *signal, const QObject *receiver,  const char *slot ) [static]

通过这个函数可以把发射者(sender)的信号signal与接收者(receiver)中的槽函数slot连接在一起。使用时必须用Qt的宏SIGNAL() 指定信号signal,同样宏SLOT()用来指定槽函数。当发射者与接收者是同一个对象时,接收者(receiver)可以省略不写。

下面定义了两个对象:文字编辑区TextEdit和滚动按钮Button,并将滚动按钮的clicked() 信号与文字编辑区对象的setNum () 槽函数相连接,clicked()信号带有一个整形参数,用来表示编辑区当前显示的位置。
QButton *button = new QButton;
QTextEdit *textEdit = new QTextEdit;
QObject::connect(button,SIGNAL(clicked(int)),textEdit,SLOT(setNum(int)));
信号与槽连接后,如果要取消连接,可以使用disconnect函数,其定义如下[28]:
bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver,  const char *slot ) [static]

在下面三种情况下,需要使用 disconnect() 函数:

1)    取消某对象所有信号的连接。

如果在某个对象里面定义了一个或者多个信号,而且这些信号应经与若干个对象连接了,可以利用这个方法切断所有这些连接。
disconnect( object, 0, 0, 0)
或是
object->disconnect()

2)    取消某个信号的所有连接。
disconnect(object, SIGNAL(signal()), 0, 0 )
或是
object->disconnect( SIGNAL(mySignal()))

3)    取消两个对象的所有连接。
disconnect(object, 0, receiver, 0)
或是
object->disconnect( receiver )
disconnect函数中的 0 是一个通配符,可以用来表示任何接收对象、任何信号、任何槽函数。除了发射者(sender)不能为0外,另外的三个参数都可以等于 0。

5、元对象(meta object)工具

Qt的元对象编译器moc(meta object compiler)能够对C++ 头文件中声明的类进行分析并生成一些初始化元对象的C++ 代码,元对象包含了所有的信号和槽函数及其指针。
moc 读取C++ 源文件,如果发现有Q_OBJECT宏声明的类,它就会生成另外一个C++ 源文件,这个新生成的文件中包含有该类的元对象代码。例如,假设我们有一个头文件mysignal.h,在这个文件中包含有信号或槽的声明,那么在编译之前moc工具就会根据该文件自动生成一个名为 mysignal_moc.cpp 的 C++ 源文件并将其提交给编译器。

要实现信号与槽机制,元对象代码是必须的,类实现必须和用moc产生的中间文件一起编译和连接,或通过 #include 语句方法将其添加到源文件中。对于#include 和#define 宏定义,moc并不将其扩展,只是跳过而已。

6、槽和信号机制的缺点

尽管信号与槽机制效率很高,但比起真正的回调函数,增加的灵活性还是会使速度有所损失,这是由于定位连接对象是需要时间的,不过这种损失是可以接受的。Linux下,在一台 i586-133 机器上测试,信号与槽连接比回调函数要多10微秒时间,比起这种机制带来的灵活性和简洁性,效率上的浪费还是值得的。
和普通函数的调用一样,如果信号与槽机制使用不当,在程序运行时可能会出现死循环。在定义槽函数时需要注意不能在槽函数中再次发射接收到的信号,这有可能导致无限循环。此外,当一个信号与多个槽相连接时,那么,在信号被发射后,与之相连的槽函数被执行的顺序是随机的。

 
Qt基于项的图形视图

Qt的视图体系包括一个场景(QGraphicsScene)和一些项(QGraphicsItem)。场景(以及它的项)在视图(QGraphicsView)中显示, 视图提供了一个界面,它既可以管理大数量的定制项,又可与它们交互,有一个视图部件(view widget)可以把这些项绘制出来。视图使用BSP树(Binary Space Partitioning,二叉空间分割)提供对项的快速查找,即使是包含数以百万计对象的超大场景,也能够进行实时显示。
同一场景可以在多个视图中显示,例如,可以部分的显示一个大的场景,或者以不同的变化来显示场景。参见示意图2.2。

一个场景用于多个视图中
图2.2  一个场景用于多个视图中

1、场景

场景是项的容器,它有以下职责:
为管理大量的项提供一个快速的接口。通过调用QGraphicsScene:: addItem()可以把项加入到场景中。可以使用众多的查找函数来获取特定的项。QGraphicsScene::item()与它的许多重载函数可获取那些与点、矩形、多边形、向量路径等相交或是有包含有关系的项。QGraphicsScene::itemAt()返回特定上最顶端的项,所有的项查找函数都以出栈序列返回。

场景的事件传播结构会把场景事件投递到项,也管理多个项之间的传递。假如场景收到了鼠标在某个位置单击事件,场景会把这个事件投递给处在那个位置的项。

场景也管理项状态,如选择、焦点处理。可以通过调用QGraphicsScene::setSelectionArea()来选择项,它需要提供一个任意的形状为参数。调用QGraphicsScene::selectedItem()可以得到这些已经被选择的项。另一个状态处理是一个项是否拥有键盘输入焦点。可以调用QGraphicsScene::setFocusItem ()或QGraphicsScene::setFocus()来设定焦点,也可用QGraphicsScene::focusItem ()来得到当前拥有焦点的那个项。

最后,场景提供未经变换的渲染功能,主要用于打印,通过调用QGraphicsScene::render()函数把部分场景送到绘图设备进行渲染。

2、视图

视图提供了视口部件,用于显示场景中的内容。一个场景可以联结多个视图,这样相同的数据就可以在几个视口中显示。视口部件的显示区域是滚动区域,可以使用滚动条浏览大场景。视图从鼠标、键盘接收输入事件,并对这些事件进行适当的翻译(把事件坐标转换成对应的场景坐标),然后再将其发送给场景。

利用转换矩阵,视图可以变换场景的坐标系统。这样就可以实现一些高级的导航特性,如缩放,旋转等。为了方便,视图也提供了在视图与场景之间进行坐标转换的函数。

3、图形对象

项是场景中图形项的基类。视图提供了一些标准的、用于典型形状的项,如矩形(QGraphicsRectItem),椭圆(QGraphicsEllipseItem),文本(QGraphicsTextItem)等,项支持以下特性:

鼠标按、移动、释放、双击事件,鼠标悬停事件,滚轮事件,弹出菜单事件;
键盘输入焦点,键盘事件;
拖拽;
分组,包括父子关系,使用QGraphicsItemGroup;
碰撞检测;

项如同视图一样,位于本地坐标系,它也为项与场景之间,项与项之间的坐标转换提供许多工具函数。而且,也像视图一样,它使用矩阵来变换它的坐标系统。项可以包含别的项(子类项)。父类项的转换会被它的子孙所继承。QGraphicsItem::collideWith()实现了碰撞检测,通过从QGraphicsItem::shape()返回项的形状(以本地坐标QPainterPath表示),项会自动处理所有的碰撞检测。若想提供自己的碰撞检测,可重新实现QGraphicsItem::collideWith()。

Qt开发工具

Qt提供了一些开发工具,使用这些工具可以加速开发过程。

1、项目文件生成器(qmake)

qmake是Qt用来为不同的编译器和平台创建Makefile的工具。直接手工书写Makefile比较繁琐而且还容易出错,尤其是为不同的编译器和平台创建Makefile。使用qmake工具,开发者只需创建一个简单的.pro文件(项目文件),即可通过qmake生成Makefile文件,qmake会屏蔽掉编译器和平台的差异,开发者可以被解放出来。

2、元对象编译器(moc)

前面已经介绍过,moc(Meta Object Compiler)是Qt信号与槽机制的C++ 实现工具。元对象编译器读取C++ 源程序,如果某个类的声明中包含Q_OBJECT宏,编译器会为这个类生成一个包含元对象代码的C++ 程序文件。元对象代码对于信号和槽机制是必须的。

3、资源编译器(rcc)

rcc(Resource Complier)可以在建立应用程序的过程中把资源嵌入到Qt的应用程序中。通过rcc的编译,可以把.qrc文件中包含的资源数据转换成C++源文件,该文件可以和应用程序一起进行编译。

ACE、PostgreSQL概述

ACE的全名是ADAPTIVE Communication Environment,是一组可以自由使用的、开放源码的面向对象(OO)的构架。ACE的Wrapper Facade模式解决了跨平台的c++编程问题。虽然我们现在有标准C++,但是目前的C++标准库对于多线程、网络通信、并发处理、进程管理以及小内存分配、共享内存、内存映射文件等诸多实际运用中的问题没有支持。使用ACE可以藐视各个平台间的差异,大大地简化网络编程,减少出错的机会。

ACE对各个操作系统的接口函数API进行封装,并且用统一的接口形式提供给程序员。只需要简单地调用ACE提供的函数形式(这些形式和常见的系统API非常相像),ACE就会自动地把它转换成你所在的平台上的函数,ACE支持的平台包括Linux、windows、Solaris、VxWorks。ACE将面向对象的思想运用到这些函数里面,对网络编程等部分的功能进行改造,建立起面向对象的模型。比如,ACE将连接的一方处理成为一个对象,将一个连接处理成为一个对象,先前的操作则被封装成为对象的功能。这样就可以运用面向对象的思想来构建应用,而且OO的类型保护机制可以把一大批错误从运行时提前到编译阶段。
下面是用ACE实现服务器功能的一段示例:
      
int main(int, char *[])
        {
            ACE_INET_Addr port_to_listen (9999);
            ACE_SOCK_Acceptor acceptor;
            acceptor.open (port_to_listen, 1);
            while (1)
            {
                ACE_SOCK_Stream peer;
                ACE_INET_Addr peer_addr;
                ACE_Time_Value timeout (10, 0);
                if( 0 == acceptor.accept (peer, &peer_addr, &timeout, 0))
                {
                    char buffer[4096];
                    ssize_t bytes_received;
                    while((bytes_received=peer.recv(buffer,sizeof(buffer))) != -1)
                    {
                        peer.send_n (buffer, bytes_received);
                    }
                    peer.close ();
                }
            }
            return 0;
     }

寥寥数行代码,就已经实现了一个完整的服务器功能:它在9999端口上开始侦听,接受一个TCP连接,把它发过来的数据返还回去。如果业务完成,则断开连接,接受下个连接,开始下一次循环。

ACE融合通讯领域的各个优秀的模式,利用它已经建立起来的可移植到多平台的OS层函数,建立起一个个精巧的框架。这些模式都是众多的工程师在实践中积累起来的优秀经验。实际上,得益于开源的思想,现在全世界有一千七百多位工作者和数百人的核心团队进行ACE的进一步开发。使用ACE只需对现有框架进行扩展,可以大大缩短开发的过程,并且极大地提高程序对硬件的使用效率。

ACE主要提供以下几种框架供网络程序的开发:

服务初始化组件:ACE Acceptor(接受器)与Connector(连接器)组件,主要用于降低连接初始化与建立后应用执行的实际服务之间的耦合程度。

事件多路分离组件:ACE Reactor(反应堆)与Proactor(前摄器)是面向对象的可扩展多路分离器,支持多个事件处理器的多路分离和分派,以便响应多种类型的事件,如I/O端口、信号、同步对象、定时器等。

进程和线程管理:提供多进程和多线程的派生和管理方法,消除了平台的差异性。

服务配置组件:ACE Service Configurator(服务配置器)支持应用的配置,这些应用的服务可在安装时和/或运行时动态装配。

分层的流组件:ACE Stream组件简化了像用户级协议栈这样的由分层服务组成的通信软件应用的开发。

命名服务:ACE NamingService提供了单进程命名上下文、同一节点共享命名上下文和在网络上命名上下文的服务设施。

除此以外,ACE还提供了信号、内存管理等多种丰富的功能,ACE已经成长成为一个完善的系统,在网络编程方面,能够提供非常丰富的服务。当前ACE正在完善它的高级分布式计算中间件组件,并且制定了多个项目计划进一步扩充和发展ACE的功能。

PostgreSQL概述

PostgreSQL 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),它的很多特性正是当今许多商业数据库的前身[32]。PostgreSQL源于加州大学伯克利分校计算机系开发的POSTGRES,它支持大部分SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、多版本并发控制。在其他开放源代码数据库系统(如 MySQL 和 Firebird),和专有系统(如Oracle、Sybase、IBM 的DB2和 Microsoft SQL Server)之外,PostgreSQL为用户又提供了一种选择。

与其它数据库相比,PostgreSQL具有以下特征:

PostgreSQL的特性覆盖了SQL-2/SQL-92和SQL-3/SQL-99标准。它支持非常丰富的数据类型,其中有些数据类型甚至连商业版数据库都不支持, 如几何类型和 IP 类型等;

PostgreSQL 虽然是自由软件数据库,但功能全面,它支持事务、子查询、数据完整性检查、多版本并行控制系统等。

PostgreSQL拥有一支活跃的开发队伍,在许多开发者的努力下,PostgreSQL 的质量日益提高。

PostgreSQL对支持丰富的接口,几乎包括所有的客户端接口,如C/C++,JDBC,ODBC,Perl,Python,ESQL,Tcl等。PostgreSQL采用C/S(client/server)结构,数据库服务器提供了统一的客户端C接口,方便了客户端程序的编写。

PostgreSQL支持的平台多达十几种,包括不同的操作系统和不同的硬件体系。至今,它仍然保持着支持平台最多的数据库管理系统的称号。

 
Linux操作系统

Linux系统概述

Linux操作系统的成长与流行得益于于Internet的发展,它是由Unix系统发展演化而来的。,芬兰大学生Linus Torvalds在1991年开发出了Linux的第一版内核,这之后经过全世界Internet上众多的自愿者数年努力,Linux逐渐发展成为完整的操作系统,直到今天仍有数万程序员在开发Linux内核与应用程序,当前Linux的内核版本为2.6版。

因为Linux开放的自由软件,市场上不同的厂商推出了很多种Linux发行版,如Debin Linux、RedHat Linux、SlackWare Linux、国产红旗Linux、XteamLinUX中文版等。所有发行版都基于相同的Linux内核,不过各厂商提供的桌面管理环境、安装程序和应用软件包等都不尽相同。

Linux系统的特点

1、完全免费

Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并且可以修改系统的源代码,这一点其它操作系统是无法做到的。正是由于Linux的这种开放性,很多世界级的高水平程序员都参与了Linux内核的修改与编写工作,用户可以根据自己的灵感与兴趣进行修改,因此Linux系统吸收了众多程序员的精华,其发展规模不断壮大。

2、符合国际通用标准

Linux可供实际使用已有很多年了,由于兼容POSIX 1.0标准,所以在Linux下通过模拟器能够运行常见的Windows和DOS程序,这方便了那些Windows用户过渡到Linux。许多Windows用户打算使用Linux时,常常希望能够在Linux下运行常见的Windows程序。

3、拥有真正的多任务、多用户能力
Linux支持多任务,多任务是操作系统与硬件平台的发展趋势,Linux能够同时并独立地运行多个程序。多用户则是不同的用户对其各自的文件设备有着特殊的权利,可以保证用户之间互不影响。

4、良好的GUI

Linux具有字符和图形两种界面。在字符界面中,用户通过键盘输入指令进行操作。Linux的图形界面被称为X-Window系统,它和Windows图形界面相似,主要使用鼠标进行操作,可以说X-Window环境就是一个Linux版的Windows系统。

5、网络功能丰富

Linux是在Internet的基础上发展起来的,网络功能当然不会逊色。它的网络功能和内核是紧密相连的,这要优于其它操作系统。像文件传输、网页浏览、远程登陆等网络工作都可以轻松实现,此外,Linux主机还可以作为服务器提供FTP、WWW、E-Mail等服务。

6、性能稳定、安全可靠

Linux内核设计包括了很多安全措施,像读写权限控制、核心授权、审计跟踪等,这些都有效地保障了安全。Linux在稳定性方面也十分出色,可以用到对稳定性要求较高的网络服务器上。

7、支持多种硬件平台

Linux支持多种硬件平台,包括Intel、PowerPC/Macintosh、Alpha、SPARC等。同时Linux还支持多CPU技术,可以大大提高系统性能。Linux还是嵌入式操作系统,能够运行在机顶盒、掌上电脑、游戏机等设备上。

Linux系统结构

Linux操作系统的结构与Unix很相似,主要包括两部分:内核和核外程序。核外程序包括各种语言处理程序及其它系统程序。用户经过自编并编译、连接处理而生成的各种可执行文件也属于核外程序。核内程序一般分为存储管理、设备管理、进程管理和文件系统管理等几部分。Linux和Uinx一样采用系统调用以便支持核外程序的内核调用,具体结构参见图2.3所示。

Linux操作系统的基本结构
图2.3  Linux操作系统的基本结构

Linux的进程调度算法也和Unix系统的调度策略相似,通过精巧的数据结构以及完备的算法来均衡每一个进程占用CPU的时间,以便达到高效性及时性、和稳定性的统一。进程创建方法也和Unix相类似:首先为子进程分配一个空闲的PROC(Linux核心进程控制块)结构,父子进程会共享父进程的正文段(不可重写的程序部分),之后只在使用必要的页时,子进程才会用页复制程序复制父进程的数据页。

Linux系统的存储管理使用的是页式管理机制。每一个进程都有一个进程虚拟空间,该空间比实际物理空间大得多。通过虚拟地址映射,系统可以管理整个进程的地址空间。Linux的地址分配策略十分注重实效性,只有在必要时才会进行地址分配,这是一种效率与速度的折中策略。

文件系统用来管理计算机中所有的文件,为用户提供了处理文件的手段和存取控制。Linux的文件系统继承了Unix系统的很多优点,支持多种流行的文件系统,如EXTZ、EXT3、1509660、FAT、VFAT、SMB、NFS等。Linux自身的文件系统称为EXTZ,它是Linux默认的文件系统。此外Linux系统采用了被称为虚拟文件系统(VFS)的接口层技术,提高了对各种文件系统操作的透明度,具有十分优越的特性。

 
X Windows图形环境

X Window 概述

Linux提供了文本界面和图形界面。文本界面是Shell接口,也是Linux的传统界面。Shell实际上是一个命令解释器,能够解释用户命令并将其送入内核执行。Shell有自己的一套编程语言,语法和常见的编程语言类似,用它编制的Shell程序能够单独运行,也能和其它程序一起运行。和Linux类似,Shell也有多种版本,比较流行的有Bourne Shell(由贝尔实验室开发)、BASH(GNU操作系统上默认的Shell)、Korn Shell(Bourne Shell的发展,大部分内容与Bourne Shell兼容),以及C Shell(SUN公司Shell的BSD版本)。

X Window是麻省理工学院(MIT)为Athena计划设计开发的,该计划主要是要构造一个硬件独立的分布式用户界面平台[35]。目前,麻省理工学院将其发布的X Window和源代码称为X11系统。之后,Linux开发者将X Window移植到了Linux系统,X Window运行良好,显示效果甚至比Unix中的还要好,目前Linux上使用的XFree86就是基于Unix的X11R6版本。

经过多年的发展,X Window系统已有多种不同的版本。在X window系统的基础上,自由软件开发者们为Linux开发了多种桌面系统,现在比较流行有GNOME(GNU Network Object Model Environment,GNU网络对象模型环境)和KDE(K Desktop Environment,K桌面环境)等。目前,Xwindow可以在各种各样的平台上运行,已经得到了世界上众多软硬件厂商的认可,运行在X window系统上的应用程序包含了几乎所得的领域。同时,X Window在微机平台上的实现,更为其在PC机领域开辟了广阔天地。

X window体系结构


作为一个网络透明的窗口系统,X Window采用的是客户/服务器(Client/Server,c/s)结构模型,主要包括三个部分:
•服务程序(X Server),控制实际输入设备和显示设备的程序。
•客户程序(X应用程序),请求服务程序响应特定的窗口操作。
•通信通道(X协议),服务程序和客户程序交互信息的通道。

X Window的体系结构图如图2.4所示:

X Window体系结构
图2.4  X Window体系结构

X Window的C/S模式将事件处理和窗口显示同应用程序分离出来。X协议是服务器和客户程序进行通信的信息交换格式,应用程序通过X协议和X服务器通信。

X Window的这种分布式体系结构使得客户和服务器程序能够在网络中的不同计算机上运行,使得X Window系统具有很高的网络透明性。一个服务程序可同时连接多个客户程序,同样,一个客户程序也可连接多个服务程序。服务程序的主要作用是响应客户程序的多路请求,并把鼠标、键盘等多种输入集结到客户程序中。

X Window特征

X Window系统之所以能够成功并流行开来,主要是因为它所采用了先进的技术并具备优越的性能。X Window主要特征如下:

1、网络透明性

X Window系统的网络透明性是通过X协议实现的,具体是指:无论服务程序是本地的还是远程的,它对客户程序都没有影响。X协议实际上是字符流传输协议,当客户程序和服务程序都运行在同一机器上时,X协议通过Linux的进程通信机制来实现;而当运行在两个不同的机器上时,则通过网络协议来实现。目前,X协议已在TCP/IP、DECnet等网络环境上实现了。

2、设备独立性

设备独立性是指X Window系统与硬件系统无关,独立于输入和显示设备。这个特性使X Window获得了广泛的支持,基于X系统开发的应用程序移植性很好,稍加修改甚至不用修改即可运行在其它硬件平台上。

3、支持多种风格的图形用户界面

多数窗口系统,比如Windows,只提供固定风格的图形用户界面,而X Window则支持多种风格的图形用户界面。X Window的图形用户界面开发原则是“只提供机制不提供风格”。X Window中没有常用的如按钮、菜单、对话框之类界面元素,也没有对用户交互的具体行为方式作出规定,它只是提供了窗口操作机制和显示控制机制以及这些操作的实现函数集。用户根据这些操作和显示机制,可以制定出各种风格的用户界面。

4、可扩充性

X协议是可扩充的,最多可扩充到256个请求,目前已包含的有120多个,这使得应用程序可以自由地使用扩充功能。

5、完善的功能

X Window的功能非常完善。在应用程序通信方面,X Window提供了多种通信机制;在图形显示方面,支持多种图元及多种字体正文的输出,并提供了图像数据操作和色彩管理的机制;此外,X Window还提供了事件机制用于控制应用户和程序之间的交互。

X window系统编程模型

1、X Window程序层次结构

X Window提供了窗口操作机制、显示控制机制和相应的操作函数接口。程序设计接口包括X Toolkit开发工具箱和Xlib函数库。X Window程序界面可分成三个层次: Toolkit(X工具箱)、Xlib和X Protocol(X协议),三者之间的层次关系参见图2.5。

X的程序界面
图2.5  X的程序界面

由图2.5可见,X Protocol(X协议)是X客户应用程序和X Server程序之间唯一的接口。X应用程序所有的图形输出都通过X协议发送到服务器,然后由服务器完成具体的显示工作。

X Window的事件驱动模型

X协议是X应用程序和X服务器进行通信的通道,实际上X协议是服务器与客户之间信息交换和解释的约定。X协议包括事件和请求这两个基本元素。事件由服务器发送给X应用程序,服务器将用户的输入(如键盘输入和鼠标点击)和其它一些与应用程序相关的活动转化为事件,然后将其发送给应用程序,应用程序则据此做出反应;而请求则由X应用程序发送给服务器,由服务器根据请求完成X应用程序所需的功能。

X应用程序的结构都会含有一个被称为事件循环(event loop)的主循环。在这个主循环中,服务器不断地将各个X应用程序的窗口事件发送给相应的X应用程序,X应用程序会处理这些窗口事件,直到出口条件出现(往往意味着X应用程序的结束)。由此可知,X应用程序是由事件驱动的,X应用程序只能通过这些由服务器发送的事件与用户交互。
X应用程序与服务器的交互关系参见图2.6:

事件、服务器以及X应用程序之间的交互关系图
图2.6  事件、服务器以及X应用程序之间的交互关系图

 
电子海图系统体系架构


电子海图系统原理概述

本章主要介绍ECDIS的基本的软、硬件架构,用户在设计自己的体系架构时可根据选择的平台对该结构进行补充或精简。按照国际标准化的要求,电子海图显示与信息系统的原理图如图3.1所示。

电子海图显示与信息系统的原理框图
图3.1  电子海图显示与信息系统的原理框图

电子海图硬件组成结构


硬件基本组成

电子海图显示与信息系统主要包括软件系统及硬件系统两大部分。其中,硬件系统主要是由电子海图的外部设备及内部部件组成,硬件系统结构在实际中是多种多样的,不论如何变化电子海图硬件系统结构中的基本关键部件是不能缺少的,这些基本关键部件就构成了电子海图的基本硬件系统,下图3.2表示了电子海图的基本硬件结构。

电子海图基本硬件架构
图3.2  电子海图基本硬件架构

组成部件功能

电子海图的基本硬件系统部件主要由主控计算机、海图数据载体、高分辨率彩色显示器和智能接口等组成,电子海图的所有功能基本都是由这些部件的相互配合来完成的。

1、主控计算机

主控计算机主要是由主机和微处理器(CPU)来组成,在电子海图系统中,系统所有功能都是由它计算完成的。

2、高分辨率彩色显示器

高分辨率彩色显示器是电子海图系统中重要的显示设备,其分辨率一般为1280×1024,用来在屏幕中显示与航海要素有关的图形数据以及雷达图像等。

3、海图数据载体

数据载体存储数据的配件,如存储在硬盘上的ENC数据。

4、智能接口

主控计算机与其它导航设备 (如GPS、AIS、ARPA)的连接都要用到智能接口,它是电子海图与外部联系的纽带。它可以将外部设备配件采集的信息传送到主控计算机中进行处理,也可以将主控计算机机发出的命令传达到外部部件中。

5、其它载体

如声卡部件,在船舶航行过程遇到障碍物或偏航时,可以用声卡实现报警的功能。

电子海图软件总体设计

设计要求

电子海图显示与信息系统的最终用户是具有船舶操作能力的航海人员,他们熟悉航海操作,但是对于软件使用可能不熟悉,这就要求软件具有很好的易操作性、可扩展性和容错性。同时,为了提高航海作业的效率,对于软件的迅速响应能力提出一定的要求,因此,要求软件具有一定的高效性。最后,软件的管理、维护和维修应具有简易性和可操作性。软件的各种参数配置可以通过程序进行维护,并能够通过网络进行系统维护,以降低系统的维护成本。

本课题设计的电子海图显示与信息系统在物理拓扑结构上是由多个对等工作台通过TCP/IP网络搭建起来的分布式系统,每个工作台拥有完整的、基于电子海图的航海作业子系统,该子系统实现海图显示、计划航线制定、海航作业、运动方案模拟推演、航海日志管理等功能。这些子系统模块所产生的相关数据(固定时限内)在本地保留备份的同时,还将通过导航系统内部以太网络同步这些数据,与此同时,所有的数据都要传送到共享数据库上保留。其功能结构图参见图3.3所示。

电子海图系统功能结构图
图3.3  电子海图系统功能结构图

重要模块功能解析

海图显示

由于地球是球体,要将地球表面的三维的信息显示在二维的屏幕上,必然要用到投影,航海上最常使用的航海图就是采用投影(等角正圆柱投影)的墨卡托海图,此种海图采用墨卡托坐标变换方法实现了地理点到屏幕点的坐标转换。

在电子海图系统中,海图数据的完整性和显示速度将是用户最为关心的两方面,数据的完整性将由海图数据提供方来保证,而海图显示的完备性和显示速度则由其实现算法决定,电子海图信息显示系统处理的数据量非常大,所以必须从算法角度上提升电子海图的显示速度。

计划航线


1)    新建航线
通过新建航线功能制定一条新的计划航线。点击新建航线按钮后,通过鼠标左键在数字海图上点选转向点,在屏幕右上方实时显示鼠标位置的经纬度,采用墨卡托航法自动计算两转向点方位距离,并可选择是否标绘在计划航线上[39]。计划航线存为标准航海计划形式,并自动与其他台位航海工作台同步数据。

2)    航线管理
对计划航线进行管理,主要功能包括:
复制:复制选中航线;
删除:删除选中航线;
添加:通过键盘输入方式添加一条计划航线;
修改:针对转向点列表,通过键盘输入方式修改计划航线;
浏览:以标准航海计划形式浏览选中航线;
发送:将选中航线发送给海图标绘台;
置为当前计划航线:将选中航线置为当前计划航线,以便进行航海作业。

3)    修改航线
此功能可以实现通过鼠标移动在数字海图上标绘航路点,实现在不同航路段间插入新航路点;通过鼠标右键菜单实现航路点属性编辑、删除航路点等操作。

4)    航线评估
利用海底曲面拟合算法根据海图中已知的各离散位置的水深值拟合出任意地理位置的水深值,以此对计划航线进行推演和安全性评估,并检测航路上的危险碍航物,显示评估结果并在数字海图上高亮显示或标绘出危险要素及其位置[40]。

航海作业


1)    航行开始
设置好当前计划航线后开始航行,系统会监视航海计划执行情况,计算到各转向点的距离和时间,与计划航线的偏差,如果超过阈值则提示告警,并给出建议航向、航速。

2)    定位
在无法接收到经纬度信息时,系统提供推算、陆标定位、天文定位等辅助定位手段。
推算:当接受网络经纬度信息失败时,系统自动根据上一时刻航向、航速推算当前经纬度信息,当网络数据恢复时停止推算。
陆标定位:在数字海图上选取物标信息,利用两标、三标、三标两角等方法进行定位。
天文定位:利用异顶差法或移线法进行天文定位。

3)    抛锚
抛锚计划:为方便航海人员进行抛锚操作,系统提供抛锚计划制定功能。在数字海图上选取导标和侧标,当船舶离锚位点一定距离时计算侧标的方位,输出定点抛锚计划。
抛锚监控:实时解算到锚位点的距离方位,期望航向,显示风向、风速等信息;抛锚结束后可在数字海图上显示锚泊态势图,船与锚位点距离超过阈值时提示告警。

4)    停靠码头
点击停靠码头按钮,结束此次航行,将靠码头时间记录入航海日志,并与其他台位航海工作台进行信息同步。

运动方案模拟推演


1)    运动方案制定
根据作战任务,辅助航海人员制定舰艇运动方案,标绘在数字海图上,并与其他台位航海工作台同步。

2)    运动方案推演
对运动方案进行推演,得到占领预定阵位时间,到达预定阵位的航向航速,总航程等数据,为指挥员确定优化方案提供参考数据。对航路和作战区域进行安全行检查,检测航路上的危险碍航物,显示评估结果并在数字海图上高亮显示或标绘出危险要素及其位置。

3)    攻击与防御
图形化显示导弹攻击、舰炮攻击、搜索敌舰、布雷、防御等信息。

航海日志管理


航海日志记录项包括以下各项:
记录启航时间、航行海区、航行任务。
记录启航、定位、抛锚、停靠码头等作业操作信息。
记录舰位、目标位置等,进行航行态势回放,并可调节回放速度。

系统运行环境


客户端软件:以Qt4为基础搭建的操作平台;
数据库管理系统:PostgreSQL 8.3;
操作系统:Linux 。

信息处理流程

操作人员通过Qt4搭建的人机交互平台进行各种指令操作(比如制定航线、机动绘算、航海辅助计算等等),系统内部通过以太网接收导航信息、船舶自动识别系统AIS(Automatic Identification System)信息和目标信息,系统中间层调度相应的航海功能组件接收这些数据,对目标数据进行处理、分析并将结果数据标绘到电子海图上。

人机界面设计

航海工作台系统软件的用户界面主要包括:海图显示区、静态信息显示区(运行过程中必须显示的内容)、动态信息显示区(根据系统运行过程中状态的不同显示相应的内容)、功能菜单区等部分。

屏幕总大小为1280×1024。海图显示区位于左侧屏幕占据1024×1024大小,专为显示数字海图、计划航线、运动方案、舰操图和目标信息等;界面右上角为静态信息区,该区域实时显示时间信息(北京时或当地时),经纬度、航向、航速、水深、航程等导航信息,海图比例尺和显示比例尺等海图信息;动态信息显示区位于右侧中部,上半部分为气象水文、机动绘算、偏航抛锚监控等信息显示区域,不同功能对应不同的信息显示,默认显示的为气象水文信息;右侧下部为告警信息、综合目标信息和AIS信息显示区域,通过TAB控件予以区分。

电子海图系统重要模块的实现

显示模块实现

前面已经提到,由于地球是球体,要将地球表面的三维的信息显示在二维的屏幕上,需要用到投影,航海上最常使用的海图就是采用投影(等角正圆柱投影)的墨卡托海图,此种海图通过墨卡托坐标变换方法实现了地理点到屏幕点的坐标转换。这种包括大地坐标系与平面坐标系间的正逆变换以及平面坐标系与屏幕坐标系之间的正逆变换。其中大地坐标到平面坐标的转换在许多参考文献中均提出了相应的数学模型,有许多转换公式,实现的精度很高;而平面坐标到屏幕坐标之间的变换,则通过Qt的绘图机制来实现。


相关资讯
CIS芯片龙头年报解读:格科微高像素战略如何实现287%净利增长

格科微电子(688728.SH)2024年度财务报告显示,公司年度营收突破63.83亿元人民币,实现35.9%的同比增幅,归母净利润呈几何级增长达1.87亿元,EBITDA指标跃升107.13%至14.15亿元。这种爆发式增长源自其在CMOS图像传感器(CIS)领域实施的"技术锚定+场景穿透"双轮驱动战略,特别是在高像素产品矩阵构建和新兴应用市场开拓方面取得突破性进展。

RS2604 vs 传统保险丝:技术迭代下的安全与效率革命

RS2604作为一款高集成度、可配置OVP(过压保护)和OCP(过流保护)的eFuse开关,专为12V24V母线电压接口设计,兼顾热插拔保护与动态负载管理。其输入电压覆盖4.5V40V,极限耐压高达45V,适用于工业设备、汽车电子及消费电子领域。通过外部电阻灵活设置350mA至2.5A的限流值,结合±7%高精度电流检测,RS2604在安全性与能效间实现平衡,成为复杂电源系统的核心保护方案。

全球汽车芯片市场遇冷,恩智浦如何守住56%毛利率防线?

荷兰半导体巨头恩智浦于2025年4月28日披露的财报显示,公司第一季度营收28.35亿美元,同比、环比均下滑9%,但略超市场预期。在汽车、工业与物联网等核心业务需求疲软的背景下,Non-GAAP毛利率同比下降2.1个百分点至56.1%,自由现金流则维持在4.27亿美元,突显其成本控制能力。值得关注的是,管理层对第二季度营收指引中值(29亿美元)释放出环比复苏信号,但关税政策的不确定性仍为业绩蒙上阴影。

全闪存与软件定义双轮驱动——中国存储产业年度趋势报告

根据IDC最新发布的企业级存储市场追踪数据,2024年中国存储产业迎来结构性增长拐点。全年市场规模达69.2亿美元,在全球市场占比提升至22%,展现出强劲复苏态势。以浪潮信息为代表的国内厂商持续突破,在销售额(10.9%)和出货量(11.2%)两大核心指标上均跻身市场前两强,标志着本土存储生态的成熟度显著提升。

索尼启动半导体业务战略重组 图像传感器龙头或迎资本化新篇章

全球消费电子巨头索尼集团近期被曝正酝酿重大战略调整。据彭博社援引多位知情人士透露,该集团拟对旗下核心半导体资产——索尼半导体解决方案公司(SSS)实施部分分拆,计划于2023年内推动该子公司在东京证券交易所独立IPO。该决策标志着索尼在半导体产业布局进入新阶段,同时也预示着全球图像传感器市场格局或将发生重要变化。