2.1.10 电子海图系统解析及开发 海图解析 -- 物标目录

从海图数据模型可知,真实世界实体对应模型中一个物标,每一物标拥有一个全局标识符和若干属性。这些物标被划分成四类:地理类、元类、集合类和制图类。这些实体类型在物标目录中称为特征物标类,特征物标类的一个实例可以归结为一个特征物标(如一个特定的灯标、沉船或建筑群区),可以赋给它一系列属性并为这些属性赋值来精确描述。一个特定的客观世界实体通过描述适当的特征类、属性和属性值来编码。例如,一个红色侧面标可以编码为:物标类:侧面浮标;属性:彩色;属性值:红色。

联系上节字段说明中的内容,不论是特征记录,还是空间记录,都存在若干ATTL/ATVL对,其存储是是真实世界实体的描述,ATTL是属性,ATVL是属性值。为了规范物标及其属性、提高编码效率,S-57提供了一个物标目录。任何一个物标都必须存在于物标目录中。物标具有有限个属性,属性的定义、适用范围、允许值及其定义等皆可从物标目录中查询到。

下图是锚地物标的说明图:

image.png

对照上图可知,每一种物标类都以同一格式叙述,每一项目代表的意义如下:

  • 物标类:物标类名称(Anchorage area 锚地);
  • 缩写词:物标类的六个字母代码(ACHARE);
  • 代码:数据编码为整数(4:用整数代替六字母缩写,能减小文件大小);
  • 每一物标类都定义一组相关属性集,并分为三个子集:
    • 属性A:该子集中的属性定义某个物标的个体特性;
    • 属性B:该子集中的属性提供数据使用方面的信息,例如与显示相关或信息系统相关的信息;
    • 属性C:该子集中的属性提供数据行政管理或描述方面的信息。
  • 每一个子集展示了一个ASCII码属性缩写列表,属性的描述见附录A-属性
  • 定义:给出了每一个物标类的定义及该定义的出处;
  • 参考:
    • INT 1:《国际海图系列INT 1 - 海图所用符号、缩写、名词》中的纸质海图特征编号是定义物标类的主要参照依据之一;
    • M-4:指《IHO海图编绘规范》中的相应章节号。M-4是定义和描述类的另一主要参考指南。
  • 备注:给出进一步的注释,在“区别”栏内列出了与之相关但又各自独立的物标类。

对某一特征对象而言,有些属性是强制的,因为电子海图系统需据其确定该物标是否属于基础显示、或者缺少该属性后对应物标便毫无意义,或者据其确定显示的符号,或者这些属性提供与航行安全有关的信息。

编制物标目录数据字典

S-57中所有物标都具有一个可读性强的名称、全局唯一的六字母缩写、全局唯一的编号及若干属性。仿照物标目录特点,新建文本文件S57ObjectCatalogue将S-57物标目录中的条目录入,格式如下:

[
  Object Class: Administration Area (Named)
  Acronym: ADMARE
  Code: 1
  Set Attribute_A: JRSDTN; NATION; NOBJNM; OBJNAM;
  Set Attribute_B: INFORM; NINFOM; NTXTDS; PICREP; SCAMAX; SCAMIN; TXTDSC;
  Set Attribute_C: RECDAT; RECIND; SORDAT; SORIND;
],
[
  Object Class: Airport/airfield
  Acronym: AIRARE
  Code: 2
  Set Attribute_A: CATAIR; CONDTN; CONVIS; NOBJNM; OBJNAM; STATUS;
  Set Attribute_B: INFORM; NINFOM; NTXTDS; PICREP; SCAMAX; SCAMIN; TXTDSC;
  Set Attribute_C: RECDAT; RECIND; SORDAT; SORIND;
],
... //其他条目
[
  Object Class: Text
  Acronym: $TEXTS 
  Code: 504
  Set Attribute_A: $CHARS; COLOUR; $JUSTH; $JUSTV; $NTXST; $SPACE; $TXSTR;
  Set Attribute_B: INFORM; NINFOM; NTXTDS; PICREP; SCAMAX; SCAMIN; TXTDSC;
  Set Attribute_C: RECDAT; RECIND; SORDAT; SORIND;
]

读取物标目录

将字典文件以资源文件的形式添加进项目S57Parser,仿照物标目录条目,新建类S57Object。然后新建单例模式的类S57Objects,对外提供编号或缩写的索引器,以快速查询物标的详细信息。如:获取编号为1的物标S57Objects.Instance[1],获取缩写为"AIRARE"的物标S57Objects.Instance["AIRARE"]

    //物标
    public class S57Object
    {
        public string ObjectClass;      //物标类别
        public string Acronym;          //物标类别缩写
        public UInt16 Code;             //物标类别编号
        public List AttributeA = new List();     //属性簇A
        public List AttributeB = new List();     //属性簇A
        public List AttributeC = new List();     //属性簇A
    }

    //物标目录
    public sealed class S57Objects
    {
        private static readonly S57Objects instance = new S57Objects();

        //显示的static 构造函数
        static S57Objects() { }

        private S57Objects() { }

        public static S57Objects Instance => instance;

        Dictionary codeObjs = new Dictionary();
        Dictionary acronymObjs = new Dictionary();

        public S57Object this[UInt16 code]
        {
            get
            {
                LoadResource();
                return codeObjs[code];
            }
        }

        public S57Object this[string acronym]
        {
            get
            {
                LoadResource();
                return acronymObjs[acronym];
            }
        }

        private void LoadResource()
        {
            if (codeObjs.Count > 0) return;  //首次才需要加载资源文件

            var lines = Encoding.ASCII.GetString(Properties.Resources.S57ObjectCatalogue).Split('\n');

            S57Object obj = null;
            var lastColumn = "";
            for (int i = 0; i < lines.Length; i++)
            {
                if (string.IsNullOrWhiteSpace(lines[i])) continue;
                if (lines[i][0] == '[')  //开始
                {
                    obj = new S57Object();
                    continue;
                }
                if (lines[i][0] == ']') //结束
                {
                    codeObjs.Add(obj.Code, obj);
                    acronymObjs.Add(obj.Acronym, obj);
                    continue;
                }

                string[] ss = null;

                if (lines[i].Contains(":"))
                {
                    var ls = lines[i].Split(':');
                    lastColumn = ls[0].Trim();
                    if (lastColumn == "Object Class") obj.ObjectClass = ls[1].Trim();
                    else if (lastColumn == "Acronym") obj.Acronym = ls[1].Trim();
                    else if (lastColumn == "Code") obj.Code = UInt16.Parse(ls[1].Trim());
                    else ss = ls[1].Split(';');
                }
                
                if(ss != null)
                {
                    foreach (var l in ss)
                    {
                        if (string.IsNullOrWhiteSpace(l)) continue;
                        if (lastColumn == "Set Attribute_A") obj.AttributeA.Add(l.Trim());
                        else if (lastColumn == "Set Attribute_B") obj.AttributeB.Add(l.Trim());
                        else if (lastColumn == "Set Attribute_C") obj.AttributeC.Add(l.Trim());
                    }
                }
            }
        }
    }

你可能感兴趣的:(2.1.10 电子海图系统解析及开发 海图解析 -- 物标目录)