基于 S52 的电子海图显示优化

0引言

电子海图显示系统是航海技术装备的实时系统,它能将海图信息、导航信息以及雷达目标等信息在同一屏幕上叠加显示,用户可以根据当前的环境按需要来设定显示的内容和颜色。为了保证航海的安全,必需将各种信息如船只的动态信息、静态信息、报警提示等及时地显示在电子海图上。电子海图的显示的关键问题之一就是电子海图的显示效率和显示速度。在IHO国际海道组织出版的S52标准“电子海图显示与信息系统海图内容与显示规范”及其附录2“ECDIS颜色符号说明”中,明确规定了电子海图显示和刷新的要求。本文对单幅电子海图物标的显示进行了优化分析,可以较好地解决电子海图显示时间较慢的问题,提高了电子海图的漫游速度和放大缩小速度。

在S52中规定,每个ECDIS系统的生产厂商可以自己定义内部高效的数据存储格式(senc)。ECDIS从senc文件中读取数据进行电子海图的显示。本文不涉及senc文件的结构,只是讨论从senc读取数据后对物标绘制显示时所进行的优化。

本文实例采用Java语言,在NetBeans编译器上进行测试。为了图示方便,文中绘制的物标只包括深度带、陆地、疏浚区、浮船坞、浮码头、未测水域、岸线、等深线、街区、侧面浮标和侧面方标。

1面板绘图与图片绘图

Graphics2D类是Java的绘图类,有三种类型的呈现操作,分别是Shape(形状)操作、Font(字体)操作、Image(图片)操作。如果直接在面板上绘制电子海图的物标,拖拽海图的时候会有视觉不连贯的感觉。

本文提出的方法是先在内存中的一张图片上绘制电子海图物标,再将要显示的图片画在面板上,对于绘制在图片上的物标,在拖拽的时候只是重绘图片在面板上的位置,而没有对整个电子海图的物标进行重新绘制,这样不但可以提高显示的速度,而且在拖拽的时候避免了视觉上不连贯的缺点。

在Java中这种方法可用通过BufferedImage类来实现。BufferedImage类具有可访问图像数据缓冲区的Image,先在内存中分配一个和我们绘画窗口一样大小的空间,使用getGraphics()方法获得双缓冲画笔,再用双缓冲画笔在内存中绘制出要画的图片,最后将图片一次性的显示在面板上。

采用大小不同的两张海图来比较直接绘制海图在面板上和通过图片绘制在面板上这两种方法的显示效率。两张海图分别是7Csahara.000(文件大小21KB)和EA200001.000(文件大小2729KB)。分别如图1和图2所示



7Csahara.000电子海图只绘制了四种物标,通过表1可以看到直接将物标绘制在面板上和通过图片绘制在面板上消耗的时间基本相同,而且从视觉上也没有明显的差别。因此在物标较少或者电子海图较小的情况下,两种方法的绘制效率差不多。

EA200001.000电子海图绘制物标较多,通过表2可以看到直接将物标绘制在面板上比通过图片绘制在面板上所消耗的时间要多接近一倍的时间,而且在各种操作的时候视觉上有明显的不连贯感觉。如果海图绘制物标的种类和物标数继续增加,直接绘制物标比通过图片绘制所消耗的时间会增加的更多。因此将海图的物标一次性画在内存中的图片上,再将图片画在面板上可以提高显示的效率,使绘制的过程非常流畅,而且避免了画面闪烁的缺点。

2BufferedImage大小的设定

采用先在内存中绘制物标,然后再将图片绘制到面板上的方法,还需要考虑图片的初始化问题,即对图片大小的定义。

如果将图片定义成电子海图的大小,随着电子海图的放大缩小进行动态的变化会造成绘制效率的降低和内存溢出。效率的降低是因为海图显示的范围是有限的,最大只有显示屏幕大小,如果将超出屏幕显示范围的物标依然绘制在图片上就会造成显示效率的降低。内存溢出是因为存放图片的内存大小是固定的,当海图放大到一定比例时,要显示的物标增多,需要绘制的像素点也增加了,使得图片在内存中占的资源也越来越多,当超出内存大小时就会造成内存溢出。以海图7Csahara.000为例,当7Csahara.000海图放大到原来的6倍时就会出现溢出的错误。

解决办法是将图片定义成固定大小,也就是显示区域的大小,超出显示区域的海图部分就不绘制在图片上,这样不但节省了物标的绘制时间,而且也解决了内存溢出的问题,减少了内存的占用量。

3结束语

电子海图与传统纸质海图相比的优势是电子海图可以根据船员的选择更改屏幕显示内容,还可以根据需要增加多种航海辅助功能。电子海图的显示不存在视觉上的停顿。本文在完全符合国际海道测量组织(IHO)颁布的有关ECDIS协议的基础上,讨论了对电子海图显示优化的方法,优化了电子海图的显示效率,有效地降低了内存的占有率,实现了电子海图的快速显示,满足了对电子海图操作响应时间的要求。