S57-文件結(jié)構(gòu)分析_第1頁(yè)
S57-文件結(jié)構(gòu)分析_第2頁(yè)
S57-文件結(jié)構(gòu)分析_第3頁(yè)
S57-文件結(jié)構(gòu)分析_第4頁(yè)
S57-文件結(jié)構(gòu)分析_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、S57文件存儲(chǔ)結(jié)構(gòu)、DDRDDR 結(jié)構(gòu)DDRDDR 中定義了文件的總體信息,包括文件名,字段名,字段類型,字段格式和長(zhǎng)度,字段間 的關(guān)系,及子字段.1.1.文件頭區(qū)2424 個(gè)字節(jié),內(nèi)容如下表區(qū)內(nèi)起始地址子字段長(zhǎng)度(字節(jié))項(xiàng)目名內(nèi)容05記錄長(zhǎng)度記錄中的字節(jié)數(shù)51交換級(jí)別3”61頭標(biāo)區(qū)標(biāo)識(shí)符71線內(nèi)擴(kuò)充代碼指不符8版本號(hào)91應(yīng)用指7K符u”(空格)102字段控制長(zhǎng)度站09125字段反基地址字段起始位置 (頭標(biāo)區(qū)加目次 區(qū)字節(jié)長(zhǎng)度173擴(kuò)充字符集指示符“ !(空格!空格)201字段長(zhǎng)度字段的大小19(自定義)211字段位置字段的大小19(自定義)221預(yù)留字“CT231字段標(biāo)識(shí)字段的大小1記錄長(zhǎng)度

2、是指 DDRDDR 的總長(zhǎng)度. .2.2. 記錄區(qū)記錄區(qū)從第 2525 個(gè)字節(jié)開(kāi)始,直到字節(jié)值=30=30 為止.30.30 稱為字段終結(jié)符(FT=30FT=30). .每個(gè)記錄的長(zhǎng)度由:文件頭區(qū)中的,字段長(zhǎng)度大小,字段位置大小,字段標(biāo)識(shí)的大小之和決 定.每個(gè)記錄描述一個(gè),段的基本信息(名稱、長(zhǎng)度、起始位置)每個(gè)記錄是定長(zhǎng)的.3.3. 字段區(qū)記錄區(qū)中的每一條記錄對(duì)應(yīng)一個(gè)字段,然后在字段描述區(qū)進(jìn)一步給出字段的具體信息。每個(gè)字段的描述信息 之間由字段終結(jié)符(FTFT 3030)隔開(kāi)。每個(gè)字段的描述信息 內(nèi)部不同部分 由單元終結(jié)符(UT=31UT=31 )隔開(kāi)。其中每個(gè)字段描述信息的 第一部分為字段

3、的控制信息, 共 9 9 個(gè)字節(jié)組成。起始地址長(zhǎng)度 類型名稱內(nèi)容01數(shù)據(jù)結(jié)構(gòu)代碼o-ffiifi, 1-線性,2-多維,3-其它11數(shù)據(jù)類型代碼“0”字符串】整數(shù)“5”二進(jìn)制“6”混 合2i2輔助控制代碼00”42一可打印圖形氣&” 一63L_截取轉(zhuǎn)義序列詞匯級(jí)別0”詞匯級(jí)別1H詞匯級(jí)別DDRDDR 的第一個(gè)字段 為控制字段,字段名為0000(地址為:目錄區(qū) 后的第一個(gè)字節(jié)(文件頭+目錄區(qū)的長(zhǎng)度)控制字段給出了:件名、及全部字段的結(jié)構(gòu)信息。Field controlsExternal file tite (Not used for &57)UTbst of field tag

4、pairsFT例如:如下控制字段數(shù)據(jù)可生成對(duì)應(yīng)的字段結(jié)構(gòu)圖字段控制字段:-0000;&-0000;&7Csahara.7Csahara. 000-000-OOOICATDOOOIDSIDDSIDDSSTOOOIDSPMOOOIFRTDFRIDFOIDFRIDATTFFRIDNATFFRIDFFOOOICATDOOOIDSIDDSIDDSSTOOOIDSPMOOOIFRTDFRIDFOIDFRIDATTFFRIDNATFFRIDFFPCFRlDFFPTFRIDFSPCFRIDFSPTOOOlVRIDVRIDAnVVRIDVRPCVRJDVRPTVRTDSGCCVRIDPCFRlD

5、FFPTFRIDFSPCFRIDFSPTOOOlVRIDVRIDAnVVRIDVRPCVRJDVRPTVRTDSGCCVRIDSG2DVRIDSG3DSG2DVRIDSG3DDDRDDR 的其余字段 為數(shù)據(jù)描述字段,(地址為:目錄區(qū) 后的第一個(gè)字節(jié)+該字段的偏移量)Field controlsField nameUTArrayArray descdesc riptorriptorUTUTFormatFormat controlscontrolsFTFT例如:如下的字段描述字段為ISO 8211 Record IdcntifierfblS)-記親標(biāo)識(shí)符二進(jìn)制無(wú)符號(hào)整形,精度為 2;1600;&a

6、mp;線形混合型.伺匯級(jí)別 0Catalogue Directory Field-RCNM!RCD!FlIimL!VOIJvIfIMPL!SLAT!WLON!NLAr!EjON!CRCS!COMT-(A(2)5I(10)t3ATA(3)I4RJ2A目錄索引字段;RCNM (記錄名)2 位字符RCID (記錄標(biāo)識(shí)號(hào))1。位整數(shù)FILE (文件名)字符LHL (文件長(zhǎng)名)字符V0LM (卷標(biāo))字符SMPL (實(shí)現(xiàn)方法)3 位字符SLAT (南端緯度實(shí)數(shù)WL0N (西邊經(jīng)度)實(shí)數(shù)NIAT (北邊緯度)實(shí)數(shù)ELON (東邊精度)實(shí)數(shù)CRCS (校驗(yàn)和值)字符C0MT (注釋)字符4.4.程序?qū)崿F(xiàn)S57

7、-文件對(duì)應(yīng)的DDFModul歐,在該類中讀入DDR言息。其中,DDF&件頭存入achLeader中。char achLeadernLeaderSize;/ nLeaderSize=24DDRDDR 中完整數(shù)據(jù)存入:pachRecord中。pachRecord = ( char *) CPLMalloc(_recLength);/ _recLength在文件頭中的第一個(gè)域中定義。根據(jù)DD反件頭中定義內(nèi)容和終止符計(jì)算DDIR字段的記錄個(gè)數(shù)。for ( i = nLeaderSize; i _recLength; i += nFieldEntryWidth )if ( pachRecordi

8、 = DDF_FIELD_TERMINATOR ) break;nFDCount+;在字段的每一條記錄中,得到每一個(gè)字段的標(biāo)識(shí)、 長(zhǎng)度、起始位置(從記錄區(qū)后面的第一個(gè)字節(jié)開(kāi)始計(jì)算)。根據(jù)記錄區(qū)中定義的各字段標(biāo)識(shí)、長(zhǎng)度、起始位置在字段區(qū)中取到該字段對(duì)應(yīng)的描述信息。主要包括字段名稱、描述及在后面數(shù)據(jù)區(qū)中占的位置和轉(zhuǎn)換格式。例如 SG2DSG2D 對(duì)應(yīng)的描述為:2200 ; & J 2-D: Coordiriate lildA*YCOO 1XCOOA(2R) V定義了 Y Y、X X 坐標(biāo)為 2 2 個(gè)實(shí)數(shù)。程序處理中,將每一個(gè)記錄定義為一個(gè)對(duì)象,其基類為: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、指針,而每一個(gè)字段對(duì)應(yīng)一個(gè)指針,故papoFieldDefns為二級(jí)指針。特別注意:switch ( pachFieldArea0)/字段區(qū)的第一個(gè)字節(jié),即控制字段的第一個(gè)字節(jié)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;/字段描述區(qū)字符,在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 個(gè)字段的格式,分別為A A,I(10),3A,A(3),4R,2A,I(10),3A,A(3),4R,2A 定義的子字段存入papoSubfields中,而papoSubfields定義為:DDFSubfie

13、ldDefn *papoSubfields;注意:每一個(gè)字段對(duì)應(yīng)一個(gè)對(duì)象,存入DDFModule類中的DDFFieldDefn *papoFieldDefns;數(shù)組內(nèi)。if ( _data_struct_code!=dsc_elementary )H III而每一個(gè)子字段DDFSubfieldDefn *papoSubfields乂存入字段類DDFFieldDefn中。ApplyFormats功能為將字段區(qū)內(nèi)的格式域應(yīng)用于各子字段中。int DDFFieldDefn:ApplyFormats()char*pszFormatList;char*papszFormatItems;if ( strl

14、en(_formatControls) =0 & *pszPastPrefix = nSubfieldCount )CPLError( CE_Warning, CPLE_AppDefined,格式項(xiàng)與子字段項(xiàng)不 等、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;判斷該字段是否為定長(zhǎng),nFixedWidth = 0;for ( int i = 0; i GetWidth() = 0 )nFixedWidth = 0;只要有一個(gè)子字段不定長(zhǎng)時(shí),則該字段不定長(zhǎng),即nFixedWidth = 0;break ;elsenFixedWidth += papoSubfieldsi-GetWidth();return TRUE;二、DRDR 結(jié)構(gòu)1.1.文件頭區(qū)2424 個(gè)字節(jié),內(nèi)容如下表區(qū)內(nèi)起始地址項(xiàng)目長(zhǎng)度字節(jié))項(xiàng)目名內(nèi)

16、容5.記錄長(zhǎng)度記錄中的字節(jié)數(shù)51交換級(jí)別“3”61頭標(biāo)區(qū)標(biāo)識(shí)符 y71線內(nèi)擴(kuò)充代碼指示符181版本號(hào)Uf 991應(yīng)用指示符空格)1 102字段控制長(zhǎng)度“09,125字段區(qū)基地址字段起始位置頭標(biāo)區(qū)加目次 區(qū)字節(jié)長(zhǎng)度)173擴(kuò)充字符集指不符“ !”(空格!空格)201.字段長(zhǎng)度字段的大小19(自定義)211字段位置字段的大小19(自定義)221預(yù)留字II “0垮231字段標(biāo)識(shí)字段的大小寸記錄長(zhǎng)度是指 DRDR 的總長(zhǎng)度. .3.3.記錄區(qū)與 DDRDDR 相同3.3.字段區(qū)與 DDRDDR 相同DRDR 程序分析:在 DRDR 區(qū)內(nèi)每次讀入一條記錄,存入DDFModul歐內(nèi)的poRecord。而p

