APP下载

YimaEnc电子海图在Winform开发框架中的应用

2018-01-22沈晖

声学与电子工程 2017年4期
关键词:跟踪目标海图标号

沈晖

(第七一五研究所,杭州,310023)

电子海图不管是在军用还是民用都具有很重要的应用价值[1],它相比普通的态势图具有更加直观、更加形象等特点[2]。电子海图插件版本众多,所应用的平台也各不相同,本文应用的YimaEnc电子海图的版本号为YimaEnc3.9.8,是YimaSoft公司使用Yimap Core开发的应用于电子海图领域的系列软件。YimaEnc电子海图符合国际海事组织(IHO)制定的数据标准S57和显示标准S52[3],具有较好的刷新显示效率和海图动态加载速度。

YimaEnc电子海图引擎内核基于标准C++开发,具有良好的跨平台性能[4],支持Windows、Android、IOS、WinCE、Linux、VxWorks等[5]。本文是 Windows系统下YimaEnc在Winform开发框架中的应用,利用YimaEnc电子海图进行二次开发、创建自定义的开发接口,按项目需求开发出自定义的支持S57和S52标准的电子海图系统。鉴于YimaEnc电子海图的优点,以及时下对程序设计的用户界面需求逐渐增强,所以将电子海图应用在态势图程序中会有较好的效果。

1 YimaEnc电子海图内部基本结构

1.1 文件结构

YimaEnc组件包括核心控件 YimaEnc.ocx及“S57Lib”目录下的7个库文件。

(1)S57ObjectClasses是所有 S57的物标类(Object Class,在YimaEnc中称为图层-Layer)的定义,包括每个类别的名称、缩略语和所包含的特征属性列表;

(2)S57Attributes是所有S57的物标特征属性的定义,包括每个属性的名称、缩略语、数据类型和枚举或列表类型的各项枚举值;

(3)S57Colours是所有S52定义的5中颜色模式列表,包括DAY_BRIGHT、DAY_WHITEBACK、DAY_BLACKBACK、DUSK、NIGHT五种模式下的所有颜色的缩略语、视觉颜色、CIE3分量、RGB3分量值;

(4)S57Symbols是所有S52的点物标符号定义;

(5)S57ComplexLineStyles是所有S52的线物标循环符号定义;

(6)S57Patterns是所有 S52的面物标填充符号定义;

(7)S57LookupTable是所有S52的物标对象显示风格规则定义。

1.2 软件结构

YimaEnc电子海图组件对象内有一个海图管家,它负责所有的海图管理和显示任务,包括一个海图库、一个内存海图序列、一个海图绘制器及多个海图屏幕窗口。YimaEnc电子海图软件结构如图1所示。通过调用海图管家的操作接口函数,可以实现以下6个功能:海图库管理和内存海图序列的管理功能;海图绘制器的管理;海图显示控制;坐标转换与地理计算;S52显示全局参数控制;海图物标查询和高亮功能。

2 YimaEnc电子海图基本API

首先需要注册 YimaEnc.ocx成功,由于该YimaEnc电子海图版本只支持x86的Windows系统,所以在创建Winform项目的时候,需要将项目生成的目标环境改为 x86。该版本海图插件所有的接口用法在“YIMAENC SDK 开发文档.chm”中有详细的解释说明,以下就最基本的接口和最常用到的接口进行详细解释说明。

图1 YimaEnc电子海图软件结构

2.1 最基本的3个接口

在程序需要显示海图的时候加载以下3个接口函数:Boolean Init(String strWorkDir);Boolean RefreshDrawer(Int32 hwnd, Int32 scrnWidth, Int32 scrnHeight, Int32 scrnOrgOffsetPoX, Int32 scrnOrgOffsetPoY);Boolean DrawMapInScreen(Int32 hdc)。

项目启动时,要完成两个重要的初始化工作:海图组件的初始化(Init接口),海图绘制器的初始化(RefreshDrawer接口);然后,在响应目标窗口绘画消息的时候(例如Form的Load事件或者Panel的Paint事件等)调用组件接口(DrawMapScreen),将海图绘制到目标窗口上,即可实现海图的显示。

2.2 坐标转换接口

