此篇博文停止维护,欢迎移步最新地址(含源代码),https://www.yanlongwang.net/USV/ENC-analysis-store.md/, 查看最新文章。

电子海图是为适用航海需要而绘制的包含海域地理信息和航海信息的一种数字化的专题地图,符合国际标准的电子海图数据统称为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

[暂停维护]基于8211lib库对s57电子海图的解析和存储的更多相关文章

  1. 基于8211lib库对s57电子海图的解析和存储

    电子海图是为适用航海需要而绘制的包含海域地理信息和航海信息的一种数字化的专题地图,符合国际标准的电子海图数据统称为S-57电子海图.本文主要在S-57电子海图数据的理论模型和数据结构的基础上,实现对S ...

  2. 基于Mapxtreme for JAVA的电子地图设计与实现

    基于Mapxtreme for JAVA的电子地图设计与实现学生毕业设计,适合测绘类专业研究目标:        开发一个基于MapXtreme for JAVA的校园电子地图项目,使用MapInfo ...

  3. WebGIS中基于控制点库进行SHP数据坐标转换的一种查询优化策略

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 目前项目中基于控制点库进行SHP数据的坐标转换,流程大致为:遍 ...

  4. 基于 libpcap库的sniffer程序

    基于 libpcap库的sniffer程序 Libpcap库是WireSharek和Tcpdump抓包程序的基础,利用libcap我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的 ...

  5. 基于Platinum库的DMS实现(android)

    接上篇博文:基于Platinum库的DMR实现(android) 文章讲述了如何使用Platinum库实现DMR 今天同样使用该库,来讲解一下DMS的实现 关于该库如何编译,请参考这篇博文:NDK下 ...

  6. 基于jsmpeg库下使用ffmpeg创建视频流连接websocket中继器传输视频并播放

    这个功能的基本工作是这样的: 1.使用node运行jsmpeg库下的websocket-relay.js文件,这个文件的作用是创建一个websocket视频传输中继器 2.运行ffmpeg,将输出发送 ...

  7. STM32F1固件库文件讲解与基于固件库新建MDK工程模板

    操作系统:win10 1.文件目录 (在cmd下用"cd 文件夹" 进入到要显示的文件夹,如cd d:\en.stsw-stm32054,然后输入tree 回车就会出现上图的目录结 ...

  8. 【GMT43智能液晶模块】基于HAL库的SDRAM和LCD驱动例程(MDK工程&CubeMX工程)

    说明: 1.该工程基于HAL库实现动态存储器SDRAM驱动以及液晶控制器LCD驱动. 2.工程通过STM32CubeMX(Version 4.22.0)配置生成,可直接打开进行配置. 3.KEIL M ...

  9. Use Laravel/homestead 环境维护基于 brophp 开发的老项目

    1 前言 laravel/homestead 无疑是 laravel 项目开发的最佳环境. 如何使用这个环境维护基于 Brophp (或 Thinkphp) 开发的老项目呢? 以下是测试成功的步骤. ...

随机推荐

  1. java学习(东软睿道)2019-09-06(预课)《随堂笔记》

    2019-09-06 13:19:56 1.变量:java  名称 2.服务器server 客户端client                         uft8   ascll 3.Java ...

  2. Oracle快速运行一指禅

      对于oracle数据库下的企业级应用开发,经常会使用到新建用户,新建表空间以及数据的迁移工作.虽然目前互联网存在很多单个问题的解决方案,但是比较零散,本博文结合研发兄弟们的实际现状,提供一套完整初 ...

  3. LeetCode. 计数质数

    题目要求: 统计所有小于非负整数 n 的质数的数量. 示例i: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 代码: class Soluti ...

  4. Laravel三种中间件的作用

    $middleware 属性: 这个属性称为全局中间件,为什么说是全局中间件呢?因为你的每一次请求,这里面的每个中间件都会执行. $routeMiddleware 属性: 这个属性称为路由中间件,为什 ...

  5. 计算机网络(TCP/IP)

    概述:网络协议通常分不同的层次进行开发,每一层分别不同的通信功能.TCP/IP通常分为4层协议系统. 1.链路层,有时也称为数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网 ...

  6. java项目上线的流程(将web项目部署到公网)

    本博文来源于网络,原文的地址在本篇博文最下方. 如何将java web项目上线/部署到公网 关于如何将Java Web上线,部署到公网,让全世界的人都可以访问的问题.小编将作出系列化,完整的流程介绍. ...

  7. hdu 1502 大数dp

    对于每一个dp的问题 从其最优解的结构(分哪几种形式或者情况)入手 然后分析状态 这样就比较好找出状态转方程这里数据结构的选择很简单 顺序数组就可以 填充的方式顺序填充就可以 然后这道题目卡了我大数. ...

  8. iOS开发中常用的颜色及其对应的颜色值

      R G B 值   R G B 值   R G B 值 黑色 0 0 0 #000000 黄色 255 255 0 #FFFF00 浅灰蓝色 176 224 230 #B0E0E6 象牙黑 41 ...

  9. Linux设备驱动中的软件架构思想

    目录 更新记录 一.Linux驱动的软件架构 1.1 出发点 1.2 分离思想 1.3 分层思想 二.platform设备驱动 2.1 platform设备 2.2 platform驱动 2.3 pl ...

  10. vue中非父子组件的传值bus的使用

    非父子之间的组件传值,可以使用vuex.简单的状态管理,也可以用vue bus vue bus可以实现不同组件间.不同页面间的通信,比如我在A页面出发点击事件,要B页面发生变化,使用方法如下: 全局定 ...