首页 OPENCPN空间对象(Spatialobject)构建

OPENCPN空间对象(Spatialobject)构建

举报
开通vip

OPENCPN空间对象(Spatialobject)构建西安融成科技有限公司出品KeyWords:opencpn电子海图OPENCPN空间对象(Spatialobject)构建1.1概述本文针对s57格式海图中空间对象从海图原始文件ENC文件读取到写入SENC文件之前整个演变过程予以比较详细的分析。1.2空间对象从s57ENC到GDAL几何对象首先,谈到空间对象,需要一个空间对象的准确定义。标准给出的空间对象的定义为:一个包含真实世界实体的位置相关信息的对象。它在s57标准中对现实世界实体建模中与特征对象(FeatureObject)一同构成对现实实体的描述。空间对象不...

OPENCPN空间对象(Spatialobject)构建
西安融成科技有限公司出品KeyWords:opencpn电子海图OPENCPN空间对象(Spatialobject)构建1.1概述本文针对s57 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 海图中空间对象从海图原始文件ENC文件读取到写入SENC文件之前整个演变过程予以比较详细的 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 。1.2空间对象从s57ENC到GDAL几何对象首先,谈到空间对象,需要一个空间对象的准确定义。 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 给出的空间对象的定义为:一个包含真实世界实体的位置相关信息的对象。它在s57标准中对现实世界实体建模中与特征对象(FeatureObject)一同构成对现实实体的描述。空间对象不能单独存在,它必须依赖于一个特征对象。而特征对象一般要引用一个或者多个空间对象,也可以不引用空间对象。目前,标准只定义了向量模型这一种模型来描述二维的空间对象。包括0,1,2维的对象:节点(Nodes),边(Edge),面(Face)。利用这些对象,可以采用四种拓扑结构:无拓扑(Cartographicspaghetti),链状拓扑(Chain-node),平面图形拓扑,全拓扑。而S57ENC采用了链状拓扑结构,也就是说只利用了节点和边对象,而没有面。S57ENC文件格式符合ISO/IEC8211标准数据描述文件格式。标准的具体格式不在此处展开。一个空间对象,包括点,边,或者面(ENC中不包括面)在ENC文件中的存储结构为:这里说明其中几在OpenCpn中使用的关键字段,其它字段或子字段请参考s57标准www.opencpn.cnwww.rochern.com西安融成科技有限公司出品KeyWords:opencpn电子海图文档。VRID:空间对象的标示符字段,该字段中RCNM和RCID子字段组合在当前ENC文件中唯一标示了该空间对象。RVER子字段为空间对象版本字段,RUIN为更新指令字段,这两个字段主要在自动更新中使用。ATTV:空间对象属性字段。VRPC:自动更新控制字段,该字段只出现在自动更新文件中。VRPT:指针字段,存储了空间独享之间的引用关系,指向该空间对象引用的其它空间对象。其中最关键的是NAME子字段,它给出了所引用的空间对象的唯一标示。其实就是RCNM和RCID的组合。SGCC:坐标字段控制字段,只出现在自动更新文件中。SG2D,SG3D:2d,3d坐标字段,记录了2d或者3d的坐标值(整数值,考虑到不同平台对浮点数的处理方式不同,所以采用了整数值来记录坐标值,在实际本地处理时要除一个转换因子,该因子在ENC文件的对象中有记录)。其中3d坐标中YCOO,XCOO子字段 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示坐标2d位置,VE3D表示在该位置出现的量值,比如水深值。所有的空间对象都以这种结构存储在ENC文件中。下面我们看Opencpn如何从ENC中读取这些数据。Opencpn中的S57Reader类正是用来读取ENC文件的。S57Reader中封装了DDFModule类,该类负责实际ENC文件的实际读取操作。在Opencpn中读取ENC其实非常简单,用ENC的文件路径构造一个S57Reader对象,然后调用S57Reader的Open方法,此时文件指针其实已经指向了ENC中的DR(已经完成了对DDR的读取(DDR相当于ENC文件的头,包含一些描述性的内容,不包含实际的海图数据)),每一个DR(DataRecord)对应于57模型的一个Object,所以实际的海图数据都包含在DR中。Open函数调用结束之后,文件指正便指向了第一个DR的起始处。然后调用S57Reader的Ingest函数,该函数执行完毕之后所有的ENC数据实际上已经全部读取完毕。按照不同的类型存放在S57Reader的oVI_Index,oVC_Index,oVE_Index,oVF_index以及oFE_Index成员中。每一条DR在内存中以DDFRecord对象存在。如此,ENC已读取完毕,所有的空间对象都已被读入内存。下面的任务是将内存中的空间对象转换存储至SENC。在Opencpn中SENC文件的后缀为.s57。空间对象存储至SENC的过程在s57chart的BuildSENCFile函数中完成。我们在前面提到过,空间对象不能单独存在,必须依赖于特征对象而存在,也就是说一个空间对象肯定被某个特征对象所引用。考虑到文件传输效率,在ENC中任何空间对象都不会出现重复,在当前这种建模方式下,必然会出现相同的空间对象在多个特征对象中出现的情况。在ENC中通过建立引用关系来实现一个空间对象被多个特征对象引用的状况。而Opencpn在构建SENC文件之前将这种引用关系都进行了解引用。将空间对象纳入特征对象,还原了一个完整的现实世界对象(Object)。这个被还原的对象在Opencpn中用类OGRFeature来描述。OGRFeature中类型为OGRGeometry的成员poGeometry即描述Object中的空间对象部分。这个OGRGeometry对象如何构造出来?Opencpn中的www.opencpn.cnwww.rochern.com西安融成科技有限公司出品KeyWords:opencpn电子海图AssembleFeature函数完成了这个工作。AssembleFeature所做的事情就是利用Ingest函数的主要输出:oVI_Index,oVC_Index,oVE_Index,oVF_index以及oFE_Index(存放了DDRRecord对象数组),来生成一个OGRFeature对象。我们将视线转向OGRFeature对象的空间对象构造部分。在AssembleFeature函数中调用AssembleSoundingGeometry,AssemblePointGeometry,AssembleLineGeometry,AssembleAreaGeometry这四个函数来构造空间对象部分。我们分析一下AssemblePointGeometry和相对复杂的AssembleAreaGeometry,AssembleLineGeometry。首先来看AssemblePointGeometry:我们需要为某个特征对象构建其对应的点空间对象,第一步要知道特征对象对应的空间对象是哪一个,这个信息在特征对象的FSPT字段中指出,这个我们在前面有介绍。通过DDFRecord(一个特征对象的数据目前也存储在DDFRecord中)类提供的便捷的方法可以获取DDFRecord中的任何一个字段和子字段的信息。有了FSPT字段的数据,Opencpn遍历oVI_Index包含的数组(单独的点空间对象包含在oVI_Index中,所谓的isolatednode),找到对应的DDFRecord,然后获取到记录中的SG2D字段,其子字段XCOO,YCOO即为点的坐标值数据。用这两个坐标数据构造一个GDAL的点几何对象OGRPoint,这便是OGRFeature的空间对象部分。这样一个点对象的构建就完成了。下面是AssembleAreaGeometry,在这之前我们需要对线和面对象的构造做一些说明。其实是链状拓扑的相关内容。ENC中只是用了点,和边两种对象,是用了VI,VC,和VE,并没有使用VF向量模型。单独的点对象比较直观简单,此处不赘述(水深点相对特殊一些,只是把多个点当做一个点对象看待)。VI和VC都是节点,两者的区别在于VI为孤立点,或者水深点。孤立点用来表示单独的类似于物标的对象。VC是connectednode,在Chain-node拓扑中,VC不能独立存在,它只能被VE引用用来构成线对象。VE用来表示边(Edge)对象,一个Edge由2部分组成,起始终止点,和中间坐标点。起始点和终止点的坐标值并没有直接放置在Edge对象中,而是通过VRPT指针来引用VC对象。如上图所示。同时上图展示了一个线空间对象在Opencpn中的构成方式,也即是AssembleLineGeometry函数中构建线空间对象的过程:1.由特征对象的FSPT字段,可能存在多个,在特征对象为一条线(PRIM字段为2)或面(PRIM为3)时,FSPT字段指向的肯定是一个或者多个EDGE。www.opencpn.cnwww.rochern.com西安融成科技有限公司出品KeyWords:opencpn电子海图2.找到FSPT字段中的NAME字段,其中记录的被引用的EDGE对象的唯一标示。3.通过该唯一标示在oVE_Index中找到所有的EDGEDDFRecord。4.按照FSPT字段在特征对象中的出现顺序,找到第一个EDGEDDFRecord的VRPT字段,该字段一般存在两个,分别为起始或者终止点,至于具体哪个为起始点,哪个为终止点,由特征对象的FSPT字段的ORNT子字段决定。5.将第一个EDGE的起始点VRPT字段指向的VC点作为线空间对象的第一个点。6.之后是第一个EDGE对象直接包含的坐标点(可能为空),按照其在文件中的顺序添加到线空间对象中。7.将第一个EDGE的终止点VRPT字段指向的VC点追加至线空间对象。8.取下一个EDGE对象,只将其直接包含的坐标点以及终止点VRPT字段指向的VC追加至线空间对象。(上图中VC2和VC3是同一个点,VC4和VC5是同一个点,因此该EDGE对象不需要追加起始点VRPT字段指向的VC)9.重复步骤8直至最后一个EDGE对象。经过以上步骤便获得了该线空间对象的所有点,并且按照顺序追加到一个GDAL的OGRLineString对象中。一个OGRLineString对象生成,作为现实对象的空间对象部分。即OGRFeature的poGeometry成员。至于AssembleareaGeometry与上述过程的差别在于Area对象的第一个Edge对象的起始点和最后一个EDGE对象的终止点是同一个点。另外,Opencpn在构造GDAL的OGRPolygon对象(Opencpn的面对象轮廓)时,只是单纯的将各个EDGE对象构成一个OGRLineString对象,然后将多个OGRLineString对象构成的OGRGeometryCollection对象传递给BuildOGRPolygonFromEdges函数来构建一个OGRPolygon对象,作为OGRFeatrue的空间对象部分。最终的SENC文件中存储的空间对象就是将GDAL的几何对象(OGRPoint,OGRLineString,OGRPOlygon等等)以二进制方式直接写入文件。下面的过程我们将在以后的文章中进行详尽的描述。西安融成科技有限公司出品摘选自:wwwdotopencpndotcn/OpenCPNDocs/OPENCPNS57标准介绍.pdfwww.opencpn.cnwww.rochern.com
本文档为【OPENCPN空间对象(Spatialobject)构建】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
arnaya
暂无简介~
格式:pdf
大小:329KB
软件:PDF阅读器
页数:4
分类:
上传时间:2022-07-01
浏览量:23