在开发过程中,通过鼠标操作以及鼠标事件响应,可以获取鼠标当前的桌面坐标,经常需要将桌面坐标和海图的地理坐标进行互相转换,需要用到以下 2个接口函数:void GetGeoPoFromScrnPo(Int32 scrnPoX, Int32 scrnPoY, Int32* retGeoPoX,Int32* retGeoPoY);void GetScrnPoFromGeoPo(Int32 geoPoX, Int32 geoPoY, Int32* retScrnPoX, Int32*retScrnPoY)。

2.3 绘制物标接口

YimaEnc电子海图中的物标主要分为本舰(OwnShip)、目标船(OtherVessel)、自定义物标(以“tm”开头的接口函数添加的物标)。本舰有固定的图层号(LayerPos)和物标号(InnerLayerObjPos);目标船有固定的图层号而没有固定的物标号;自定义物标没有固定的图层号和物标号。每次绘制或者设置海图中某一物标时,本舰可直接进行绘制,目标船要提供物标号,自定义物标需要提供图层号和物标号。通过以下2个接口可以获取图层号或者物标号:int GetOtherVesselPosofID(int vesselID);void tmGetObject PosFromID (int layerID, int innerLayerObjID, ref int retLayerPos, ref int retInnerLayerObjPos)。

3 YimaEnc电子海图开发要点

3.1 经纬度坐标参数

经纬度坐标值为4 byte整型数,其数值为以度为单位的浮点数经纬度坐标值乘以一个固定的乘积因子(MultiFactor = 10 000 000)。

3.2 海图插件中几个Pos概念

YimaEnc电子海图中对象的索引为该对象在其序列中的位置,起始值都为0的整型数,分为一维和多维Pos。一维Pos中:libMapPos表示海图在图库中的索引;memMapPos为内存海图序列中某幅海图的索引;layerPos是图层索引;innerLayerObjPos为物标在图层内部的位置;attrPos表示属性位置。多维Pos中:MEM_GEO_OBJ_POS用于在整个内存海图序列中唯一标识一个物标,包括3个子索引,即 memMapPos、layerPos、innerLayerObjPos;M_GEO_OBJ_POS用于在某一确定的海图内唯一标识一个物标,包括 2个子索引,即 layerPos和innerLayerObjPos。

3.3 ID和Pos概念的区别

如2.3节所述的,绘制物标时都会自动生成相应的图层号或物标号;而设置物标需要提供相应的图层号或物标号。与Pos对应的是ID,即图层或者物标的 ID编号,都是表示在当前海图中所处的一个索引号,然而两者有本质的区别。

在YimaEnc电子海图中,ID表示各种对象(图层或物标等),它是唯一、不可重用的。ID从1开始,在当前项目运行过程中,每添加个图层或者物标,ID从1开始进行加1计数,若删除一个图层或者物标,该 ID不会被回收利用。所以进行设置各种对象时,通过2.3节的两个接口,获取相应的Pos后再绘制图层或物标,否则会出现内存索引无法找到或者内存索引错误。Pos从0开始,与ID不同的是 Pos是回收再利用的,所以当删除一个对象后,再重新设置对象时,该对象的Pos将会变化,此时需要通过2.3节列出的接口进行重新获取当前对象的Pos。

3.4 自定义海图

YimaEnc电子海图提供自定义编辑海图的功能。接口库中所有以“tm”开头的接口函数都是用于自定义海图,自定义海图有两个重点:Layers文件和SymbolEditor工具。Layers文件用于自定义海图图层,可编辑图层类型(包括点、线、面)、图层属性、图层样式等。根据Layers文件中的图层顺序,访问该图层时从索引0开始。YimaEnc电子海图提供了自定义符号库的功能,使用SymbolEditor工具可以进行自定义编辑符号样式(包括点、线、面),工具中的符号编号如3.3节所述的对象ID一样,是不进行回收利用的,编辑完成需要进行符号库的保存。SymbolEditor工具中的符号库可以直接应用在 Layers文件中的图层样式设置中。通过Layers文件和SymbolEditor工具,实现了电子海图显示的多样化。

4 实际应用-自定义接口

可以根据实际的需求,在原YimaEnc海图插件所提供的接口基础上,进行二次自定义接口开发。根据实际项目需求,针对绘制跟踪目标进行的二次接口开发,开发需求为新增跟踪目标点和更新已绘制的跟踪目标点,结合3.3节所述的开发要点,编写了若干个drawTrackNode重载的自定义接口函数:

(1)public int drawTrackNode(double track_lon,double track_lat, int layerPos, int batch, bool ifShowText = false) 功能为绘制跟踪目标节点。通过提供的参数,可直接通过该接口在绘制的同时获取物标索引,再通过海图插件提供的tmGetObjectID FromPos接口获取物标ID和图层ID;返回值是物标索引;参数包括目标经度、目标纬度、图层索引、目标批号、是否显示文本。

(2)public int drawTrackNode(double track_lon,double track_lat, int layerPos, int batch, bool ifShowText = false, bool ifNewSymbol = false) 功能为绘制跟踪目标节点。通过提供的参数,可直接通过该接口在绘制的同时获取物标ID,再通过海图插件提供的 tmGetObjectPosFromID接口获取物标索引;返回值为物标ID;参数包括目标经度、目标纬度、图层索引、目标批号、是否显示文本、是否设置新的符号标识。

(3)public int drawTrackNode(double track_lon,double track_lat, int layerPos, int batch, ref int layerID,bool ifShowText = false) 功能为绘制跟踪目标节点。通过提供的参数,可直接通过该接口在绘制的同时获取物标 ID,再通过海图插件提供的tmGetObjectPosFromID接口获取物标索引;返回值是物标ID;参数包括目标经度、目标纬度、图层索引、目标批号、图层ID的引用、是否显示文本。

(4)public void drawTrackNode(double track_lon, double track_lat, int layerPos, int innerLayer ObjPos, int batch, bool ifShowText = false) 功能为更新原有的目标信息;无返回值;参数包括目标经度、目标纬度、图层索引、物标索引、目标批号、是否显示文本。

针对此类的开发需求,可以对所有点、线、面的海图物标使用类似的自定义接口开发方法,即在绘制的同时返回物标的索引和物标的ID,而无需每次调用获取Pos或ID的函数,从而降低代码的冗余性。除了添加和更新物标,查看和删除物标也同样适用,由于添加和删除的操作会将Pos值进行重新分配而 ID值不变,所以可使用添加物标时所记录下的ID值进行当前Pos值的获取,继而直接使用Pos值进行物标的查看和删除。

5 结语

通过使用 YimaEnc电子海图接口库和在其基础上自定义的接口库,实际使用具有较好的便利性,对软件的UI带来了较好的体现,提高了用户体验。由于该YimaEnc电子海图版本较老,虽可以满足基本的需求,然而若需要获得更加真实、实际的效果,还需要将电子海图进行更新。本课题后续也会对该版本的电子海图在此基础上进行三维化的研究[6],使得显示效果更加贴近实际。

[1]姜均. 基于YIMAENC的电子海图的制作方法[J]. 电脑编程技巧与维护, 2015, (20):77-78.

[2]张振华,王远斌,叶玲.基于 S-57标准的电子海图的设计与实现[J]. 舰船电子工程, 2015, (2):94-98.

[3]郑尧.电子海图与雷达图像的融合显示[J]. 舰船科学技术,2015, 37(2):181-184.

[4]翁跃宗, 孙腾达. 基于电子海图的船舶定线辅助系统软件的实现[J]. 中国航海, 2004, (03):8-11.

[5]李超, 潘明阳. 基于Android的电子海图显示系统研究与实现[J].大连海事大学学报, 2013,39(4):55-58.

[6]扈震,杨之江. 基于 S-57标准的电子海图三维可视化[J].地球科学-中国地质大学学报, 2010,35(3):471-474.

猜你喜欢

跟踪目标海图标号
核相关滤波与孪生网络相结合的目标跟踪算法
纸海图AI小改正制作模式探讨
少林功夫拳(三)
基于图割理论的尺度自适应人脸跟踪算法
非连通图2D3,4∪G的优美标号
连续同色调背景下运动目标自适应跟踪
点亮兵书——《筹海图编》《海防图论》
电子海图在内河船舶综合导航系统中的应用探讨
基于卡尔曼和图像信息量的Mean Shift改进跟踪算法
非连通图D3,4∪G的优美标号