與物標(biāo)目錄數(shù)據(jù)字典類似,S-57附錄A第二章是物標(biāo)屬性的數(shù)據(jù)字典丹泉。
圖中顯示情萤,屬性浮標(biāo)形狀
,首字母縮寫為BOYSHP摹恨,代碼4筋岛,數(shù)據(jù)類型為枚舉型,取值范圍為1~8晒哄,分別對(duì)應(yīng)錐形睁宰、鑵形、球形揩晴、柱形勋陪、桿形、桶形硫兰、超大型浮標(biāo)诅愚、冰區(qū)浮標(biāo),各取值的具體定義也簡(jiǎn)要列出。
每個(gè)屬性用如下標(biāo)準(zhǔn)格式項(xiàng)目定義(指定):
- 屬性:屬性名稱(Buoy shape 浮標(biāo)形狀)违孝;
- 首字母組合詞:屬性的六個(gè)字符代碼(BOYSHP)刹前;
- 代碼:數(shù)據(jù)編碼為整數(shù)(4:用整數(shù)代替六字母縮寫,能減小文件大写粕!)喇喉;
- 屬性值類型:表示屬性值類型的單字符代碼:
-
枚舉型 E
:期望輸入值從規(guī)定的屬性值表中選擇,必須選定一個(gè)正確的值校坑; -
列表型 L
:期望輸入是從預(yù)定的屬性值列表中選出一個(gè)或多個(gè)值拣技,當(dāng)用多個(gè)數(shù)值時(shí),它們必須用逗號(hào)(,)分開耍目,但在特殊情況下膏斤,也可用斜杠(/)分隔; -
浮點(diǎn)型 F
:期望輸入是具有限定范圍邪驮、分辨率莫辨、單位和格式的浮點(diǎn)數(shù)值; -
整數(shù)型 I
:期望輸入是具有限定范圍毅访、單位和格式的整數(shù)值沮榜; -
編碼字符型串 A
:期望輸入是在指定格式中的ASCII字符串,信息是按照規(guī)定的代碼系統(tǒng)編碼的喻粹,如國(guó)籍將由國(guó)際標(biāo)準(zhǔn)化組織(ISO)3166規(guī)定的由兩個(gè)字母字段編碼蟆融; -
任意字符型 S
:期望輸入是自由格式字母數(shù)字混合字符串,可以是正文或圖形文件的文件名守呜;
-
- 期望輸入:
- 對(duì)于E和L型屬性振愿,要給出帶有相互關(guān)聯(lián)、特殊規(guī)定和確切含義的一組標(biāo)識(shí)號(hào)列表弛饭;
- 對(duì)A冕末、F、I和S型屬性侣颂,期望輸入與其類型定義相同档桃;
- 如物標(biāo)類別為未知,則用零長(zhǎng)度屬性值編碼憔晒,例如顏色COLOUR▽(其中▽為分區(qū)分隔符)藻肄。
- 定義:屬性的定義或在E或L屬性類型情況下,每個(gè)屬性值的定義拒担;
- 參考:
- INT 1:《國(guó)際海圖系列INT 1 - 海圖所用符號(hào)嘹屯、縮寫、名詞》中的紙質(zhì)海圖特征編號(hào)是定義物標(biāo)類的主要指南之一从撼;
- M-4:指《IHO海圖編繪規(guī)范》中的相應(yīng)章節(jié)號(hào)州弟。M-4是定義和屬性的另一指南;
- 最小值:是指浮點(diǎn)和整數(shù)類型屬性期望輸入的最小值;
- 最大值:是指浮點(diǎn)和整數(shù)類型屬性期望輸入的最大值婆翔;
- 備注:提供更進(jìn)一步的說(shuō)明和注釋拯杠。
結(jié)合物標(biāo)目錄與物標(biāo)屬性字典數(shù)據(jù),即可解讀出物標(biāo)的所攜帶的信息啃奴。以錨地(ACHARE)為例:
屬性代碼 | 屬性類別 | 屬性值類型 | 屬性名稱及含義 |
---|---|---|---|
CATACH | A | L | 錨地類型:取值1~10潭陪,分別代表不同類型錨地,如2=深水錨地 |
DATEND | A | A | 終止日期:若當(dāng)前日期在該日期之后最蕾,則此物標(biāo)不再顯示 |
DATSTA | A | A | 起始日期:若當(dāng)前日期在該日期之前依溯,則此物標(biāo)不再顯示 |
NOBJNM | A | S | 物標(biāo)名稱:用本地語(yǔ)言表示 |
OBJNAM | A | S | 物標(biāo)名稱:用英語(yǔ)表示 |
PEREND | A | A | 定期終止日期:與DATEND類似 |
PERSTA | A | A | 定期起始日期:與DATSTA類似 |
RESTRN | A | L | 限制信息:取值1~27,分別代表不同限制信息瘟则,如3=禁止捕魚 |
STATUS | A | L | 使用狀態(tài):取值1~18誓沸,分別代表不同的使用狀態(tài),如7=臨時(shí)性的 |
INFORM | B | S | 物標(biāo)信息:用英語(yǔ)表示 |
NINFOM | B | S | 物標(biāo)信息:用本地語(yǔ)言表示 |
NTXTDS | B | S | 附件信息:存儲(chǔ)的是附件的名稱壹粟,具體信息在附件中,用本地語(yǔ)言表示 |
SCAMAX | B | I | 最大比例尺:若當(dāng)前比例尺大于該值宿百,則此物標(biāo)不再顯示 |
SCAMIN | B | I | 最小比例尺:若當(dāng)前比例尺小于該值趁仙,則此物標(biāo)不再顯示 |
TXTDSC | B | S | 附件信息:存儲(chǔ)的是附件的名稱,具體信息在附件中垦页,用英語(yǔ)表示 |
RECDAT | C | A | 記錄日期:該物標(biāo)被獲取雀费、編輯或刪除的日期 |
RECIND | C | A | 記錄指示:用于指示數(shù)據(jù)輸入和編碼的流程 |
SORDAT | C | A | 數(shù)據(jù)來(lái)源日期:原數(shù)據(jù)生產(chǎn)日期,如測(cè)量日期 |
SORIND | C | A | 數(shù)據(jù)來(lái)源指示:關(guān)于物標(biāo)來(lái)源的信息 |
編制物標(biāo)屬性數(shù)據(jù)字典
S-57中所有物標(biāo)屬性都具有一個(gè)可讀性強(qiáng)的名稱痊焊、全局唯一的六字母縮寫盏袄、全局唯一的編號(hào)。若屬性值類型為枚舉型或列表型薄啥,會(huì)給出全部可選項(xiàng)辕羽。仿照物標(biāo)屬性特點(diǎn),新建文本文件S57Attributes
將S-57物標(biāo)屬性中的條目錄入垄惧,格式如下:
[
Attribute: Agency responsible for production
Acronym: AGENCY
Code: 1
Attribute type: A
],
[
Attribute: Beacon shape
Acronym: BCNSHP
Code: 2
Attribute type: E
1 : stake, pole, perch, post
2 : withy
3 : beacon tower
4 : lattice beacon
5 : pile beacon
6 : cairn
7 : buoyant beacon
enum end
],
... //其他條目
[
Attribute: Quality of position
Acronym: QUAPOS
Code: 402
Attribute type: E
1 : surveyed
2 : unsurveyed
3 : inadequately surveyed
4 : approximate
5 : position doubtful
6 : unreliable
7 : reported (not surveyed)
8 : reported (not confirmed)
9 : estimated
10 : precisely known
11 : calculated
enum end
]
讀取物標(biāo)屬性
將字典文件以資源文件的形式添加進(jìn)項(xiàng)目S57Parser
刁愿,仿照屬性目錄條目,新建類S57Attribute
到逊。然后新建單例模式的類S57Attributes
铣口,對(duì)外提供編號(hào)或縮寫的索引器,以快速查詢屬性的詳細(xì)信息觉壶。如:獲取編號(hào)為1的屬性S57Attributes.Instance[1]
脑题,獲取縮寫為"AIRARE"的物標(biāo)S57Attributes.Instance["BCNSHP"]
。
//屬性
public class S57Attribute
{
public string Attribute; //屬性名
public string Acronym; //縮寫
public UInt16 Code; //編號(hào)
public string AttributeType; //類型
//對(duì)于枚舉型和列表型屬性的可選選項(xiàng)
public Dictionary<UInt16, string> Options;
}
//物標(biāo)屬性
public sealed class S57Attributes
{
private static readonly S57Attributes instance = new S57Attributes();
//顯示的static 構(gòu)造函數(shù)
static S57Attributes() { }
private S57Attributes() { }
public static S57Attributes Instance => instance;
Dictionary<UInt16, S57Attribute> codeAttrs = new Dictionary<UInt16, S57Attribute>();
Dictionary<string, S57Attribute> acronymAttrs = new Dictionary<string, S57Attribute>();
public S57Attribute this[UInt16 code]
{
get
{
LoadResource();
return codeAttrs[code];
}
}
public S57Attribute this[string acronym]
{
get
{
LoadResource();
return acronymAttrs[acronym];
}
}
private void LoadResource()
{
if (codeAttrs.Count > 0) return; //首次才需要加載資源文件
var lines = Encoding.ASCII.GetString(Properties.Resources.S57Attributes).Split('\n');
S57Attribute attr = null;
for (int i = 0; i < lines.Length; i++)
{
if (string.IsNullOrWhiteSpace(lines[i])) continue;
if (lines[i][0] == '[') //開始
{
attr = new S57Attribute();
continue;
}
if (lines[i][0] == ']') //結(jié)束
{
codeAttrs.Add(attr.Code, attr);
acronymAttrs.Add(attr.Acronym, attr);
continue;
}
if (lines[i].Contains(":"))
{
var ls = lines[i].Split(':');
var column = ls[0].Trim();
if (column == "Attribute") attr.Attribute = ls[1].Trim();
else if (column == "Acronym") attr.Acronym = ls[1].Trim();
else if (column == "Code") attr.Code = UInt16.Parse(ls[1].Trim());
else if (column == "Attribute type") attr.AttributeType = ls[1].Trim();
else
{
if(attr.AttributeType == "L" || attr.AttributeType == "E")
{
if (attr.Options == null) attr.Options = new Dictionary<ushort, string>();
attr.Options.Add(UInt16.Parse(column), ls[1].Trim());
}
}
}
else
{
continue;
}
}
}
}