2.1.7 電子海圖系統(tǒng)解析及開發(fā) 海圖解析 -- 讀取ISO/IEC 8211文件

通過上文的內(nèi)容,已經(jīng)了解到S-57文件符合ISO/IEC 8211作為其數(shù)據(jù)封裝標(biāo)準(zhǔn)膳音。一個文件已分成若干個邏輯記錄(LR)召衔,每一個LR有三個基本元素頭標(biāo)區(qū)(對應(yīng)類S57Leader)、目錄區(qū)(對應(yīng)類S57Directory)和字段區(qū)祭陷,其中文件中的第一個LR為DDR(存儲文件中實際數(shù)據(jù)的描述和邏輯結(jié)構(gòu)苍凛,對應(yīng)類S57DDR),其他的LR為DR(存儲文件中的實際數(shù)據(jù)兵志,對應(yīng)類S57DR)醇蝴。

S-57文件封裝標(biāo)準(zhǔn)

依照上圖,新建類Iso8211File解析S-57文件想罕,主要包含一個S57DDR字段和一個List<S57DR>列表悠栓。由于DDR和DR的頭標(biāo)區(qū)與目錄區(qū)格式一致霉涨,因此將字段S57Leader和字段S57Directory放到類S57LR中,讓DDR和DR繼承自LR惭适。DDR的字段區(qū)包含字段控制字段數(shù)據(jù)描述字段笙瑟,因此類S57DDR還包含字段S57FieldControlField和字段S57DataDescriptiveFields。DR的字段區(qū)解析邏輯與DDR不一樣癞志,因此類S57DR還包含字段S57FieldArea往枷。最后得到如下代碼結(jié)構(gòu):

    public class S57LR
    {
        public S57Leader Leader;                                //頭標(biāo)區(qū)
        public S57Directory Directory;                          //目錄區(qū)
    }

    public class S57DDR : S57LR
    {
        public S57FieldControlField FieldControlField;          //字段區(qū) 字段控制字段
        public S57DataDescriptiveFields DataDescriptiveFields;  //字段區(qū) 數(shù)據(jù)描述字段
    }

    public class S57DR : S57LR
    {
        public S57FieldArea FieldArea;                          //字段區(qū) 字段控制字段
    }

    public class Iso8211File
    {
        public S57DDR DDR;
        public List<S57DR> DRs;
    }

接下來,完成Iso8211File的構(gòu)造函數(shù)凄杯,輸入?yún)?shù)為S-57文件的路徑错洁。首先解析出文件的DDR頭標(biāo)區(qū)、目錄錄戒突、字段控制字段和數(shù)據(jù)描述字段屯碴,利用其信息,循環(huán)解析出其他DR膊存,具體代碼如下:

        //構(gòu)造函數(shù)窿锉,傳入S57文件路徑
        public Iso8211File(string filePath)
        {
            DDR = new S57DDR();
            DRs = new List<S57DR>();

            //加載S57文件,得到二進制數(shù)據(jù)
            BytesHelper.Load(filePath);

            //DDR 頭標(biāo)區(qū)
            DDR.Leader = new S57Leader();

            //DDR 目錄區(qū)
            DDR.Directory = new S57Directory(DDR.Leader);

            //DDR 字段區(qū)
            //DDR 字段控制字段
            var tag0000 = DDR.Directory.Items[0];
            DDR.FieldControlField = new S57FieldControlField(tag0000.FieldLength, DDR.Leader.FieldTagSize);

            //DDR 數(shù)據(jù)描述字段
            DDR.DataDescriptiveFields = new S57DataDescriptiveFields(DDR.Directory);

            //循環(huán)解析DR
            while (BytesHelper.Position < BytesHelper.ENCBytes.Length - 2)
            {
                var dr = new S57DR();

                //DR 頭標(biāo)區(qū)
                dr.Leader = new S57Leader();

                //DR 目錄區(qū)
                dr.Directory = new S57Directory(dr.Leader);

                //DR 字段區(qū)
                dr.FieldArea = new S57FieldArea(dr.Directory, DDR.DataDescriptiveFields);

                DRs.Add(dr);
            }
        }

最后驗證結(jié)果:

            var reader = new Iso8211File("..\\US4AK7IM.000");
            var dl = reader.DDR.Leader;
            var header = dl.RecordLength.ToString() + dl.FieldControlString
                + dl.FieldAreaBaseAddress.ToString() + dl.ExCharacterSetIndicator
                + dl.FieldLengthSize.ToString() + dl.FieldPositionSize.ToString()
                + dl.Reserved.ToString() + dl.FieldTagSize.ToString();
            Console.WriteLine("DDR頭標(biāo)區(qū):" + header);

            Console.WriteLine("DDR目錄區(qū):");
            foreach (var di in reader.DDR.Directory.Items)
            {
                Console.WriteLine($"標(biāo)簽:{di.Tag}\t長度:{di.FieldLength}\t位置:{di.FieldPosition}");
            }

            Console.WriteLine("DR的個數(shù)為:" + reader.DRs.Count);
S-57文件解析結(jié)果

至此膝舅,S-57文件的解析部分已全部完成了嗡载,我們可以清楚的掌握文件中的每一個標(biāo)簽,各標(biāo)簽下都有什么屬性仍稀,各屬性的值是什么洼滚。但不同標(biāo)簽對應(yīng)真實世界實體的什么?不同的屬性代表什么含義技潘?各屬性的值又能說明什么遥巴?需要對S-57標(biāo)準(zhǔn)的進一步解讀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末享幽,一起剝皮案震驚了整個濱河市铲掐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌值桩,老刑警劉巖摆霉,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奔坟,居然都是意外死亡携栋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門咳秉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婉支,“玉大人,你說我怎么就攤上這事澜建∠蛲冢” “怎么了蝌以?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長何之。 經(jīng)常有香客問我饼灿,道長,這世上最難降的妖魔是什么帝美? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮晤硕,結(jié)果婚禮上悼潭,老公的妹妹穿的比我還像新娘。我一直安慰自己舞箍,他們只是感情好舰褪,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疏橄,像睡著了一般占拍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捎迫,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天晃酒,我揣著相機與錄音,去河邊找鬼窄绒。 笑死贝次,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彰导。 我是一名探鬼主播蛔翅,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼位谋!你這毒婦竟也來了山析?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掏父,失蹤者是張志新(化名)和其女友劉穎笋轨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赊淑,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡翩腐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了膏燃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茂卦。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖组哩,靈堂內(nèi)的尸體忽然破棺而出等龙,到底是詐尸還是另有隱情处渣,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布蛛砰,位于F島的核電站罐栈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泥畅。R本人自食惡果不足惜荠诬,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望位仁。 院中可真熱鬧柑贞,春花似錦、人聲如沸聂抢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琳疏。三九已至有决,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間空盼,已是汗流浹背书幕。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揽趾,地道東北人按咒。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像但骨,于是被迫代替她去往敵國和親励七。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容