




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、S57文件存储结构、DDRDDR 结构DDRDDR 中定义了文件的总体信息,包括文件名,字段名,字段类型,字段格式和长度,字段间 的关系,及子字段.1.1.文件头区2424 个字节,内容如下表区内起始地址子字段长度(字节)项目名内容05记录长度记录中的字节数51交换级别3”61头标区标识符71线内扩充代码指不符8版本号91应用指7K符u”(空格)102字段控制长度站09125字段反基地址字段起始位置 (头标区加目次 区字节长度173扩充字符集指示符“ !(空格!空格)201字段长度字段的大小19(自定义)211字段位置字段的大小19(自定义)221预留字“CT231字段标识字段的大小1记录长度
2、是指 DDRDDR 的总长度. .2.2. 记录区记录区从第 2525 个字节开始,直到字节值=30=30 为止.30.30 称为字段终结符(FT=30FT=30). .每个记录的长度由:文件头区中的,字段长度大小,字段位置大小,字段标识的大小之和决 定.每个记录描述一个,段的基本信息(名称、长度、起始位置)每个记录是定长的.3.3. 字段区记录区中的每一条记录对应一个字段,然后在字段描述区进一步给出字段的具体信息。每个字段的描述信息 之间由字段终结符(FTFT 3030)隔开。每个字段的描述信息 内部不同部分 由单元终结符(UT=31UT=31 )隔开。其中每个字段描述信息的 第一部分为字段
3、的控制信息, 共 9 9 个字节组成。起始地址长度 类型名称内容01数据结构代码o-ffiifi, 1-线性,2-多维,3-其它11数据类型代码“0”字符串】整数“5”二进制“6”混 合2i2辅助控制代码00”42一可打印图形气&” 一63L_截取转义序列词汇级别0”词汇级别1H词汇级别DDRDDR 的第一个字段 为控制字段,字段名为0000(地址为:目录区 后的第一个字节(文件头+目录区的长度)控制字段给出了:件名、及全部字段的结构信息。Field controlsExternal file tite (Not used for &57)UTbst of field tag
4、pairsFT例如:如下控制字段数据可生成对应的字段结构图字段控制字段:-0000;&-0000;&7Csahara.7Csahara. 000-000-OOOICATDOOOIDSIDDSIDDSSTOOOIDSPMOOOIFRTDFRIDFOIDFRIDATTFFRIDNATFFRIDFFOOOICATDOOOIDSIDDSIDDSSTOOOIDSPMOOOIFRTDFRIDFOIDFRIDATTFFRIDNATFFRIDFFPCFRlDFFPTFRIDFSPCFRIDFSPTOOOlVRIDVRIDAnVVRIDVRPCVRJDVRPTVRTDSGCCVRIDPCFRlD
5、FFPTFRIDFSPCFRIDFSPTOOOlVRIDVRIDAnVVRIDVRPCVRJDVRPTVRTDSGCCVRIDSG2DVRIDSG3DSG2DVRIDSG3DDDRDDR 的其余字段 为数据描述字段,(地址为:目录区 后的第一个字节+该字段的偏移量)Field controlsField nameUTArrayArray descdesc riptorriptorUTUTFormatFormat controlscontrolsFTFT例如:如下的字段描述字段为ISO 8211 Record IdcntifierfblS)-记亲标识符二进制无符号整形,精度为 2;1600;&a
6、mp;线形混合型.伺汇级别 0Catalogue Directory Field-RCNM!RCD!FlIimL!VOIJvIfIMPL!SLAT!WLON!NLAr!EjON!CRCS!COMT-(A(2)5I(10)t3ATA(3)I4RJ2A目录索引字段;RCNM (记录名)2 位字符RCID (记录标识号)1。位整数FILE (文件名)字符LHL (文件长名)字符V0LM (卷标)字符SMPL (实现方法)3 位字符SLAT (南端纬度实数WL0N (西边经度)实数NIAT (北边纬度)实数ELON (东边精度)实数CRCS (校验和值)字符C0MT (注释)字符4.4.程序实现S57
7、-文件对应的DDFModul欧,在该类中读入DDR言息。其中,DDF&件头存入achLeader中。char achLeadernLeaderSize;/ nLeaderSize=24DDRDDR 中完整数据存入:pachRecord中。pachRecord = ( char *) CPLMalloc(_recLength);/ _recLength在文件头中的第一个域中定义。根据DD反件头中定义内容和终止符计算DDIR字段的记录个数。for ( i = nLeaderSize; i _recLength; i += nFieldEntryWidth )if ( pachRecordi
8、 = DDF_FIELD_TERMINATOR ) break;nFDCount+;在字段的每一条记录中,得到每一个字段的标识、 长度、起始位置(从记录区后面的第一个字节开始计算)。根据记录区中定义的各字段标识、长度、起始位置在字段区中取到该字段对应的描述信息。主要包括字段名称、描述及在后面数据区中占的位置和转换格式。例如 SG2DSG2D 对应的描述为:2200 ; & J 2-D: Coordiriate lildA*YCOO 1XCOOA(2R) V定义了 Y Y、X X 坐标为 2 2 个实数。程序处理中,将每一个记录定义为一个对象,其基类为:DDFFieldDefnDDFFi
9、eldDefn *poFDefn;AddField( poFDefn );void DDFModule:AddField( DDFFieldDefn *poNewFDefn )nFieldDefnCount+;papoFieldDefns = (DDFFieldDefn *)CPLRealloc(papoFieldDefns, sizeof (void *)*nFieldDefnCount);papoFieldDefnsnFieldDefnCount-1 = poNewFDefn;其中:DDFFieldDefn *papoFieldDefns;注:*poFDefn本身为DDFFieldDefn
10、指针,而每一个字段对应一个指针,故papoFieldDefns为二级指针。特别注意:switch ( pachFieldArea0)/字段区的第一个字节,即控制字段的第一个字节case 0:_data_struct_code = dsc_elementary; break;if(旧uildSubfields() return FALSE;if ( !ApplyFormats() return FALSE;其中,BuildSubfields定义如下:int DDFFieldDefn:BuildSubfields() char *papszSubfieldNames;const char *psz
11、Sublist = _arrayDescr;/字段描述区字符,在Initialize中定义if ( pszSublist0 =*)bRepeatingSubfields = TRUE;pszSublist+;papszSubfieldNames = CSLTokenizeStringComplex( pszSublist, FALSE, FALSE );int nSFCount = CSLCount( papszSubfieldNames );for ( int iSF = 0; iSF SetName( papszSubfieldNamesiSF);AddSubfield( poSFDefn
12、, TRUE );CSLDestroy( papszSubfieldNames );return TRUE;例如:1600;& Catalogue Directory FieldRCXAfRCID:FILE:LFIL:VOLM:IMPL:SLAT:WLON:NLAT:ELON: CRCS! COMT (A(2), 1(10), 3A, A(3), 4R, 2A)共定义了 1212 个字段的格式,分别为A A,I(10),3A,A(3),4R,2A,I(10),3A,A(3),4R,2A 定义的子字段存入papoSubfields中,而papoSubfields定义为:DDFSubfie
13、ldDefn *papoSubfields;注意:每一个字段对应一个对象,存入DDFModule类中的DDFFieldDefn *papoFieldDefns;数组内。if ( _data_struct_code!=dsc_elementary )H III而每一个子字段DDFSubfieldDefn *papoSubfields乂存入字段类DDFFieldDefn中。ApplyFormats功能为将字段区内的格式域应用于各子字段中。int DDFFieldDefn:ApplyFormats()char*pszFormatList;char*papszFormatItems;if ( strl
14、en(_formatControls) =0 & *pszPastPrefix = nSubfieldCount )CPLError( CE_Warning, CPLE_AppDefined,格式项与子字段项不 等、s.n , pszTag );break;if ( !papoSubfieldsiFormatItem-SetFormat(pszPastPrefix) return FALSE;CSLDestroy( papszFormatItems );if ( iFormatItem nSubfieldCount )CPLError( CE_Failure, CPLE_AppDefi
15、ned,Got less formats than subfields for field、s,n”pszTag );return FALSE;判断该字段是否为定长,nFixedWidth = 0;for ( int i = 0; i GetWidth() = 0 )nFixedWidth = 0;只要有一个子字段不定长时,则该字段不定长,即nFixedWidth = 0;break ;elsenFixedWidth += papoSubfieldsi-GetWidth();return TRUE;二、DRDR 结构1.1.文件头区2424 个字节,内容如下表区内起始地址项目长度字节)项目名内
16、容5.记录长度记录中的字节数51交换级别“3”61头标区标识符 y71线内扩充代码指示符181版本号Uf 991应用指示符空格)1 102字段控制长度“09,125字段区基地址字段起始位置头标区加目次 区字节长度)173扩充字符集指不符“ !”(空格!空格)201.字段长度字段的大小19(自定义)211字段位置字段的大小19(自定义)221预留字II “0垮231字段标识字段的大小寸记录长度是指 DRDR 的总长度. .3.3.记录区与 DDRDDR 相同3.3.字段区与 DDRDDR 相同DRDR 程序分析:在 DRDR 区内每次读入一条记录,存入DDFModul欧内的poRecord。而p
17、oRecord类型为:DDFRecord *poRecord;注意:每一个 DRDR 读入后,即开始处理,并未保存poRecord;在每次 DRDR 的读入过程中,首先判断上一次读入的DRDR 文件头是否要重要使用,若否,则先读入该 DRDR 的文件头。if ( !nReuseHeader )(return ( ReadHeader();其中,nReuseHeade在上一个DR勺文件头中定义。if ( _leaderIden =R ) nReuseHeader = TRUE;DRDR 中的数据存入DDFRecord类的pachData中。本DR勺字段个数存入DDFRecord类中的nField
18、Count。DFfr的字段存入paoFields = newDDFFieldnFieldCount中;初始化paoFields后得到各字段的数据、长度,并在DDFModul欧中定义的DDFFieldDefn *papoFieldDefns;找到对应项,取到相应的格式。然后,调用CParseS57_VC6Do中的函数:ViewRecordField来解析本DR中的全 部字段。得到物标的特征届性数据和空间届性数据。DDFFieldDefn *poFieldDefn = poModule-FindFieldDefn(szTag);读 DRDR 时,调用oModule.ReadRecord().每个D
19、FM应一个oModule.ReadRecord().在oModule.ReadRecord()中,先读出文件头区,然后读出记录区,每条记录对应一个字段.然后调用ViewRecordField来解析该字段对应的 数据.while ( (poRecord = oModule.ReadRecord() != NULL )(/ debuginfo(DDFRecordstartn);for ( int iField = 0; iField GetFieldCount();iField+ )(DDFField *poField = poRecord-GetField( iField );ViewRecor
20、dField( poField );nFieldCount+;nRecordCount+;字段数据解析函数void CParseS57Doc:ViewRecordField(DDFField * poField)(int nBytesRemaining;const char *pachFieldData;DDFFieldDefn *poFieldDefn = poField-GetFieldDefn();char str300;if (strncmp(poFieldDefn-GetName(), VRID, 4)=0)|(strncmp(poFieldDefn-GetName(), FRID,
21、 4)=0)(为空间数据就打印,并赋m_datatype值m_datatype=NEED_TYPE;elseif(strncmp(poFieldDefn-GetName(),ATTF,4)=0)( m_datatype=OBJT_TYPE|SUB3_TYPE;else if (strncmp(poFieldDefn-GetName(), FSPT, 4) = 0)(m_datatype=OBJT_TYPE|SUB4_TYPE;pachFieldData = poField-GetData();nBytesRemaining = poField-GetDataSize();int iRepeat;for ( iRepeat = 0; iRepeat GetRepeatCount(); iRepeat+ ) (int iSF;for ( iSF = 0; iSF GetSubfieldCount(); iSF+ )(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数据库的安全性与管理策略试题及答案
- 托儿所火灾应急预案范文(3篇)
- 软件设计师考试核心试题及答案解析
- 计算机软件考试常见错误分析
- 行政管理社会服务试题及答案总结
- 便捷复习的试题及答案高效利用
- 企业财务健康状况与战略制定的关系试题及答案
- 高考数学难题攻略与答案
- 法学概论的重要概念归纳与试题及答案
- 2025年网络安全架构与运营考察试题及答案
- 聚酯装置生产操作工:高级聚酯装置生产操作工
- 氟硅酸钠安全技术说明书MSDS
- 2023年乒乓球二级裁判考试题库(含答案)
- 《如何处理人际关系》课件
- 成立危急重症抢救小组通知1
- 国际恐怖主义形势与趋势分析
- 人工智能在人力资源招聘中的应用
- 国家中小学智慧教育平台培训专题讲座
- 文艺晚会人员分工完整
- 关于运营工作计划模板汇编
- 安全生产知识与管理能力考核合格证申请表(安全生产管理人员)
评论
0/150
提交评论