基於8211lib庫對s57電子海圖的解析和存儲


   此篇博文停止維護,歡迎移步最新地址(含源代碼),https://www.yanlongwang.net/USV/ENC-analysis-store/, 查看最新文章。

   電子海圖是為適用航海需要而繪制的包含海域地理信息和航海信息的一種數字化的專題地圖,符合國際標准的電子海圖數據統稱為S-57電子海圖。本文主要在S-57電子海圖數據的理論模型和數據結構的基礎上,實現對S-57電子海圖數據文件的解析,將海圖信息解析后保存到xml文件中,供后續調用和研究。

  電子導航圖(Electronic Navigational Chart, ENC)是由各個國家的航道官方部門根據國際航道組織的《數字海道測量數據傳輸標准》(S-57標准)而制作的,它是一種面向對象的矢量格式的電子地圖,其存儲形式是二進制,簡稱為S-57標准電子海圖。

  電子海圖的理論模型和數據結構,可以查看國際標准《數字海道測量數據傳輸標准》,這里不再詳述,對應英文版是《IHO TRANSFER STANDARD for DIGITAL HYDROGRAPHIC DATA》。

  S-57標准封轉格式是ISO/IEC 8211國際標准,封裝標准的基礎是文件,邏輯記錄是封裝標准的基本成分。ISO 8211lib是C++編寫的開源庫,專門用於讀取符合ISO 8211封裝標准的數據文件,如S-57電子海圖數據格式和空間數據傳輸標准數據集(SDTS);GDAL是一個開源柵格空間數據轉換庫,其中OGR是對GDAL的擴展,功能與GDAL類似,主要提供對矢量數據格式的讀寫,支持S-57電子海圖格式,其中S57reader類是對ISO 8211lib庫的封裝,該類中包含讀取S-57電子海圖數據文件所用到的基本函數。

  OGR中關於S-57讀取的官方文檔在http://www.gdal.org/drv_s57.html可以看到,其中需要注意OGR的S-57驅動模塊將處理S-57文件里所有的feature要素,其中S-57的特征物標(feature objects)轉換為要素(feature),空間物標(geometry objects)自動轉換化對應要素下的空間幾何對象。

  在OGR中,從S-57文件讀取的所有要素根據物標類型(OBJL)歸屬於相應的圖層,可以類比於GIS里的shape格式,對應的圖層下有要素(feature),要素下面有字段(field)和幾何對象(geometry),要素的幾何形狀可以從幾何形狀中獲取,要素屬性可以從字段中獲取。

  其中,深度信息(Depth soundings)是S-57文件特有的,在讀取Depth soundings需要設置S57 Control Options中的ADD_SOUNDG_DEPTH選項為ON,對於S57 Control Options和讀取和導出的深層次知識請移http://www.gdal.org/drv_s57.html

  最后,注意在程序中附加s57objectclasses.csv, and s57attributes.csv文件,否則會缺少信息,如圖層只有5層,無法讀取等深線等,官方是這么解釋的,The S-57 reader depends on having two supporting files, s57objectclasses.csv, and s57attributes.csv available at runtime in order to translate features in an object class specific manner. These should be in the directory pointed to by the environment variable S57_CSV, or in the current working directory.

  因為項目需要,需要把S-57文件里特定圖層的信息提取出來,S-57文件解析后,我把感興趣的信息保存到xml文件中,方便后續的處理。在C++中,對XML文件處理中,使用一個開源的解析XML的解析庫--TinyXML,能夠用於C++,這個解析庫的模型通過解析XML文件,然后在內存中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹。

  最后,解析和存儲效果如下圖所示,按圖層要素順序依次組織,需要程序資料或者有問題的可以下面留言!

   ps.如果無法得到一個object class的屬性或者值不正確,如VALDCO的值始終為0,注意是否加載了S-57的支持文件.csv, The solution to that is to set the GDAL_DATA environment variable to point the directory with the s57objectclasses.csv and related files,具體可以參見 http://osgeo-org.1560.x6.nabble.com/OGR-to-access-s57-file-missing-attributes-issue-td3742926.html 的解析。

  編譯須知:程序開發環境是VS2015,其中需要在編譯的時候修改兩個位置,如下圖所示,否則編譯會報錯。

 

 文獻鏈接參考:

  《數字海道測量數據傳輸標准》

  http://www.gdal.org/drv_s57.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM