




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、S57文件存儲結構、DDRDDR 結構DDRDDR 中定義了文件的總體信息,包括文件名,字段名,字段類型,字段格式和長度,字段間 的關系,及子字段.1.1.文件頭區(qū)2424 個字節(jié),內容如下表區(qū)內起始地址子字段長度(字節(jié))項目名內容05記錄長度記錄中的字節(jié)數51交換級別3”61頭標區(qū)標識符71線內擴充代碼指不符8版本號91應用指7K符u”(空格)102字段控制長度站09125字段反基地址字段起始位置 (頭標區(qū)加目次 區(qū)字節(jié)長度173擴充字符集指示符“ !(空格!空格)201字段長度字段的大小19(自定義)211字段位置字段的大小19(自定義)221預留字“CT231字段標識字段的大小1記錄長度
2、是指 DDRDDR 的總長度. .2.2. 記錄區(qū)記錄區(qū)從第 2525 個字節(jié)開始,直到字節(jié)值=30=30 為止.30.30 稱為字段終結符(FT=30FT=30). .每個記錄的長度由:文件頭區(qū)中的,字段長度大小,字段位置大小,字段標識的大小之和決 定.每個記錄描述一個,段的基本信息(名稱、長度、起始位置)每個記錄是定長的.3.3. 字段區(qū)記錄區(qū)中的每一條記錄對應一個字段,然后在字段描述區(qū)進一步給出字段的具體信息。每個字段的描述信息 之間由字段終結符(FTFT 3030)隔開。每個字段的描述信息 內部不同部分 由單元終結符(UT=31UT=31 )隔開。其中每個字段描述信息的 第一部分為字段
3、的控制信息, 共 9 9 個字節(jié)組成。起始地址長度 類型名稱內容01數據結構代碼o-ffiifi, 1-線性,2-多維,3-其它11數據類型代碼“0”字符串】整數“5”二進制“6”混 合2i2輔助控制代碼00”42一可打印圖形氣&” 一63L_截取轉義序列詞匯級別0”詞匯級別1H詞匯級別DDRDDR 的第一個字段 為控制字段,字段名為0000(地址為:目錄區(qū) 后的第一個字節(jié)(文件頭+目錄區(qū)的長度)控制字段給出了:件名、及全部字段的結構信息。Field controlsExternal file tite (Not used for &57)UTbst of field tag
4、pairsFT例如:如下控制字段數據可生成對應的字段結構圖字段控制字段:-0000;&-0000;&7Csahara.7Csahara. 000-000-OOOICATDOOOIDSIDDSIDDSSTOOOIDSPMOOOIFRTDFRIDFOIDFRIDATTFFRIDNATFFRIDFFOOOICATDOOOIDSIDDSIDDSSTOOOIDSPMOOOIFRTDFRIDFOIDFRIDATTFFRIDNATFFRIDFFPCFRlDFFPTFRIDFSPCFRIDFSPTOOOlVRIDVRIDAnVVRIDVRPCVRJDVRPTVRTDSGCCVRIDPCFRlD
5、FFPTFRIDFSPCFRIDFSPTOOOlVRIDVRIDAnVVRIDVRPCVRJDVRPTVRTDSGCCVRIDSG2DVRIDSG3DSG2DVRIDSG3DDDRDDR 的其余字段 為數據描述字段,(地址為:目錄區(qū) 后的第一個字節(jié)+該字段的偏移量)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+;在字段的每一條記錄中,得到每一個字段的標識、 長度、起始位置(從記錄區(qū)后面的第一個字節(jié)開始計算)。根據記錄區(qū)中定義的各字段標識、長度、起始位置在字段區(qū)中取到該字段對應的描述信息。主要包括字段名稱、描述及在后面數據區(qū)中占的位置和轉換格式。例如 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)/字段區(qū)的第一個字節(jié),即控制字段的第一個字節(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 個字段的格式,分別為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功能為將字段區(qū)內的格式域應用于各子字段中。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.文件頭區(qū)2424 個字節(jié),內容如下表區(qū)內起始地址項目長度字節(jié))項目名內
16、容5.記錄長度記錄中的字節(jié)數51交換級別“3”61頭標區(qū)標識符 y71線內擴充代碼指示符181版本號Uf 991應用指示符空格)1 102字段控制長度“09,125字段區(qū)基地址字段起始位置頭標區(qū)加目次 區(qū)字節(jié)長度)173擴充字符集指不符“ !”(空格!空格)201.字段長度字段的大小19(自定義)211字段位置字段的大小19(自定義)221預留字II “0垮231字段標識字段的大小寸記錄長度是指 DRDR 的總長度. .3.3.記錄區(qū)與 DDRDDR 相同3.3.字段區(qū)與 DDRDDR 相同DRDR 程序分析:在 DRDR 區(qū)內每次讀入一條記錄,存入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()中,先讀出文件頭區(qū),然后讀出記錄區(qū),每條記錄對應一個字段.然后調用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. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全知識法試題及答案
- 2025年電動汽車電池熱管理系統(tǒng)熱管理效率優(yōu)化與創(chuàng)新研究報告
- 安全技能比武試題及答案
- 安全工作教育試題及答案
- 物業(yè)品質培訓課件目錄
- 魔鏡檢測皮膚培訓課件
- 重疾保險培訓課件
- 《編制說明蒙農1號蒙古冰草提純復壯技術規(guī)程》
- 中班家園共育課件
- 冬季生產安全培訓
- 上海市重點建設項目社會穩(wěn)定風險評估報告編制指南2025
- 數字化情報資源管理-洞察闡釋
- 北京市2025學年高二(上)第一次普通高中學業(yè)水平合格性考試物理試題(解析版)
- 2025年四川省高考物理試卷真題(含答案)
- 炸雞店的產品創(chuàng)新與口味調研
- 陜西省銅川市2025年八下英語期末監(jiān)測試題含答案
- 社區(qū)工作者綜合能力考試基礎知識試題及答案
- 山西焦煤集團所屬煤炭子公司招聘筆試題庫2025
- 墊付醫(yī)療費協(xié)議書
- 2025年福建省廈門市中考物理模擬試卷
- 2024年陜西省普通高中學業(yè)水平合格性考試語文試題(原卷版+解析版)
評論
0/150
提交評論