2.2.16 电子海图系统解析及开发 海图显示 - 符号化指令:显示条件符号

条件符号一般需要根据用户设置动态绘制,如非双色显示时,海洋会根据用户设备的等深线,被分成四部分,每部分有着不同的颜色。因此每一条件符号的流程都是独立的,其拥有唯一的流程名。

条件符号命令

参数说明:

  • PROCNAME  流程名
         流程名由8位字母或数字组成,前6位字母代表流程所涉及的物标目录名,后2位数字代表版本号。

示例:CS(DEPARE02)
含义:执行名为DEPARE02的条件符号流程,该流程作用对象为深水区(DEPARE)。

现有的条件符号流程

S-52显示库中有如下流程,流程名后2位数字代表当前版本号。

流程名 适用对象
CLRLIN01 安全导航线
DATCVR02 数据覆盖范围,比例尺边界,超比例尺显示
DEPARE02 水深区颜色填充和疏浚区图案填充
DEPCNT03 等深线,包括安​​全等深线
DEPVAL02 水深值
LEGLIN03 计划航线
LIGHTS05 灯标灯质、光弧及范围
LITDSN01 灯标的描述说明
OBSTRN06 障碍物和岩石
OWNSHP02 本船
PASTRK01 航迹
QUAPOS01 位置精度
QUALIN01 线物标的位置精度
QUAPNT02 点和面物标的位置精度
RESARE03 限制区域
RESTRN01 限制区域的入口程序
RESCSP02 限制区域–属性RESTRN
SAFCON01 等深线标签
SLCONS03 海岸线,包括位置精度。
SEABED01 水深区的颜色填充
SNDFRM03 水深点符号化,包括安全水深
SOUNDG02 水深点绘制的入口程序
SYMINSnn 绘制由IMO指定符号
TOPMAR01 灯标的项标
UDWHAZ04 孤立危险物
VESSEL02 本船以外的船只
VRMEBL02 VRM和EBL
WRECKS04 沉船

S-52标准中的条件流程可能包含子流程,子流程可以被共享。

流程名 物标 子流程名
DATCVR M_COVR(a), M_CSCL(a)
DEPARE DEPARE(a), DRGARE(a) RESCSP, SEABED, SAFCON
DEPCNT DEPARE(l), DEPCNT(l) SAFCON
LIGHTS LIGHTS(p) LITDSN
OBSTRN OBSTRN(pla), UWTROC(p) DEPVAL, QUAPNT, SNDFRM, UDWHAZ
QUAPOS LNDARE(pl), COALNE(l) QUAPNT, QUALIN
RESARE RESARE(a)
RESTRN ACHARE(a), CBLARE(a), DMPGRD(a), DWRTPT(a),
FAIRWY(a), ICNARE(a), ISTZNE(a), MARCUL(a),
MIPARE(a), OSPARE(a), PIPARE(a), PRCARE(a),
SPLARE(a), SUBTLN(a), TESARE(a), TSSCRS(a),
TSSLPT(a), TSSRON(a)
RESCSP
SOUNDG SOUNDG(p) SNDFRM
WRECKS WRECKS(pa) DEPVAL, QUAPNT, SNDFRM, UDWHAZ

物标括号中的字母代表:p = 点物标;l = 线物标;a = 面物标。
如:绘制水深点针对的是点物标SOUNDG,具体流程为条件符号流程SOUNDG,其还使用到子流程SNDFRM

示例

需要针对每一条件符号流程单独编码,如水深点是以符号形式而非文本形式显示在电子海图中的。条件符号流程SOUNDG:

水深点显示流程
水深值符号化

条件符号流程SOUNDG的逻辑很简单:遍历本物标的水深点信息,将水深值传给子流程SNDFRM,将返回的符号数组显示在水深点处。
子流程SNDFRM,根据水深值(是否大于安全水深)添加符号前缘,根据自身物标特点(水深点性质及精度),添加相应修饰符号。然后将水深值拆分,按照一定规则找到相应的符号。最后将符号号组成的数组返回给上层流程。

安全水深由用户设置,默认值为30米。

编码实现

添加全局设置,存在用户设定的安全水深:

    public static class MySettings
    {
        // ...
        internal static double SafetyDepth = 30;                        //用户设定的安全水深
    }

对物标做预处理,将位置信息组装成路径,水深信息转化成浮点数组,并取出物标属性'TECSOU'(测深所使用的技术),‘STATUS’(位置状态),‘QUASOU’(测深质量),‘QUAPOS’(位置质量),将其传入函数。

