條件符號(hào)一般需要根據(jù)用戶設(shè)置動(dòng)態(tài)繪制敦跌,如非雙色顯示時(shí)挤渐,海洋會(huì)根據(jù)用戶設(shè)備的等深線痪欲,被分成四部分外里,每部分有著不同的顏色。因此每一條件符號(hào)的流程都是獨(dú)立的螟够,其擁有唯一的流程名桥胞。
參數(shù)說明:
-
PROCNAME ?流程名
?????流程名由8位字母或數(shù)字組成导俘,前6位字母代表流程所涉及的物標(biāo)目錄名治笨,后2位數(shù)字代表版本號(hào)驳概。
示例:CS(DEPARE02)
含義:執(zhí)行名為DEPARE02的條件符號(hào)流程,該流程作用對(duì)象為深水區(qū)(DEPARE)旷赖。
現(xiàn)有的條件符號(hào)流程
S-52顯示庫中有如下流程顺又,流程名后2位數(shù)字代表當(dāng)前版本號(hào)。
流程名 | 適用對(duì)象 |
---|---|
CLRLIN01 | 安全導(dǎo)航線 |
DATCVR02 | 數(shù)據(jù)覆蓋范圍等孵,比例尺邊界稚照,超比例尺顯示 |
DEPARE02 | 水深區(qū)顏色填充和疏浚區(qū)圖案填充 |
DEPCNT03 | 等深線,包括安??全等深線 |
DEPVAL02 | 水深值 |
LEGLIN03 | 計(jì)劃航線 |
LIGHTS05 | 燈標(biāo)燈質(zhì)、光弧及范圍 |
LITDSN01 | 燈標(biāo)的描述說明 |
OBSTRN06 | 障礙物和巖石 |
OWNSHP02 | 本船 |
PASTRK01 | 航跡 |
QUAPOS01 | 位置精度 |
QUALIN01 | 線物標(biāo)的位置精度 |
QUAPNT02 | 點(diǎn)和面物標(biāo)的位置精度 |
RESARE03 | 限制區(qū)域 |
RESTRN01 | 限制區(qū)域的入口程序 |
RESCSP02 | 限制區(qū)域–屬性RESTRN |
SAFCON01 | 等深線標(biāo)簽 |
SLCONS03 | 海岸線果录,包括位置精度上枕。 |
SEABED01 | 水深區(qū)的顏色填充 |
SNDFRM03 | 水深點(diǎn)符號(hào)化,包括安全水深 |
SOUNDG02 | 水深點(diǎn)繪制的入口程序 |
SYMINSnn | 繪制由IMO指定符號(hào) |
TOPMAR01 | 燈標(biāo)的項(xiàng)標(biāo) |
UDWHAZ04 | 孤立危險(xiǎn)物 |
VESSEL02 | 本船以外的船只 |
VRMEBL02 | VRM和EBL |
WRECKS04 | 沉船 |
S-52標(biāo)準(zhǔn)中的條件流程可能包含子流程弱恒,子流程可以被共享辨萍。
流程名 | 物標(biāo) | 子流程名 |
---|---|---|
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 |
物標(biāo)括號(hào)中的字母代表:p = 點(diǎn)物標(biāo);l = 線物標(biāo)斤彼;a = 面物標(biāo)分瘦。
如:繪制水深點(diǎn)針對(duì)的是點(diǎn)物標(biāo)SOUNDG
蘸泻,具體流程為條件符號(hào)流程SOUNDG
琉苇,其還使用到子流程SNDFRM
。
示例
需要針對(duì)每一條件符號(hào)流程單獨(dú)編碼悦施,如水深點(diǎn)是以符號(hào)形式而非文本形式顯示在電子海圖中的并扇。條件符號(hào)流程SOUNDG:
條件符號(hào)流程SOUNDG
的邏輯很簡單:遍歷本物標(biāo)的水深點(diǎn)信息,將水深值傳給子流程SNDFRM抡诞,將返回的符號(hào)數(shù)組顯示在水深點(diǎn)處穷蛹。
子流程SNDFRM
,根據(jù)水深值(是否大于安全水深)添加符號(hào)前緣昼汗,根據(jù)自身物標(biāo)特點(diǎn)(水深點(diǎn)性質(zhì)及精度)肴熏,添加相應(yīng)修飾符號(hào)。然后將水深值拆分顷窒,按照一定規(guī)則找到相應(yīng)的符號(hào)蛙吏。最后將符號(hào)號(hào)組成的數(shù)組返回給上層流程。
安全水深由用戶設(shè)置鞋吉,默認(rèn)值為30米鸦做。
編碼實(shí)現(xiàn)
添加全局設(shè)置,存在用戶設(shè)定的安全水深:
public static class MySettings
{
// ...
internal static double SafetyDepth = 30; //用戶設(shè)定的安全水深
}
對(duì)物標(biāo)做預(yù)處理谓着,將位置信息組裝成路徑泼诱,水深信息轉(zhuǎn)化成浮點(diǎn)數(shù)組,并取出物標(biāo)屬性'TECSOU'(測深所使用的技術(shù))赊锚,‘STATUS’(位置狀態(tài))治筒,‘QUASOU’(測深質(zhì)量),‘QUAPOS’(位置質(zhì)量)舷蒲,將其傳入函數(shù)矢炼。
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++)
{
//轉(zhuǎn)入水深點(diǎn),返回符號(hào)數(shù)組
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;
}