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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小文博客

在线图片识别系统Ver2.0

该工具是小文博客基于Django框架开发的图片识别系统,调用腾讯云API,目前可识别身份证、驾驶证、行驶证、营业执照、印刷体、手写体等十几种图片。在Ver1.0...

2.9K2
来自专栏CreateAMind

ROS深入探索(五)——创建简单的机器人模型smartcar

前面我们使用的是已有的机器人模型进行仿真,这一节我们将建立一个简单的智能车机器人smartcar,为后面建立复杂机器人打下基础。

1043
来自专栏Python小屋

Python使用三种方法批量修改记事本文件编码格式

应用背景:近期计划写一个贝叶斯算法邮件分类的教学案例,苦于没有足够的训练集,就让同学们帮忙每人从自己的邮箱中找几封垃圾邮件把内容复制下来放到记事本文件中发给我,...

1012
来自专栏平凡文摘

你真的很熟分布式和事务吗?

1313
来自专栏黄希彤的专栏

内部体验腾讯负载均衡的新功能

腾讯云近期将推出的新的负载均衡轮询算法,新算法被称为“最小连接数”算法,也就是LB会随时判断哪台主机上的HTTP连接数最少,然后尽量把新的请求分发给它。

8560
来自专栏精讲JAVA

你真的很熟分布式和事务吗?

微吐槽 hello,world. 不想了,我等码农,还是看看怎么来处理分布式系统中的事务这个老大难吧! 本文略长,读者需要有一定耐心,如果你是高级码农或者架构师...

2129
来自专栏机器之心

教程 | 如何使用Docker、TensorFlow目标检测API和OpenCV实现实时目标检测和视频处理

选自TowardsDataScience 作者:Léo Beaucourt 机器之心编译 参与:李诗萌、路雪 本文展示了如何使用 Docker 容器中的 Ten...

4706
来自专栏存储

你真的很熟分布式和事务吗?

微吐槽 hello,world. 不想了,我等码农,还是看看怎么来处理分布式系统中的事务这个老大难吧! 本文略长,读者需要有一定耐心,如果你是高级码农或者架构师...

2359
来自专栏张戈的专栏

《Vimtutor的中文版》快速学习Linux的vim命令

注:本资源收集与网络,版权归原作者所有。 下载地址 ---- = 欢 迎 阅 读 《 V I M 教 程 》 —— 版本 1.5 = vim 是一个具有很多命令...

4538
来自专栏机器之心

教程 | 如何使用Kubernetes GPU集群自动训练和加速深度学习?

选自GitHub 机器之心编译 参与:蒋思源、Smith、吴攀 像 Docker 这样的容器格式和 Kubernetes 之类的容器管理平台正越来越受到人们的欢...

6193

扫码关注云+社区

领取腾讯云代金券