S57-文件结构分析

2019-02-26 10:36

S57文件存储结构

一、 DDR结构

DDR中定义了文件的总体信息, 包括文件名, 字段名, 字段类型, 字段格式和长度, 字段间的关系, 及子字段.

1. 文件头区

24个字节, 内容如下表

记录长度是指DDR的总长度.

2. 记录区

记录区从第25个字节开始, 直到字节值=30为止. 30称为字段终结符(FT=30).

每个记录的长度由: 文件头区中的, 字段长度大小, 字段位置大小, 字段标识的大小之和决定.

每个记录描述一个字段的基本信息(名称、长度、起始位置). 每个记录是定长的.

3.字段区

记录区中的每一条记录对应一个字段,然后在字段描述区进一步给出字段的具体信息。每个字段的描述信息之间由字段终结符(FT 30)隔开。每个字段的描述信息内部不同部分由单元终结符(UT=31)隔开。其中每个字段描述信息的第一部分为字段的控制信息, 共9个字节组成。

DDR的第一个字段为控制字段,字段名为\(地址为:目录区后的第一个字节(文件头+

目录区的长度))

控制字段给出了文件名、及全部字段的结构信息。

例如:如下控制字段数据可生成对应的字段结构图

DDR的其余字段为数据描述字段,(地址为:目录区后的第一个字节+该字段的偏移量)。

例如:如下的字段描述字段为

4.程序实现

S57-文件对应的DDFModule类,在该类中读入DDR信息。其中,DDR文件头存入achLeader中。

char achLeader[nLeaderSize]; // nLeaderSize =24

DDR中完整数据存入:pachRecord中。

pachRecord = (char *) CPLMalloc(_recLength);// _recLength在文件头中的第一个域中定义。

根据DDR文件头中定义内容和终止符计算DDR中字段的记录个数。

for( i = nLeaderSize; i < _recLength; i += nFieldEntryWidth ) {

if( pachRecord[i] == DDF_FIELD_TERMINATOR ) break;

nFDCount++; }

在字段的每一条记录中,得到每一个字段的标识、长度、起始位置(从记录区后面的第一个字节开始计算)。

根据记录区中定义的各字段标识、长度、起始位置在字段区中取到该字段对应的描述信息。主要包括字段名称、描述及在后面数据区中占的位置和转换格式。例如SG2D对应的描述为:

定义了Y、X坐标为2个实数。

程序处理中,将每一个记录定义为一个对象,其基类为:DDFFieldDefn

DDFFieldDefn *poFDefn;

AddField( poFDefn );

void DDFModule::AddField( DDFFieldDefn *poNewFDefn ) {

nFieldDefnCount++;

papoFieldDefns = (DDFFieldDefn **)

CPLRealloc(papoFieldDefns, sizeof(void*)*nFieldDefnCount); papoFieldDefns[nFieldDefnCount-1] = poNewFDefn; }

其中:DDFFieldDefn **papoFieldDefns;

注:*poFDefn本身为DDFFieldDefn指针,而每一个字段对应一个指针,故

papoFieldDefns为二级指针。

特别注意:

switch( pachFieldArea[0] )

//字段区的第一个字节,即控制字段的第一个字节 {

case '0':

_data_struct_code = dsc_elementary; break; }

if( _data_struct_code

!= dsc_elementary )

{

if( !BuildSubfields() ) return FALSE;

if( !ApplyFormats() ) return FALSE; }

其中,BuildSubfields定义如下:

int DDFFieldDefn::BuildSubfields() {

char **papszSubfieldNames;

const char *pszSublist = _arrayDescr; //字段描述区字符,在Initialize中定义 if( pszSublist[0] == '*' ) {

bRepeatingSubfields = TRUE; pszSublist++; }

papszSubfieldNames = CSLTokenizeStringComplex( pszSublist, \, FALSE, FALSE ); int nSFCount = CSLCount( papszSubfieldNames ); for( int iSF = 0; iSF < nSFCount; iSF++ ) {

DDFSubfieldDefn *poSFDefn = new DDFSubfieldDefn; poSFDefn->SetName( papszSubfieldNames[iSF] ); AddSubfield( poSFDefn, TRUE ); }

CSLDestroy( papszSubfieldNames ); return TRUE; }

例如:

共定义了12个字段的格式,分别为A(2),I(10),3A,A(3),4R,2A。


S57-文件结构分析.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:武鸣县2013年第十三期国有建设用地使用权

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: