基于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 条评论
登录 后参与评论

相关文章

来自专栏施炯的IoT开发专栏

在Windows Mobile上实现自动拼写和匹配建议

使用Windows Mobile手机的朋友,应该有一个体会,那就是要查找某个联系人,在输入目标联系人名字的过程中,系统会实时按照所输入的内容来筛选,呈现...

1969
来自专栏黄希彤的专栏

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

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

7760
来自专栏AI研习社

基于 TensorFlow 、OpenCV 和 Docker 的实时视频目标检测

在本文中,我将介绍如何在 Docker 容器中使用 Tensorflow Object-detection API 来执行实时(网络摄像头)和视频的目标检测。我...

2382
来自专栏机器之心

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

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

4783
来自专栏平凡文摘

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

1213
来自专栏CreateAMind

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

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

863
来自专栏玉树芝兰

如何用VOSviewer分析CNKI关键词共现?

用VOSviewer尝试CNKI中文文献关键词共现(keyword co-occurence)分析时,你可能会踩到一个大坑。本文帮助你绕开这个坑,或是从坑里爬出...

802
来自专栏崔庆才的专栏

这可能是你见过的最全的网络爬虫干货总结!

昨天的时候我参加了掘金组织的一场 Python 网络爬虫主题的分享活动,主要以直播的形式分享了我从事网络爬虫相关研究以来的一些经验总结,整个直播从昨天下午 1 ...

4585
来自专栏小文博客

在线图片识别系统Ver2.0

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

1.3K2
来自专栏IT派

【机器学习神器之二】深度学习新手平台Floyd

想必每个学习深度学习的小伙伴,特别是新手小白,总要为找到以及调试一个适合的gpu云主机煞费苦心。不知道大家有没有经历过,用自己的显卡计算时,每出一个结果,就能听...

4276

扫码关注云+社区