TECSOU STATUS QUASOU QUAPOS
1 : found by echo-sounder
2 : found by side scan sonar
3 : found by multi-beam
4 : found by diver
5 : found by lead-line
6 : swept by wire-drag
7 : found by laser
8 : swept by vertical acoustic system
9 : found by electromagnetic sensor
10 : photogrammetry
11 : satellite imagery
12 : found by levelling
13 : swept by side-scan sonar
14 : computer generated
1 : permanent
2 : occasional
3 : recommended
4 : not in use
5 : periodic/intermittent
6 : reserved
7 : temporary
8 : private
9 : mandatory
10 : destroyed/ruined
11 : extinguished
12 : illuminated
13 : historic
14 : public
15 : synchronized
16 : watched
17 : un-watched
18 : existence doubtful
1 : depth known
2 : depth unknown
3 : doubtful sounding
4 : unreliable sounding
5 : no bottom found at value shown
6 : least depth known
7 : least depth unknown,
safe clearance at value shown
8 : value reported (not surveyed)
9 : value reported (not confirmed)
10 : maintained depth
11 : not regularly maintained

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
        public static void DrawCS_SOUNDG(SKCanvas ca, SKPath path, double[] depths,
            string tecsou, string status, string quasou, string quapos)
        {
            for (int i = 0; i < depths.Length; i++)
            {
                //转入水深点,返回符号数组
                var symbols = DrawCS_SNDFRM(depths[i], tecsou, status, quasou, quapos); 

                //依次绘制
                foreach (var sy in symbols)
                {
                    DrawSymbolAtXY(ca, path.Points[i].X, path.Points[i].Y, sy);
                }
            }
        }

        public static List<string> DrawCS_SNDFRM(double depth,
            string tecsou, string status, string quasou, string quapos)
        {
            var symbols = new List<string>();
            var prefix = depth < MySettings.SafetyDepth ? "SOUNDS" : "SOUNDG"; //前缀

            if (tecsou == "6") //扫海水深
            {
                symbols.Add(prefix + "B1");
            }

            if(status == "18") //疑存
            {
                symbols.Add(prefix + "C2");
            }
            else if (quasou == "3" || quasou == "4" || quasou == "5" || quasou == "8" || quasou == "9")
            {
                symbols.Add(prefix + "C2");
            }
            else if (quapos == "2" || quapos == "3" || quapos == "4" || quapos == "5" || quapos == "6" 
                || quapos == "7" || quapos == "8" || quapos == "9")
            {
                symbols.Add(prefix + "C2");
            }

            if (depth < 0)
            {
                symbols.Add(prefix + "A1");
            }
            else if (depth < 10)
            {
                var f = (int)depth;
                var s = (int)(depth * 10 % 10);
                symbols.Add(prefix + (10 + f).ToString());
                symbols.Add(prefix + (50 + s).ToString());
            }
            else if (depth < 31)
            {
                var f = (int)(depth / 10);
                var s = (int)(depth % 10);
                var t = (int)(depth * 10 % 10);
                symbols.Add(prefix + (20 + f).ToString());
                symbols.Add(prefix + (10 + s).ToString());
                symbols.Add(prefix + (50 + t).ToString());
            }
            else if (depth < 100)
            {
                var f = (int)(depth / 10);
                var s = (int)(depth % 10);
                symbols.Add(prefix + (10 + f).ToString());
                symbols.Add(prefix + s.ToString("00"));
            }
            else if (depth < 1000)
            {
                var f = (int)(depth / 100);
                var s = (int)(depth % 100 / 10);
                var t = (int)(depth % 10);
                symbols.Add(prefix + (20 + f).ToString());
                symbols.Add(prefix + (10 + s).ToString());
                symbols.Add(prefix + t.ToString("00"));
            }
            else if (depth < 10000)
            {
                var f = (int)(depth / 1000);
                var s = (int)(depth % 1000 / 100);
                var t = (int)(depth % 100 / 10);
                var l = (int)(depth % 10);
                symbols.Add(prefix + (20 + f).ToString());
                symbols.Add(prefix + (10 + s).ToString());
                symbols.Add(prefix + t.ToString("00"));
                symbols.Add(prefix + (40 + l).ToString());
            }
            else
            {
                var f = (int)(depth / 10000);
                var s = (int)(depth % 10000 / 1000);
                var t = (int)(depth % 1000 / 100);
                var l = (int)(depth % 100 / 10);
                var m = (int)(depth % 10);
                symbols.Add(prefix + (30 + f).ToString());
                symbols.Add(prefix + (20 + s).ToString());
                symbols.Add(prefix + (10 + t).ToString());
                symbols.Add(prefix + l.ToString("00"));
                symbols.Add(prefix + (40 + m).ToString());
            }

            return symbols;
        }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容