17、oRecord類型為:DDFRecord *poRecord;注意:每一個(gè) DRDR 讀入后,即開(kāi)始處理,并未保存poRecord;在每次 DRDR 的讀入過(guò)程中,首先判斷上一次讀入的DRDR 文件頭是否要重要使用,若否,則先讀入該 DRDR 的文件頭。if ( !nReuseHeader )(return ( ReadHeader();其中,nReuseHeade在上一個(gè)DR勺文件頭中定義。if ( _leaderIden =R ) nReuseHeader = TRUE;DRDR 中的數(shù)據(jù)存入DDFRecord類的pachData中。本DR勺字段個(gè)數(shù)存入DDFRecord類中的nField

18、Count。DFfr的字段存入paoFields = newDDFFieldnFieldCount中;初始化paoFields后得到各字段的數(shù)據(jù)、長(zhǎng)度,并在DDFModul歐中定義的DDFFieldDefn *papoFieldDefns;找到對(duì)應(yīng)項(xiàng),取到相應(yīng)的格式。然后,調(diào)用CParseS57_VC6Do中的函數(shù):ViewRecordField來(lái)解析本DR中的全 部字段。得到物標(biāo)的特征屆性數(shù)據(jù)和空間屆性數(shù)據(jù)。DDFFieldDefn *poFieldDefn = poModule-FindFieldDefn(szTag);讀 DRDR 時(shí),調(diào)用oModule.ReadRecord().每個(gè)D

19、FM應(yīng)一個(gè)oModule.ReadRecord().在oModule.ReadRecord()中,先讀出文件頭區(qū),然后讀出記錄區(qū),每條記錄對(duì)應(yīng)一個(gè)字段.然后調(diào)用ViewRecordField來(lái)解析該字段對(duì)應(yīng)的 數(shù)據(jù).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+;字段數(shù)據(jù)解析函數(shù)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)(為空間數(shù)據(jù)就打印,并賦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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論