唐經(jīng)宇,劉東峰,孫粵輝,程 昱,仝國明
(廣東工業(yè)大學(xué)信息工程學(xué)院,廣東 廣州,510006)
電子海圖顯示與信息系統(tǒng)ECDIS(Electronic Chart Display and Information System)是以數(shù)字形式儲存的海圖及其相關(guān)數(shù)據(jù)與多種傳感設(shè)備、圖形顯示終端、計算機(jī)軟硬件等高度融合的船舶航行多參數(shù)電子綜合信息處理系統(tǒng)。隨著信息化在航海領(lǐng)域的不斷深入,ECDIS的普及是必然趨勢,國際海事組織IMO 已開始討論ECDIS的強(qiáng)制安裝。目前全球電子海圖技術(shù)標(biāo)準(zhǔn)以國際海道測量組織IHO 的系列標(biāo)準(zhǔn)為主。
IHO S-52“電子海圖現(xiàn)實(shí)與信息系統(tǒng)內(nèi)容與顯示規(guī)范”[1]規(guī)定:ECDIS必須以電子航海圖ENC(Electronic Nautical/Navigational Chart)為數(shù)據(jù)來源,ENC 必須符合IHO S-57“數(shù)字海道測量數(shù)據(jù)傳輸標(biāo)準(zhǔn)”[2]。S-57 實(shí)質(zhì)為針對數(shù)據(jù)傳遞和交換的傳輸標(biāo)準(zhǔn),由于效率原因它不能作為ECDIS的內(nèi)部數(shù)據(jù)格式。S-52標(biāo)準(zhǔn)規(guī)定ECDIS必須設(shè)計高效的系統(tǒng)電子航海圖SENC 的用戶格式,將S-57文件的海圖數(shù)據(jù)和改正數(shù)據(jù)導(dǎo)入到SENC 中。S-57數(shù)據(jù)集文件的讀取、數(shù)據(jù)改正和物標(biāo)信息解析處理是構(gòu)建ECDIS的三個基礎(chǔ)環(huán)節(jié)。
目前,成熟的S-57電子海圖開發(fā)工具主要為商業(yè)軟件,由于價格昂貴,應(yīng)用范圍較小。現(xiàn)有的通用GIS軟件對S-57格式的支持都較有限。林志輝[3]用GIS開源庫OGR 實(shí)現(xiàn)S-57數(shù)據(jù)導(dǎo)入空間數(shù)據(jù)庫,但OGR 不支持S-57目錄文件,它在S-57數(shù)據(jù)集的整體處理上功能有限。近年來國內(nèi)一些高校的科研人員在各自的電子海圖軟件中實(shí)現(xiàn)了S-57文件處理模塊[4~9],它們都能對S-57數(shù)據(jù)文件進(jìn)行解包讀取,但都沒有同時支持?jǐn)?shù)據(jù)改正和物標(biāo)信息解析這兩項(xiàng)功能。而且它們都是面向自定義的用戶數(shù)據(jù)格式設(shè)計的,通用性上存在不足。我國電子海圖研究開發(fā)需要功能豐富、通用性好的S-57海圖文件處理軟件。
本文在分析S-57標(biāo)準(zhǔn)的理論數(shù)據(jù)模型、數(shù)據(jù)結(jié)構(gòu)和產(chǎn)品規(guī)范的基礎(chǔ)上,設(shè)計實(shí)現(xiàn)了一套S-57海圖文件基礎(chǔ)處理庫,具備對S-57數(shù)據(jù)集文件進(jìn)行讀取、數(shù)據(jù)改正和物標(biāo)信息解析三項(xiàng)基礎(chǔ)處理功能。該庫用C++編寫,與具體的用戶數(shù)據(jù)結(jié)構(gòu)和格式無關(guān),以較通用的方式提供處理功能。該庫可應(yīng)用于S-57電子海圖研究和相關(guān)軟件開發(fā)。
S-57即《IHO 數(shù)字海道測量數(shù)據(jù)傳輸標(biāo)準(zhǔn)》,目前為2000年11月修訂的第3.1版。該規(guī)范由三部分組成,下含兩個附錄:第一部分“引言”;第二部分“理論數(shù)據(jù)模型”;第三部分“數(shù)據(jù)結(jié)構(gòu)”;附錄A“IHO 物標(biāo)類目”;附錄B“ENC產(chǎn)品規(guī)范”。
在S-57標(biāo)準(zhǔn)的“模型概述”部分中,真實(shí)世界的實(shí)體被定義為描述特征和空間特征的組合;物標(biāo)被定義為一組可標(biāo)識的信息,由特征物標(biāo)和空間物標(biāo)組合而成。特征物標(biāo)含有描述信息但不帶幾何信息,空間物標(biāo)必須有幾何信息同時可能帶描述信息。特征物標(biāo)可以不參照空間物標(biāo)而存在,前者由與一個或多個空間物標(biāo)的關(guān)系定位??臻g物標(biāo)必須參照特征物標(biāo)而存在。關(guān)系模型如圖1所示。
“模型實(shí)現(xiàn)”定義了四類特征物標(biāo):元物標(biāo)、制圖物標(biāo)、地理物標(biāo)、集合物標(biāo);定義了三類空間物標(biāo):矢量型、光柵型和矩陣型。目前S-57標(biāo)準(zhǔn)實(shí)際只使用矢量型空間物標(biāo),其幾何圖元分為點(diǎn)、邊和面三種。當(dāng)前S-57 產(chǎn)品規(guī)范強(qiáng)制使用“鏈-結(jié)點(diǎn)”拓?fù)涞燃?,該等級下矢量由一組結(jié)點(diǎn)和邊表示:點(diǎn)被編碼成孤立結(jié)點(diǎn)或連結(jié)點(diǎn);線被編碼成一組邊和連結(jié)點(diǎn),邊必須以連結(jié)點(diǎn)為起點(diǎn)和終點(diǎn);面被編碼成一組邊的閉合環(huán),其起點(diǎn)和終點(diǎn)為同一連結(jié)點(diǎn)。
S-57數(shù)據(jù)結(jié)構(gòu)中最基本的單位是子字段,一個或多個子字段組成字段;一個或多個字段組成記錄;一個或多個記錄構(gòu)成文件;一個交換集由一個或多個文件組成。記錄分為五種:數(shù)據(jù)集描述記錄、目次記錄、特征記錄、空間記錄、數(shù)據(jù)字典記錄。S-57數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)上采用樹形結(jié)構(gòu)。不同記錄和字段中的信息由專門的指針字段關(guān)聯(lián)。RCNM 和RICD 子字段標(biāo)識共同作為記錄的標(biāo)識。
Figure 1 S-57Theoretical data model diagram圖1 S-57理論數(shù)據(jù)模型示意圖
S-57文件使用ISO/IEC 8211 作為物理封裝標(biāo)準(zhǔn),實(shí)現(xiàn)不依賴具體計算機(jī)系統(tǒng)的數(shù)據(jù)交換。ISO/IEC 8211是一個以文件為基礎(chǔ)的交換格式,其基本結(jié)構(gòu)是邏輯記錄。
S-57定義了電子航海圖數(shù)據(jù)改正機(jī)制,規(guī)定了EN(基本電子航海圖數(shù)據(jù))和ER(電子航海圖修正數(shù)據(jù))兩種應(yīng)用簡檔。ER 中改正記錄采用了與原版海圖數(shù)據(jù)一致的數(shù)據(jù)結(jié)構(gòu),并在特征記錄和空間記錄中加入了特殊的字段用于改正。改正操作通過將改正記錄作用于目標(biāo)記錄而完成。S-57改正機(jī)制可改正已發(fā)行的數(shù)據(jù),而不必重新發(fā)布整個數(shù)據(jù)集。
Figure 2 S-57data update process圖2 S-57數(shù)據(jù)改正流程
附錄B“產(chǎn)品規(guī)范”的第二章規(guī)定ENC 數(shù)據(jù)必須采用“鏈-結(jié)點(diǎn)”拓?fù)潢P(guān)系編碼。第三章給出了ENC中允許的物標(biāo)和屬性。第四章對ENC 進(jìn)行了制圖方面的限定,要求所有坐標(biāo)數(shù)據(jù)不能使用浮點(diǎn)數(shù)而必須用乘數(shù)因子轉(zhuǎn)換為整數(shù)。第五章規(guī)定了S-57交換集的內(nèi)容和形式:一個ENC交換集必須由一個目錄文件和至少一個數(shù)據(jù)集文件組成,目錄文件記錄了交換集中所有文件的路徑;初始版數(shù)據(jù)文件擴(kuò)展名為000,之后的改正文件擴(kuò)展名依次為001至999,每一新版加1。第六章規(guī)定了交換集中數(shù)據(jù)集文件和目錄文件的結(jié)構(gòu)與內(nèi)容。
電子海圖數(shù)據(jù)從S-57文件導(dǎo)入到SENC需經(jīng)過三個環(huán)節(jié):文件讀取、海圖改正處理和物標(biāo)解析,故本程序庫分為文件讀取、改正處理和物標(biāo)信息解析三個模塊。讀取模塊完整地保持文件的海圖數(shù)據(jù),基本保持?jǐn)?shù)據(jù)的原始邏輯結(jié)構(gòu)。改正模塊在內(nèi)存中對海圖數(shù)據(jù)進(jìn)行改正處理。物標(biāo)信息解析模塊可提取幾何信息、屬性/類目信息。各功能可按需選用,不面向具體的用戶格式數(shù)據(jù)結(jié)構(gòu)。設(shè)計上采用面向?qū)ο蠓椒?,開發(fā)語言為C++,廣泛應(yīng)用STL技術(shù)。讀取模塊可獨(dú)立工作,改正模塊與解析模塊互不依賴。本庫的UML類圖如圖3所示。
ISO 8211Lib 是一款用C++編寫的用于ISO/IEC 8211格式文件解包的開源庫。本文使用ISO 8211Lib,將其裝到ReadSubField類作為函數(shù)對象,用于S-57文件解包。
Figure 3 UML class diagram圖3 UML類圖
為產(chǎn)品規(guī)范的應(yīng)用簡檔所規(guī)定的各種結(jié)構(gòu)設(shè)計對應(yīng)的數(shù)據(jù)結(jié)構(gòu),各字段設(shè)計為結(jié)構(gòu)體;各記錄設(shè)計為類,F(xiàn)eatureBaseCell類與FeatureRecUpdateCell類分別對應(yīng)EN 和ER 的特征記錄,VectorBaseCell類與VectorUpdateCell類分別對應(yīng)EN 和ER 的空間記錄;ChartBaseCell類、ChartUpdateCell類和Catalogue類分別對應(yīng)基礎(chǔ)數(shù)據(jù)文件、改正數(shù)據(jù)文件和目錄文件。記錄類用STL容器和智能指針類模板auto_ptr存放各字段對應(yīng)的結(jié)構(gòu)體,文件類用STL容器存放規(guī)定的記錄類,它們基本保持所對應(yīng)的文件結(jié)構(gòu)的原始邏輯關(guān)系。
各字段結(jié)構(gòu)體中,整數(shù)型子字段用int型存儲,字符型子字段用STL的string類型存儲,外部指針子字段用unsigned char數(shù)組存儲。指針字段VRPT、FSPT、FFPT 的結(jié)構(gòu)體增設(shè)額外的成員變量以存儲解碼后的指針信息。VRPT 字段對應(yīng)的結(jié)構(gòu)體的定義代碼如下所示,其指針原始數(shù)據(jù)存于name數(shù)組,解碼后的指針信息存于額外成員name_rcnm 和name_rcid:
ChartBaseCell類、ChartUpdateCell類和Catalogue類提供公有方法Load用于文件讀取,該方法的參數(shù)接受文件路徑,將文件各記錄、各字段的數(shù)據(jù)讀入對應(yīng)的類和結(jié)構(gòu)體。Catalogue類從目錄文件讀取所有基礎(chǔ)數(shù)據(jù)文件和改正文件的路徑。本庫實(shí)現(xiàn)FullPathDecomposor類提供路徑和文件名處理功能,供Catalogue類使用。Catalogue類提供公共方法進(jìn)行S-57標(biāo)準(zhǔn)要求的CRC(Cyclic Redundancy Check)文件校驗(yàn)。ChartBaseCell用三個map容器分別存儲孤立結(jié)點(diǎn)空間記錄、連結(jié)點(diǎn)空間記錄、邊空間記錄,map的key為空間記錄的RCID 值?;A(chǔ)數(shù)據(jù)文件讀取流程圖如圖4所示。
Figure 4 Basic data file read flow chart圖4 基礎(chǔ)數(shù)據(jù)文件讀取流程圖
改正UpdateProcessor類實(shí)現(xiàn)處理功能,它減小了ChartBaseCell類和ChartUpdateCell類的耦合。UpdateProcessor類提供公共方法Update執(zhí)行改正處理,原型如下:
int Update(ChartBaseCell &chart,const ChartUpdateCell &chart_updt);
Update方法將參數(shù)2中的改正數(shù)據(jù)應(yīng)用于參數(shù)1進(jìn)行更新處理,改正完成后的海圖數(shù)據(jù)仍保存于參數(shù)1。
改正記錄也分為特征記錄和空間記錄兩種,它們的改正操作分為插入、刪除、修改三類,記錄的標(biāo)識字段的RUIN 子字段指示要進(jìn)行何種操作。目標(biāo)記錄由改正記錄的標(biāo)識字段的子字段RCNM 和RCID 標(biāo)識。記錄的插入和刪除操作皆以記錄為整體進(jìn)行,而記錄修改則包括記錄內(nèi)字段的插入、刪除和修改三種操作。字段修改的實(shí)現(xiàn)方式又分為兩類,第一類以字段屬性是否在目標(biāo)記錄中出現(xiàn)過指示操作,第二類以專門的控制字段指示操作。FeatureBaseCell類與VectorBaseCell類實(shí)現(xiàn)了三種字段修改操作的接口函數(shù),ChartBaseCell類實(shí)現(xiàn)了記錄改正操作的接口函數(shù)。UpdateProcessor的Update方法驗(yàn)證兩參數(shù)的升級信息匹配正確后,調(diào)用前述接口進(jìn)行改正處理。改正處理流程圖如圖5所示。
Figure 5 Update processing flow chart圖5 改正處理流程圖
本庫物標(biāo)信息解析模塊分為幾何信息解析和屬性/類目信息解析兩個子模塊,前者實(shí)現(xiàn)為GeomProcessor類,后者實(shí)現(xiàn)為AttrObjClassInfo-Processor類,兩者互不依賴。
4.3.1 物標(biāo)幾何信息解析
物標(biāo)的幾何信息解析,即獲取物標(biāo)的幾何圖元類型(點(diǎn)、線、面)和完整的幾何坐標(biāo)。物標(biāo)的點(diǎn)、線、面圖元都以點(diǎn)為基礎(chǔ)。點(diǎn)分為二維點(diǎn)和三維點(diǎn)(后者只用于水深數(shù)據(jù),第三維表示深度),前兩維表示經(jīng)緯度坐標(biāo)。S-57 文件中坐標(biāo)數(shù)據(jù)皆為整型,SG2D 和SG3D 字段對應(yīng)的結(jié)構(gòu)體用于保存點(diǎn)坐標(biāo)的數(shù)據(jù)結(jié)構(gòu);GeomProcessor類將解析得到的物標(biāo)的整型坐標(biāo)數(shù)據(jù)用乘數(shù)因子轉(zhuǎn)換為浮點(diǎn)型,為此設(shè)計結(jié)構(gòu)體PintFloat2D_t和PintFloat3D_t用于保存浮點(diǎn)型坐標(biāo)值。
SG2D 字段的結(jié)構(gòu):
SG3D 字段的結(jié)構(gòu):
物標(biāo)的幾何圖元類型由特征記錄FRID 字段的PRIM 子字段獲得。坐標(biāo)從特征記錄的FSPT(特征記錄到空間記錄指針)字段指向的各個空間記錄的坐標(biāo)字段中提取。流程如下:
(1)點(diǎn)物標(biāo)的坐標(biāo)解析。從相應(yīng)空間記錄的SG2D、SG3D 字段獲取坐標(biāo)數(shù)據(jù);用STL的vector容器存儲。
(2)線物標(biāo)的坐標(biāo)解析。按空間物標(biāo)VRPT字段的ORNT 子字段指示的方向,先獲取起始連結(jié)點(diǎn)坐標(biāo),再獲取邊的各孤立點(diǎn)坐標(biāo),最后獲取終止連結(jié)點(diǎn)坐標(biāo);用兩層嵌套的vector容器存儲,每個內(nèi)層vector容器存儲一條邊。
(3)面物標(biāo)的坐標(biāo)解析。先將構(gòu)成面的各邊解析出來;遍歷這些邊并判斷是否構(gòu)成閉環(huán),若是,則獲得面的一個封閉輪廓;用兩層嵌套的vector容器存儲,每個內(nèi)層vector容器存儲一個封閉輪廓。
GeomProcessor類提供公有方法GenObjGeomInt,對ChartBaseCell對象的所有物標(biāo)進(jìn)行幾何解析,結(jié)果存儲于STL的map容器中,map的key為特征物標(biāo)的RCID 值,物標(biāo)的特征信息與幾何信息通過map容器的key-value映射關(guān)系實(shí)現(xiàn)關(guān)聯(lián)。GeomProcessor類亦提供數(shù)個接口用于處理單個物標(biāo)。
4.3.2 物標(biāo)屬性/類目信息解析
物標(biāo)屬性信息解析,即根據(jù)物標(biāo)屬性字段的值獲得S-57規(guī)定的對應(yīng)屬性的信息,包括屬性名稱、縮略詞等。物標(biāo)類目信息解析,即根據(jù)文件物標(biāo)特征記錄FRID 字段的OBJL 子字段標(biāo)記的S-57物標(biāo)代碼獲得物標(biāo)類目的信息,包括物標(biāo)類名稱、縮略詞、相關(guān)屬性等。
本庫定義了兩個多維char*型常量數(shù)組s57attributes[]和s57Classes[],以字符串分別存儲S-57標(biāo)準(zhǔn)規(guī)定的物標(biāo)屬性和物標(biāo)類目兩個參考表的主要信息。AttrObjClassInfoProcessor類以這兩個數(shù)組為基礎(chǔ),提供數(shù)種方法用于獲取物標(biāo)屬性/類目信息,以STL的string類返回。
采用本庫在Windows XP 下編寫了一個功能演示程序,其對S-57海圖文件進(jìn)行處理并在命令行界面以文本形式輸出信息。圖6為演示程序的部分輸出結(jié)果,所讀取的基礎(chǔ)數(shù)據(jù)文件為US4NY24M.000(大小615KB),讀取的改正文件為 US4NY24M.001 (大小 26.6KB)和US4NY24M.002(大小2KB),讀取后進(jìn)行了數(shù)據(jù)改正和物標(biāo)信息解析處理。
Figure 6 Output of demo application processing S-57chart file data圖6 經(jīng)演示程序處理的S-57海圖文件數(shù)據(jù)輸出結(jié)果
圖6a顯示了一個類目名為“Compilation scale of data”的物標(biāo),其第一個ATTF字段的屬性名為“Compilation scale”(倒數(shù)第二行);圖6b第二行顯示物標(biāo)幾何類型為“面”,后續(xù)顯示各點(diǎn)未用乘數(shù)因子轉(zhuǎn)換的經(jīng)緯度原始值。
目前該庫在我們的項(xiàng)目《基于LINUX/GTK的嵌入式ECDIS軟件》中,應(yīng)用于S-57數(shù)據(jù)集文件讀取及用戶格式數(shù)據(jù)庫導(dǎo)入底層模塊的開發(fā)。
本文實(shí)現(xiàn)的程序庫具備S-57電子海圖數(shù)據(jù)集文件讀取、改正處理和物標(biāo)信息解析功能。文件讀取模塊能夠讀取S-57數(shù)據(jù)集目錄文件、基礎(chǔ)數(shù)據(jù)文件和改正文件,保證數(shù)據(jù)完整性,較好地保持了數(shù)據(jù)的原始邏輯結(jié)構(gòu)。改正模塊對讀取到內(nèi)存的海圖數(shù)據(jù)進(jìn)行改正處理。物標(biāo)信息解析模塊可獲取物標(biāo)的幾何信息和屬性/類目信息。各功能模塊之間獨(dú)立性較好,與具體的用戶格式數(shù)據(jù)結(jié)構(gòu)無關(guān),具備一定的通用性。在當(dāng)前S-57海圖文件處理軟件數(shù)量和功能都不豐富的情況下,本庫對電子海圖研究和軟件開發(fā)具有一定實(shí)際意義。
[1]IHO.S-52-specifications for chart content and display aspects of ECDIS(Edition 6.0)[EB/OL].[2011-10-10].http://www.iho.int/iho_pubs/standard/S52/S-52_e6.0_EN.pdf.
[2]IHO.IHO transfer standard for digital hydrographic data publication S-57(Edition 3.1).[EB/OL].[2011-10-10].http://www.iho.int/iho_pubs/maint/S57md8.pdf.
[3]Lin Zhi-hui,Yu Meng-hong.Research on the design of electronic nautical chart database of IBS[J].Science Technology and Engineering,2010,10(13):3148-3152.(in Chinese)
[4]Tang Bao-xiang.Reading of S-57format and automatic multimode display of electronic chart[D].Guangzhou:Guangdong University of Technology,2010.(in Chinese)
[5]Wang Xiao-feng.Research on electrical chart display system[D].Harbin:Harbin Institute of Technology,2010.(in Chinese)
[6]Tan Xiao-zhi.The design and implementation of ECS compliant with international standards[D].Dalian:Dalian Maritime University,2003.(in Chinese)
[7]Li Xing-feng.Electronic chart display and navigation system based on S-57international standard[D].Xi'an:Xidian University,2007.(in Chinese)
[8]Zou Kun.Studies on the key technologies of electronic chart display and modification[D].Dalian:Dalian Maritime Uni-versity,2009.(in Chinese)
[9]Meng Ling-qiang.The research on the key technologies of the ENC based on VC[D].Dalian:Dalian Maritime University,2010.(in Chinese)
附中文參考文獻(xiàn)
[3]林志輝,俞孟蕻.綜合船橋系統(tǒng)電子海圖數(shù)據(jù)庫設(shè)計研究[J].科學(xué)技術(shù)與工程,2010,10(13):3148-3152.
[4]唐葆祥.S-57格式電子海圖數(shù)據(jù)讀取以及分層顯示[D].廣州:廣東工業(yè)大學(xué),2010.
[5]王曉鋒.S-57標(biāo)準(zhǔn)電子海圖顯示平臺的研究[D].哈爾濱:哈爾濱工業(yè)大學(xué),2010.
[6]譚曉智.符合國際標(biāo)準(zhǔn)的電子海圖基礎(chǔ)平臺的設(shè)計與實(shí)現(xiàn)[D].大連:大連海事大學(xué),2003.
[7]李興鋒.基于S-57 國際標(biāo)準(zhǔn)的電子海圖顯示與導(dǎo)航系統(tǒng)[D].西安:西安電子科技大學(xué),2007.
[8]鄒坤.電子海圖顯示與改正的關(guān)鍵技術(shù)研究[D].大連:大連海事大學(xué),2009.
[9]孟令強(qiáng).基于VC的電子海圖關(guān)鍵技術(shù)研究[D].大連:大連海事大學(xué),2010.