source: osm/applications/editors/josm/plugins/seachart/src/render/Rules.java@ 32907

Last change on this file since 32907 was 32907, checked in by donvip, 8 years ago

checkstyle

File size: 66.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package render;
3
4import java.awt.Color;
5import java.awt.Font;
6import java.awt.geom.AffineTransform;
7import java.text.DecimalFormat;
8import java.util.ArrayList;
9import java.util.EnumMap;
10import java.util.HashMap;
11
12import render.ChartContext.RuleSet;
13import render.Renderer.LabelStyle;
14import s57.S57att.Att;
15import s57.S57map.AttMap;
16import s57.S57map.Feature;
17import s57.S57map.ObjTab;
18import s57.S57map.Pflag;
19import s57.S57map.Rflag;
20import s57.S57obj.Obj;
21import s57.S57val;
22import s57.S57val.AddMRK;
23import s57.S57val.AttVal;
24import s57.S57val.BcnSHP;
25import s57.S57val.BnkWTW;
26import s57.S57val.BoySHP;
27import s57.S57val.CatACH;
28import s57.S57val.CatCBL;
29import s57.S57val.CatCRN;
30import s57.S57val.CatDIS;
31import s57.S57val.CatHAF;
32import s57.S57val.CatLAM;
33import s57.S57val.CatLMK;
34import s57.S57val.CatMOR;
35import s57.S57val.CatNMK;
36import s57.S57val.CatOBS;
37import s57.S57val.CatOFP;
38import s57.S57val.CatPIL;
39import s57.S57val.CatPRA;
40import s57.S57val.CatREA;
41import s57.S57val.CatROD;
42import s57.S57val.CatSCF;
43import s57.S57val.CatSEA;
44import s57.S57val.CatSIL;
45import s57.S57val.CatSIT;
46import s57.S57val.CatSIW;
47import s57.S57val.CatSLC;
48import s57.S57val.CatWED;
49import s57.S57val.CatWRK;
50import s57.S57val.ColCOL;
51import s57.S57val.ColPAT;
52import s57.S57val.FncFNC;
53import s57.S57val.MarSYS;
54import s57.S57val.StsSTS;
55import s57.S57val.TopSHP;
56import s57.S57val.TrfTRF;
57import s57.S57val.UniHLU;
58import s57.S57val.WatLEV;
59import symbols.Areas;
60import symbols.Beacons;
61import symbols.Buoys;
62import symbols.Facilities;
63import symbols.Harbours;
64import symbols.Landmarks;
65import symbols.Notices;
66import symbols.Symbols;
67import symbols.Symbols.Delta;
68import symbols.Symbols.Handle;
69import symbols.Symbols.LineStyle;
70import symbols.Symbols.Patt;
71import symbols.Symbols.Scheme;
72import symbols.Symbols.Symbol;
73import symbols.Topmarks;
74
75/**
76 * @author Malcolm Herring
77 */
78public class Rules {
79
80 static final DecimalFormat df = new DecimalFormat("#.#");
81
82 static final EnumMap<ColCOL, Color> bodyColours = new EnumMap<>(ColCOL.class);
83 static {
84 bodyColours.put(ColCOL.COL_UNK, new Color(0, true));
85 bodyColours.put(ColCOL.COL_WHT, new Color(0xffffff));
86 bodyColours.put(ColCOL.COL_BLK, new Color(0x000000));
87 bodyColours.put(ColCOL.COL_RED, new Color(0xd40000));
88 bodyColours.put(ColCOL.COL_GRN, new Color(0x00d400));
89 bodyColours.put(ColCOL.COL_BLU, Color.blue);
90 bodyColours.put(ColCOL.COL_YEL, new Color(0xffd400));
91 bodyColours.put(ColCOL.COL_GRY, Color.gray);
92 bodyColours.put(ColCOL.COL_BRN, new Color(0x8b4513));
93 bodyColours.put(ColCOL.COL_AMB, new Color(0xfbf00f));
94 bodyColours.put(ColCOL.COL_VIO, new Color(0xee82ee));
95 bodyColours.put(ColCOL.COL_ORG, Color.orange);
96 bodyColours.put(ColCOL.COL_MAG, new Color(0xf000f0));
97 bodyColours.put(ColCOL.COL_PNK, Color.pink);
98 }
99
100 static final EnumMap<ColPAT, Patt> pattMap = new EnumMap<>(ColPAT.class);
101 static {
102 pattMap.put(ColPAT.PAT_UNKN, Patt.Z);
103 pattMap.put(ColPAT.PAT_HORI, Patt.H);
104 pattMap.put(ColPAT.PAT_VERT, Patt.V);
105 pattMap.put(ColPAT.PAT_DIAG, Patt.D);
106 pattMap.put(ColPAT.PAT_BRDR, Patt.B);
107 pattMap.put(ColPAT.PAT_SQUR, Patt.S);
108 pattMap.put(ColPAT.PAT_CROS, Patt.C);
109 pattMap.put(ColPAT.PAT_SALT, Patt.X);
110 pattMap.put(ColPAT.PAT_STRP, Patt.H);
111 }
112
113 static String getName() {
114 AttVal<?> name = feature.atts.get(Att.OBJNAM);
115 if (name == null) {
116 AttMap atts = feature.objs.get(feature.type).get(0);
117 if (atts != null) {
118 name = atts.get(Att.OBJNAM);
119 }
120 }
121 return (name != null) ? (String) name.val : null;
122 }
123
124 public static void addName(int z, Font font) {
125 addName(z, font, Color.black, new Delta(Handle.CC, new AffineTransform()));
126 }
127
128 public static void addName(int z, Font font, Color colour) {
129 addName(z, font, colour, new Delta(Handle.CC, new AffineTransform()));
130 }
131
132 public static void addName(int z, Font font, Delta delta) {
133 addName(z, font, Color.black, delta);
134 }
135
136 public static void addName(int z, Font font, Color colour, Delta delta) {
137 if (Renderer.zoom >= z) {
138 String name = getName();
139 if (name != null) {
140 Renderer.labelText(name, font, colour, delta);
141 }
142 }
143 }
144
145 static AttMap getAtts(Obj obj, int idx) {
146 HashMap<Integer, AttMap> objs = feature.objs.get(obj);
147 if (objs == null)
148 return null;
149 else
150 return objs.get(idx);
151 }
152
153 public static Object getAttVal(Obj obj, Att att) {
154 AttMap atts;
155 HashMap<Integer, AttMap> objs;
156 AttVal<?> item;
157 if ((objs = feature.objs.get(obj)) != null)
158 atts = objs.get(0);
159 else
160 return null;
161 if ((item = atts.get(att)) == null)
162 return null;
163 else
164 return item.val;
165 }
166
167 public static String getAttStr(Obj obj, Att att) {
168 String str = (String) getAttVal(obj, att);
169 if (str != null) {
170 return str;
171 }
172 return "";
173 }
174
175 @SuppressWarnings("unchecked")
176 public static Enum<?> getAttEnum(Obj obj, Att att) {
177 ArrayList<?> list = (ArrayList<?>) getAttVal(obj, att);
178 if (list != null) {
179 return ((ArrayList<Enum<?>>) list).get(0);
180 }
181 return S57val.unknAtt(att);
182 }
183
184 @SuppressWarnings("unchecked")
185 public static ArrayList<?> getAttList(Obj obj, Att att) {
186 ArrayList<Enum<?>> list = (ArrayList<Enum<?>>) getAttVal(obj, att);
187 if (list != null) {
188 return list;
189 }
190 list = new ArrayList<>();
191 list.add(S57val.unknAtt(att));
192 return list;
193 }
194
195 @SuppressWarnings("unchecked")
196 static Scheme getScheme(Obj obj) {
197 ArrayList<Color> colours = new ArrayList<>();
198 for (ColCOL col : (ArrayList<ColCOL>) getAttList(obj, Att.COLOUR)) {
199 colours.add(bodyColours.get(col));
200 }
201 ArrayList<Patt> patterns = new ArrayList<>();
202 for (ColPAT pat : (ArrayList<ColPAT>) getAttList(obj, Att.COLPAT)) {
203 patterns.add(pattMap.get(pat));
204 }
205 return new Scheme(patterns, colours);
206 }
207
208 static boolean hasAttribute(Obj obj, Att att) {
209 AttMap atts;
210 if ((atts = getAtts(obj, 0)) != null) {
211 AttVal<?> item = atts.get(att);
212 return item != null;
213 }
214 return false;
215 }
216
217 static boolean testAttribute(Obj obj, Att att, Object val) {
218 AttMap atts;
219 if ((atts = getAtts(obj, 0)) != null) {
220 AttVal<?> item = atts.get(att);
221 if (item != null) {
222 switch (item.conv) {
223 case S:
224 case A:
225 return ((String) item.val).equals(val);
226 case E:
227 case L:
228 return ((ArrayList<?>) item.val).contains(val);
229 case F:
230 case I:
231 return item.val == val;
232 }
233 }
234 }
235 return false;
236 }
237
238 static boolean hasObject(Obj obj) {
239 return (feature.objs.containsKey(obj));
240 }
241
242 public static Feature feature;
243 static ArrayList<Feature> objects;
244
245 static boolean testObject(Obj obj) {
246 return ((objects = Renderer.map.features.get(obj)) != null);
247 }
248
249 static boolean testFeature(Feature f) {
250 return ((feature = f).reln == Rflag.MASTER);
251 }
252
253 public static void rules() {
254 // CHECKSTYLE.OFF: NeedBraces
255 if ((Renderer.context.ruleset() == RuleSet.ALL) || (Renderer.context.ruleset() == RuleSet.BASE)) {
256 if (testObject(Obj.LNDARE)) for (Feature f : objects) if (testFeature(f)) areas();
257 if (testObject(Obj.BUAARE)) for (Feature f : objects) if (testFeature(f)) areas();
258 if (testObject(Obj.HRBFAC)) for (Feature f : objects) if (testFeature(f)) areas();
259 if (testObject(Obj.HRBBSN)) for (Feature f : objects) if (testFeature(f)) areas();
260 if (testObject(Obj.LOKBSN)) for (Feature f : objects) if (testFeature(f)) areas();
261 if (testObject(Obj.LKBSPT)) for (Feature f : objects) if (testFeature(f)) areas();
262 if (testObject(Obj.LAKARE)) for (Feature f : objects) if (testFeature(f)) areas();
263 if (testObject(Obj.RIVERS)) for (Feature f : objects) if (testFeature(f)) waterways();
264 if (testObject(Obj.CANALS)) for (Feature f : objects) if (testFeature(f)) waterways();
265 if (testObject(Obj.DEPARE)) for (Feature f : objects) if (testFeature(f)) areas();
266 if (testObject(Obj.COALNE)) for (Feature f : objects) if (testFeature(f)) areas();
267 if (testObject(Obj.ROADWY)) for (Feature f : objects) if (testFeature(f)) highways();
268 if (testObject(Obj.RAILWY)) for (Feature f : objects) if (testFeature(f)) highways();
269 }
270 if (Renderer.context.ruleset() == RuleSet.ALL) {
271 if (testObject(Obj.SOUNDG)) for (Feature f : objects) if (testFeature(f)) depths();
272 if (testObject(Obj.DEPCNT)) for (Feature f : objects) if (testFeature(f)) depths();
273 }
274 if (testObject(Obj.SLCONS)) for (Feature f : objects) if (testFeature(f)) shoreline();
275 if ((Renderer.context.ruleset() == RuleSet.ALL) || (Renderer.context.ruleset() == RuleSet.SEAMARK)) {
276 if (testObject(Obj.PIPSOL)) for (Feature f : objects) if (testFeature(f)) pipelines();
277 if (testObject(Obj.CBLSUB)) for (Feature f : objects) if (testFeature(f)) cables();
278 if (testObject(Obj.PIPOHD)) for (Feature f : objects) if (testFeature(f)) pipelines();
279 if (testObject(Obj.CBLOHD)) for (Feature f : objects) if (testFeature(f)) cables();
280 if (testObject(Obj.TSEZNE)) for (Feature f : objects) if (testFeature(f)) separation();
281 if (testObject(Obj.TSSCRS)) for (Feature f : objects) if (testFeature(f)) separation();
282 if (testObject(Obj.TSSRON)) for (Feature f : objects) if (testFeature(f)) separation();
283 if (testObject(Obj.TSELNE)) for (Feature f : objects) if (testFeature(f)) separation();
284 if (testObject(Obj.TSSLPT)) for (Feature f : objects) if (testFeature(f)) separation();
285 if (testObject(Obj.TSSBND)) for (Feature f : objects) if (testFeature(f)) separation();
286 if (testObject(Obj.ISTZNE)) for (Feature f : objects) if (testFeature(f)) separation();
287 if (testObject(Obj.SNDWAV)) for (Feature f : objects) if (testFeature(f)) areas();
288 if (testObject(Obj.WEDKLP)) for (Feature f : objects) if (testFeature(f)) areas();
289 if (testObject(Obj.OSPARE)) for (Feature f : objects) if (testFeature(f)) areas();
290 if (testObject(Obj.FAIRWY)) for (Feature f : objects) if (testFeature(f)) areas();
291 if (testObject(Obj.DRGARE)) for (Feature f : objects) if (testFeature(f)) areas();
292 if (testObject(Obj.RESARE)) for (Feature f : objects) if (testFeature(f)) areas();
293 if (testObject(Obj.PRCARE)) for (Feature f : objects) if (testFeature(f)) areas();
294 if (testObject(Obj.SPLARE)) for (Feature f : objects) if (testFeature(f)) areas();
295 if (testObject(Obj.SEAARE)) for (Feature f : objects) if (testFeature(f)) areas();
296 if (testObject(Obj.OBSTRN)) for (Feature f : objects) if (testFeature(f)) obstructions();
297 if (testObject(Obj.UWTROC)) for (Feature f : objects) if (testFeature(f)) obstructions();
298 if (testObject(Obj.MARCUL)) for (Feature f : objects) if (testFeature(f)) areas();
299 if (testObject(Obj.RECTRC)) for (Feature f : objects) if (testFeature(f)) transits();
300 if (testObject(Obj.NAVLNE)) for (Feature f : objects) if (testFeature(f)) transits();
301 if (testObject(Obj.HRBFAC)) for (Feature f : objects) if (testFeature(f)) harbours();
302 if (testObject(Obj.ACHARE)) for (Feature f : objects) if (testFeature(f)) harbours();
303 if (testObject(Obj.ACHBRT)) for (Feature f : objects) if (testFeature(f)) harbours();
304 if (testObject(Obj.BERTHS)) for (Feature f : objects) if (testFeature(f)) harbours();
305 if (testObject(Obj.DISMAR)) for (Feature f : objects) if (testFeature(f)) distances();
306 if (testObject(Obj.HULKES)) for (Feature f : objects) if (testFeature(f)) ports();
307 if (testObject(Obj.CRANES)) for (Feature f : objects) if (testFeature(f)) ports();
308 if (testObject(Obj.LNDMRK)) for (Feature f : objects) if (testFeature(f)) landmarks();
309 if (testObject(Obj.SILTNK)) for (Feature f : objects) if (testFeature(f)) landmarks();
310 if (testObject(Obj.BUISGL)) for (Feature f : objects) if (testFeature(f)) harbours();
311 if (testObject(Obj.MORFAC)) for (Feature f : objects) if (testFeature(f)) moorings();
312 if (testObject(Obj.NOTMRK)) for (Feature f : objects) if (testFeature(f)) notices();
313 if (testObject(Obj.SMCFAC)) for (Feature f : objects) if (testFeature(f)) marinas();
314 if (testObject(Obj.BRIDGE)) for (Feature f : objects) if (testFeature(f)) bridges();
315 if (testObject(Obj.PILPNT)) for (Feature f : objects) if (testFeature(f)) points();
316 if (testObject(Obj.TOPMAR)) for (Feature f : objects) if (testFeature(f)) points();
317 if (testObject(Obj.DAYMAR)) for (Feature f : objects) if (testFeature(f)) points();
318 if (testObject(Obj.FOGSIG)) for (Feature f : objects) if (testFeature(f)) points();
319 if (testObject(Obj.RDOCAL)) for (Feature f : objects) if (testFeature(f)) callpoint();
320 if (testObject(Obj.LITMIN)) for (Feature f : objects) if (testFeature(f)) lights();
321 if (testObject(Obj.LITMAJ)) for (Feature f : objects) if (testFeature(f)) lights();
322 if (testObject(Obj.LIGHTS)) for (Feature f : objects) if (testFeature(f)) lights();
323 if (testObject(Obj.SISTAT)) for (Feature f : objects) if (testFeature(f)) stations();
324 if (testObject(Obj.SISTAW)) for (Feature f : objects) if (testFeature(f)) stations();
325 if (testObject(Obj.CGUSTA)) for (Feature f : objects) if (testFeature(f)) stations();
326 if (testObject(Obj.RDOSTA)) for (Feature f : objects) if (testFeature(f)) stations();
327 if (testObject(Obj.RADRFL)) for (Feature f : objects) if (testFeature(f)) stations();
328 if (testObject(Obj.RADSTA)) for (Feature f : objects) if (testFeature(f)) stations();
329 if (testObject(Obj.RTPBCN)) for (Feature f : objects) if (testFeature(f)) stations();
330 if (testObject(Obj.RSCSTA)) for (Feature f : objects) if (testFeature(f)) stations();
331 if (testObject(Obj.PILBOP)) for (Feature f : objects) if (testFeature(f)) stations();
332 if (testObject(Obj.WTWGAG)) for (Feature f : objects) if (testFeature(f)) gauges();
333 if (testObject(Obj.OFSPLF)) for (Feature f : objects) if (testFeature(f)) platforms();
334 if (testObject(Obj.WRECKS)) for (Feature f : objects) if (testFeature(f)) wrecks();
335 if (testObject(Obj.LITVES)) for (Feature f : objects) if (testFeature(f)) floats();
336 if (testObject(Obj.LITFLT)) for (Feature f : objects) if (testFeature(f)) floats();
337 if (testObject(Obj.BOYINB)) for (Feature f : objects) if (testFeature(f)) floats();
338 if (testObject(Obj.BOYLAT)) for (Feature f : objects) if (testFeature(f)) buoys();
339 if (testObject(Obj.BOYCAR)) for (Feature f : objects) if (testFeature(f)) buoys();
340 if (testObject(Obj.BOYISD)) for (Feature f : objects) if (testFeature(f)) buoys();
341 if (testObject(Obj.BOYSAW)) for (Feature f : objects) if (testFeature(f)) buoys();
342 if (testObject(Obj.BOYSPP)) for (Feature f : objects) if (testFeature(f)) buoys();
343 if (testObject(Obj.BCNLAT)) for (Feature f : objects) if (testFeature(f)) beacons();
344 if (testObject(Obj.BCNCAR)) for (Feature f : objects) if (testFeature(f)) beacons();
345 if (testObject(Obj.BCNISD)) for (Feature f : objects) if (testFeature(f)) beacons();
346 if (testObject(Obj.BCNSAW)) for (Feature f : objects) if (testFeature(f)) beacons();
347 if (testObject(Obj.BCNSPP)) for (Feature f : objects) if (testFeature(f)) beacons();
348 }
349 // CHECKSTYLE.ON: NeedBraces
350 }
351
352 private static void areas() {
353 String name = getName();
354 switch (feature.type) {
355 case BUAARE:
356 Renderer.lineVector(new LineStyle(new Color(0x20000000, true)));
357 break;
358 case COALNE:
359 if (Renderer.zoom >= 12)
360 Renderer.lineVector(new LineStyle(Color.black, 10));
361 break;
362 case DEPARE:
363 Double depmax = 0.0;
364 if (((depmax = (Double) getAttVal(Obj.DEPARE, Att.DRVAL2)) != null) && (depmax <= 0.0)) {
365 Renderer.lineVector(new LineStyle(Symbols.Gdries));
366 }
367 break;
368 case LAKARE:
369 if ((Renderer.zoom >= 12) || (feature.geom.area > 10.0))
370 Renderer.lineVector(new LineStyle(Symbols.Bwater));
371 break;
372 case DRGARE:
373 if (Renderer.zoom < 16)
374 Renderer.lineVector(new LineStyle(Color.black, 8, new float[] {25, 25 }, new Color(0x40ffffff, true)));
375 else
376 Renderer.lineVector(new LineStyle(Color.black, 8, new float[] {25, 25 }));
377 addName(12, new Font("Arial", Font.PLAIN, 100), new Delta(Handle.CC, new AffineTransform()));
378 break;
379 case FAIRWY:
380 if (feature.geom.area > 2.0) {
381 if (Renderer.zoom < 16)
382 Renderer.lineVector(new LineStyle(Symbols.Mline, 8, new float[] {50, 50 }, new Color(0x40ffffff, true)));
383 else
384 Renderer.lineVector(new LineStyle(Symbols.Mline, 8, new float[] {50, 50 }));
385 } else {
386 if (Renderer.zoom >= 14)
387 Renderer.lineVector(new LineStyle(new Color(0x40ffffff, true)));
388 }
389 break;
390 case LKBSPT:
391 case LOKBSN:
392 case HRBBSN:
393 if (Renderer.zoom >= 12) {
394 Renderer.lineVector(new LineStyle(Color.black, 10, Symbols.Bwater));
395 } else {
396 Renderer.lineVector(new LineStyle(Symbols.Bwater));
397 }
398 break;
399 case HRBFAC:
400 if (feature.objs.get(Obj.HRBBSN) != null) {
401 if (Renderer.zoom >= 12) {
402 Renderer.lineVector(new LineStyle(Color.black, 10, Symbols.Bwater));
403 } else {
404 Renderer.lineVector(new LineStyle(Symbols.Bwater));
405 }
406 }
407 break;
408 case LNDARE:
409 Renderer.lineVector(new LineStyle(Symbols.Yland));
410 break;
411 case MARCUL:
412 if (Renderer.zoom >= 12) {
413 if (Renderer.zoom >= 14) {
414 Renderer.symbol(Areas.MarineFarm);
415 }
416 if ((feature.geom.area > 0.2) || ((feature.geom.area > 0.05) && (Renderer.zoom >= 14)) ||
417 ((feature.geom.area > 0.005) && (Renderer.zoom >= 16))) {
418 Renderer.lineVector(new LineStyle(Color.black, 4, new float[] {10, 10}));
419 }
420 }
421 break;
422 case OSPARE:
423 if (testAttribute(feature.type, Att.CATPRA, CatPRA.PRA_WFRM)) {
424 Renderer.symbol(Areas.WindFarm);
425 Renderer.lineVector(new LineStyle(Color.black, 20, new float[] {40, 40}));
426 addName(15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
427 }
428 break;
429 case RESARE:
430 case MIPARE:
431 if (Renderer.zoom >= 12) {
432 Renderer.lineSymbols(Areas.Restricted, 1.0, null, null, 0, Symbols.Mline);
433 if (testAttribute(feature.type, Att.CATREA, CatREA.REA_NWAK)) {
434 Renderer.symbol(Areas.NoWake);
435 }
436 }
437 break;
438 case PRCARE:
439 if (Renderer.zoom >= 12) {
440 Renderer.lineVector(new LineStyle(Symbols.Mline, 10, new float[] {40, 40}));
441 }
442 break;
443 case SEAARE:
444 switch ((CatSEA) getAttEnum(feature.type, Att.CATSEA)) {
445 case SEA_RECH:
446 if ((Renderer.zoom >= 10) && (name != null))
447 if (feature.geom.prim == Pflag.LINE) {
448 Renderer.lineText(name, new Font("Arial", Font.PLAIN, 150), Color.black, -40);
449 } else {
450 Renderer.labelText(name, new Font("Arial", Font.PLAIN, 150), Color.black,
451 new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
452 }
453 break;
454 case SEA_BAY:
455 if ((Renderer.zoom >= 12) && (name != null))
456 if (feature.geom.prim == Pflag.LINE) {
457 Renderer.lineText(name, new Font("Arial", Font.PLAIN, 150), Color.black, -40);
458 } else {
459 Renderer.labelText(name, new Font("Arial", Font.PLAIN, 150), Color.black,
460 new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
461 }
462 break;
463 case SEA_SHOL:
464 if (Renderer.zoom >= 14) {
465 if (feature.geom.prim == Pflag.AREA) {
466 Renderer.lineVector(new LineStyle(new Color(0xc480ff), 4, new float[] {25, 25}));
467 if (name != null) {
468 Renderer.labelText(name, new Font("Arial", Font.ITALIC, 75), Color.black,
469 new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
470 Renderer.labelText("(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, new Delta(Handle.BC));
471 }
472 } else if (feature.geom.prim == Pflag.LINE) {
473 if (name != null) {
474 Renderer.lineText(name, new Font("Arial", Font.ITALIC, 75), Color.black, -40);
475 Renderer.lineText("(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, 0);
476 }
477 } else {
478 if (name != null) {
479 Renderer.labelText(name, new Font("Arial", Font.ITALIC, 75), Color.black,
480 new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
481 Renderer.labelText("(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, new Delta(Handle.BC));
482 }
483 }
484 }
485 break;
486 case SEA_GAT:
487 case SEA_NRRW:
488 addName(12, new Font("Arial", Font.PLAIN, 100));
489 break;
490 default:
491 break;
492 }
493 break;
494 case SNDWAV:
495 if (Renderer.zoom >= 12) Renderer.fillPattern(Areas.Sandwaves);
496 break;
497 case WEDKLP:
498 if (Renderer.zoom >= 12) {
499 switch ((CatWED) getAttEnum(feature.type, Att.CATWED)) {
500 case WED_KELP:
501 if (feature.geom.prim == Pflag.AREA) {
502 Renderer.fillPattern(Areas.KelpA);
503 } else {
504 Renderer.symbol(Areas.KelpS);
505 }
506 break;
507 default:
508 break;
509 }
510 }
511 break;
512 case SPLARE:
513 if (Renderer.zoom >= 12) {
514 Renderer.symbol(Areas.Plane, new Scheme(Symbols.Msymb));
515 Renderer.lineSymbols(Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Symbols.Mline);
516 }
517 addName(15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
518 break;
519 default:
520 break;
521 }
522 }
523
524 @SuppressWarnings("unchecked")
525 private static void beacons() {
526 if ((Renderer.zoom >= 14) || ((Renderer.zoom >= 12) && ((feature.type == Obj.BCNLAT) || (feature.type == Obj.BCNCAR)))
527 || ((Renderer.zoom >= 11) && ((feature.type == Obj.BCNSAW) || hasObject(Obj.RTPBCN)))) {
528 BcnSHP shape = (BcnSHP) getAttEnum(feature.type, Att.BCNSHP);
529 if (shape == BcnSHP.BCN_UNKN)
530 shape = BcnSHP.BCN_PILE;
531 if ((shape == BcnSHP.BCN_WTHY) && (feature.type == Obj.BCNLAT)) {
532 switch ((CatLAM) getAttEnum(feature.type, Att.CATLAM)) {
533 case LAM_PORT:
534 Renderer.symbol(Beacons.WithyPort);
535 break;
536 case LAM_STBD:
537 Renderer.symbol(Beacons.WithyStarboard);
538 break;
539 default:
540 Renderer.symbol(Beacons.Stake, getScheme(feature.type));
541 }
542 } else if ((shape == BcnSHP.BCN_PRCH) && (feature.type == Obj.BCNLAT) && !(feature.objs.containsKey(Obj.TOPMAR))) {
543 switch ((CatLAM) getAttEnum(feature.type, Att.CATLAM)) {
544 case LAM_PORT:
545 Renderer.symbol(Beacons.PerchPort);
546 break;
547 case LAM_STBD:
548 Renderer.symbol(Beacons.PerchStarboard);
549 break;
550 default:
551 Renderer.symbol(Beacons.Stake, getScheme(feature.type));
552 }
553 } else {
554 Renderer.symbol(Beacons.Shapes.get(shape), getScheme(feature.type));
555 if (feature.objs.containsKey(Obj.TOPMAR)) {
556 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
557 if (topmap.containsKey(Att.TOPSHP)) {
558 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)),
559 getScheme(Obj.TOPMAR), Topmarks.BeaconDelta);
560 }
561 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
562 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
563 if (topmap.containsKey(Att.TOPSHP)) {
564 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)),
565 getScheme(Obj.DAYMAR), Topmarks.BeaconDelta);
566 }
567 }
568 }
569 if (hasObject(Obj.NOTMRK))
570 notices();
571 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
572 Signals.addSignals();
573 }
574 }
575
576 @SuppressWarnings("unchecked")
577 private static void buoys() {
578 if ((Renderer.zoom >= 14) || ((Renderer.zoom >= 12) && ((feature.type == Obj.BOYLAT) || (feature.type == Obj.BOYCAR)))
579 || ((Renderer.zoom >= 11) && ((feature.type == Obj.BOYSAW) || hasObject(Obj.RTPBCN)))) {
580 BoySHP shape = (BoySHP) getAttEnum(feature.type, Att.BOYSHP);
581 if (shape == BoySHP.BOY_UNKN) shape = BoySHP.BOY_PILR;
582 Renderer.symbol(Buoys.Shapes.get(shape), getScheme(feature.type));
583 if (feature.objs.containsKey(Obj.TOPMAR)) {
584 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
585 if (topmap.containsKey(Att.TOPSHP)) {
586 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)),
587 getScheme(Obj.TOPMAR), Topmarks.BuoyDeltas.get(shape));
588 }
589 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
590 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
591 if (topmap.containsKey(Att.TOPSHP)) {
592 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)),
593 getScheme(Obj.DAYMAR), Topmarks.BuoyDeltas.get(shape));
594 }
595 }
596 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
597 Signals.addSignals();
598 }
599 }
600
601 private static void bridges() {
602 if (Renderer.zoom >= 16) {
603 double verclr, verccl, vercop, horclr;
604 AttMap atts = feature.objs.get(Obj.BRIDGE).get(0);
605 String vstr = "";
606 String hstr = "";
607 if (atts != null) {
608 if (atts.containsKey(Att.HORCLR)) {
609 horclr = (Double) atts.get(Att.HORCLR).val;
610 hstr = String.valueOf(horclr);
611 }
612 if (atts.containsKey(Att.VERCLR)) {
613 verclr = (Double) atts.get(Att.VERCLR).val;
614 } else {
615 verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
616 }
617 verccl = atts.containsKey(Att.VERCCL) ? (Double) atts.get(Att.VERCCL).val : 0;
618 vercop = atts.containsKey(Att.VERCOP) ? (Double) atts.get(Att.VERCOP).val : 0;
619 if (verclr > 0) {
620 vstr += String.valueOf(verclr);
621 } else if (verccl > 0) {
622 if (vercop == 0) {
623 vstr += String.valueOf(verccl) + "/-";
624 } else {
625 vstr += String.valueOf(verccl) + "/" + String.valueOf(vercop);
626 }
627 }
628 if (hstr.isEmpty() && !vstr.isEmpty()) {
629 Renderer.labelText(vstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.VCLR, Color.black, Color.white,
630 new Delta(Handle.CC));
631 } else if (!hstr.isEmpty() && !vstr.isEmpty()) {
632 Renderer.labelText(vstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.VCLR, Color.black, Color.white,
633 new Delta(Handle.BC));
634 Renderer.labelText(hstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.HCLR, Color.black, Color.white,
635 new Delta(Handle.TC));
636 } else if (!hstr.isEmpty() && vstr.isEmpty()) {
637 Renderer.labelText(hstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.HCLR, Color.black, Color.white,
638 new Delta(Handle.CC));
639 }
640 }
641 }
642 }
643
644 private static void cables() {
645 if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
646 if (feature.type == Obj.CBLSUB) {
647 Renderer.lineSymbols(Areas.Cable, 0.0, null, null, 0, Symbols.Mline);
648 } else if (feature.type == Obj.CBLOHD) {
649 AttMap atts = feature.objs.get(Obj.CBLOHD).get(0);
650 if ((atts != null) && (atts.containsKey(Att.CATCBL)) && (atts.get(Att.CATCBL).val == CatCBL.CBL_POWR)) {
651 Renderer.lineSymbols(Areas.CableDash, 0, Areas.CableDot, Areas.CableFlash, 2, Color.black);
652 } else {
653 Renderer.lineSymbols(Areas.CableDash, 0, Areas.CableDot, null, 2, Color.black);
654 }
655 if (atts != null) {
656 if (atts.containsKey(Att.VERCLR)) {
657 Renderer.labelText(String.valueOf(atts.get(Att.VERCLR).val), new Font("Arial", Font.PLAIN, 50),
658 Color.black, LabelStyle.VCLR, Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 25)));
659 } else if (atts.containsKey(Att.VERCSA)) {
660 Renderer.labelText(String.valueOf(atts.get(Att.VERCSA).val), new Font("Arial", Font.PLAIN, 50),
661 Color.black, LabelStyle.PCLR, Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 25)));
662 }
663 }
664 }
665 }
666 }
667
668 private static void callpoint() {
669 if (Renderer.zoom >= 14) {
670 Symbol symb = Harbours.CallPoint2;
671 TrfTRF trf = (TrfTRF) getAttEnum(feature.type, Att.TRAFIC);
672 if (trf != TrfTRF.TRF_TWOW) {
673 symb = Harbours.CallPoint1;
674 }
675 Double orient = 0.0;
676 if ((orient = (Double) getAttVal(feature.type, Att.ORIENT)) == null) {
677 orient = 0.0;
678 }
679 Renderer.symbol(symb, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(orient))));
680 String chn;
681 if (!(chn = getAttStr(feature.type, Att.COMCHA)).isEmpty()) {
682 Renderer.labelText(("Ch." + chn), new Font("Arial", Font.PLAIN, 50), Color.black,
683 new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 50)));
684 }
685 }
686 }
687
688 private static void depths() {
689 switch (feature.type) {
690 case SOUNDG:
691 if ((Renderer.zoom >= 14) && hasAttribute(Obj.SOUNDG, Att.VALSOU)) {
692 double depth = (double) getAttVal(Obj.SOUNDG, Att.VALSOU);
693 String dstr = df.format(depth);
694 String[] tok = dstr.split("[-.]");
695 String ul = "";
696 String id = tok[0];
697 String dd = "";
698 if (tok[0].equals("")) {
699 for (int i = 0; i < tok[1].length(); i++) {
700 ul += "_";
701 }
702 id = tok[1];
703 dd = (tok.length == 3) ? tok[2] : "";
704 } else {
705 dd = (tok.length == 2) ? tok[1] : "";
706 }
707 Renderer.labelText(ul, new Font("Arial", Font.PLAIN, 30), Color.black,
708 new Delta(Handle.RC, AffineTransform.getTranslateInstance(10, 15)));
709 Renderer.labelText(id, new Font("Arial", Font.PLAIN, 30), Color.black,
710 new Delta(Handle.RC, AffineTransform.getTranslateInstance(10, 0)));
711 Renderer.labelText(dd, new Font("Arial", Font.PLAIN, 20), Color.black,
712 new Delta(Handle.LC, AffineTransform.getTranslateInstance(15, 10)));
713 }
714 break;
715 case DEPCNT:
716 break;
717 default:
718 break;
719 }
720 }
721
722 private static void distances() {
723 if (Renderer.zoom >= 14) {
724 if (!testAttribute(Obj.DISMAR, Att.CATDIS, CatDIS.DIS_NONI)) {
725 Renderer.symbol(Harbours.DistanceI);
726 } else {
727 Renderer.symbol(Harbours.DistanceU);
728 }
729 if (Renderer.zoom >= 15) {
730 AttMap atts = getAtts(Obj.DISMAR, 0);
731 if ((atts != null) && (atts.containsKey(Att.WTWDIS))) {
732 Double dist = (Double) atts.get(Att.WTWDIS).val;
733 String str = "";
734 if (atts.containsKey(Att.HUNITS)) {
735 switch ((UniHLU) getAttEnum(Obj.DISMAR, Att.HUNITS)) {
736 case HLU_METR:
737 str += "m ";
738 break;
739 case HLU_FEET:
740 str += "ft ";
741 break;
742 case HLU_HMTR:
743 str += "hm ";
744 break;
745 case HLU_KMTR:
746 str += "km ";
747 break;
748 case HLU_SMIL:
749 str += "M ";
750 break;
751 case HLU_NMIL:
752 str += "NM ";
753 break;
754 default:
755 break;
756 }
757 }
758 str += String.format("%1.0f", dist);
759 Renderer.labelText(str, new Font("Arial", Font.PLAIN, 40), Color.black,
760 new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 45)));
761 }
762 }
763 }
764 }
765
766 @SuppressWarnings("unchecked")
767 private static void floats() {
768 if ((Renderer.zoom >= 12) || ((Renderer.zoom >= 11) && ((feature.type == Obj.LITVES) ||
769 (feature.type == Obj.BOYINB) || hasObject(Obj.RTPBCN)))) {
770 switch (feature.type) {
771 case LITVES:
772 Renderer.symbol(Buoys.Super, getScheme(feature.type));
773 break;
774 case LITFLT:
775 Renderer.symbol(Buoys.Float, getScheme(feature.type));
776 break;
777 case BOYINB:
778 Renderer.symbol(Buoys.Super, getScheme(feature.type));
779 break;
780 default:
781 break;
782 }
783 if (feature.objs.containsKey(Obj.TOPMAR)) {
784 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
785 if (topmap.containsKey(Att.TOPSHP)) {
786 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)),
787 getScheme(Obj.TOPMAR), Topmarks.FloatDelta);
788 }
789 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
790 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
791 if (topmap.containsKey(Att.TOPSHP)) {
792 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)),
793 getScheme(Obj.DAYMAR), Topmarks.FloatDelta);
794 }
795 }
796 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
797 Signals.addSignals();
798 }
799 }
800
801 private static void gauges() {
802 if (Renderer.zoom >= 14) {
803 Renderer.symbol(Harbours.TideGauge);
804 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
805 Signals.addSignals();
806 }
807 }
808
809 @SuppressWarnings("unchecked")
810 private static void harbours() {
811 String name = getName();
812 switch (feature.type) {
813 case ACHBRT:
814 if (Renderer.zoom >= 14) {
815 Renderer.symbol(Harbours.Anchor, new Scheme(Symbols.Msymb));
816 if (Renderer.zoom >= 15) {
817 Renderer.labelText(name == null ? "" : name,
818 new Font("Arial", Font.PLAIN, 30), Symbols.Msymb, LabelStyle.RRCT, Symbols.Msymb, Color.white, new Delta(Handle.BC));
819 }
820 }
821 if (getAttVal(Obj.ACHBRT, Att.RADIUS) != null) {
822 double radius;
823 if ((radius = (Double) getAttVal(Obj.ACHBRT, Att.RADIUS)) != 0) {
824 UniHLU units = (UniHLU) getAttEnum(Obj.ACHBRT, Att.HUNITS);
825 if (units == UniHLU.HLU_UNKN) {
826 units = UniHLU.HLU_METR;
827 }
828 Renderer.lineCircle(new LineStyle(Symbols.Mline, 4, new float[] {10, 10}, null), radius, units);
829 }
830 }
831 break;
832 case ACHARE:
833 if (Renderer.zoom >= 12) {
834 if (feature.geom.prim != Pflag.AREA) {
835 Renderer.symbol(Harbours.Anchorage, new Scheme(Color.black));
836 } else {
837 Renderer.symbol(Harbours.Anchorage, new Scheme(Symbols.Mline));
838 Renderer.lineSymbols(Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Symbols.Mline);
839 }
840 addName(15, new Font("Arial", Font.BOLD, 60), Symbols.Mline, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
841 ArrayList<StsSTS> sts = (ArrayList<StsSTS>) getAttList(Obj.ACHARE, Att.STATUS);
842 if ((Renderer.zoom >= 15) && (sts.contains(StsSTS.STS_RESV))) {
843 Renderer.labelText("Reserved",
844 new Font("Arial", Font.PLAIN, 50), Symbols.Mline, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60)));
845 }
846 ArrayList<CatACH> cats = (ArrayList<CatACH>) getAttList(Obj.ACHARE, Att.CATACH);
847 int dy = (cats.size() - 1) * -30;
848 for (CatACH cat : cats) {
849 switch (cat) {
850 case ACH_DEEP:
851 Renderer.labelText("DW", new Font("Arial", Font.BOLD, 50), Symbols.Msymb,
852 new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
853 dy += 60;
854 break;
855 case ACH_TANK:
856 Renderer.labelText("Tanker", new Font("Arial", Font.BOLD, 50), Symbols.Msymb,
857 new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
858 dy += 60;
859 break;
860 case ACH_H24P:
861 Renderer.labelText("24h", new Font("Arial", Font.BOLD, 50), Symbols.Msymb,
862 new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
863 dy += 60;
864 break;
865 case ACH_EXPL:
866 Renderer.symbol(Harbours.Explosives, new Scheme(Symbols.Msymb),
867 new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
868 dy += 60;
869 break;
870 case ACH_QUAR:
871 Renderer.symbol(Harbours.Hospital, new Scheme(Symbols.Msymb),
872 new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
873 dy += 60;
874 break;
875 case ACH_SEAP:
876 Renderer.symbol(Areas.Seaplane, new Scheme(Symbols.Msymb),
877 new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
878 dy += 60;
879 break;
880 default:
881 }
882 }
883 }
884 break;
885 case BERTHS:
886 if (Renderer.zoom >= 14) {
887 Renderer.lineVector(new LineStyle(Symbols.Mline, 6, new float[] {20, 20}));
888 Renderer.labelText(name == null ? " " : name,
889 new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, LabelStyle.RRCT, Symbols.Mline, Color.white);
890 }
891 break;
892 case BUISGL:
893 if (Renderer.zoom >= 16) {
894 ArrayList<Symbol> symbols = new ArrayList<>();
895 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) getAttList(Obj.BUISGL, Att.FUNCTN);
896 for (FncFNC fnc : fncs) {
897 symbols.add(Landmarks.Funcs.get(fnc));
898 }
899 if (feature.objs.containsKey(Obj.SMCFAC)) {
900 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttList(Obj.SMCFAC, Att.CATSCF);
901 for (CatSCF scf : scfs) {
902 symbols.add(Facilities.Cats.get(scf));
903 }
904 }
905 Renderer.cluster(symbols);
906 }
907 break;
908 case HRBFAC:
909 if (Renderer.zoom >= 12) {
910 ArrayList<CatHAF> cathaf = (ArrayList<CatHAF>) getAttList(Obj.HRBFAC, Att.CATHAF);
911 if (cathaf.size() == 1) {
912 switch (cathaf.get(0)) {
913 case HAF_MRNA:
914 Renderer.symbol(Harbours.Marina);
915 break;
916 case HAF_MANF:
917 Renderer.symbol(Harbours.MarinaNF);
918 break;
919 case HAF_FISH:
920 Renderer.symbol(Harbours.Fishing);
921 break;
922 default:
923 Renderer.symbol(Harbours.Harbour);
924 break;
925 }
926 } else {
927 Renderer.symbol(Harbours.Harbour);
928 }
929 }
930 break;
931 default:
932 break;
933 }
934 }
935
936 @SuppressWarnings("unchecked")
937 private static void highways() {
938 switch (feature.type) {
939 case ROADWY:
940 ArrayList<CatROD> cat = (ArrayList<CatROD>) (getAttList(Obj.ROADWY, Att.CATROD));
941 if (cat.size() > 0) {
942 switch (cat.get(0)) {
943 case ROD_MWAY:
944 Renderer.lineVector(new LineStyle(Color.black, 20));
945 break;
946 case ROD_MAJR:
947 Renderer.lineVector(new LineStyle(Color.black, 15));
948 break;
949 case ROD_MINR:
950 Renderer.lineVector(new LineStyle(Color.black, 10));
951 break;
952 default:
953 Renderer.lineVector(new LineStyle(Color.black, 5));
954 }
955 } else {
956 Renderer.lineVector(new LineStyle(Color.black, 5));
957 }
958 break;
959 case RAILWY:
960 Renderer.lineVector(new LineStyle(Color.gray, 10));
961 Renderer.lineVector(new LineStyle(Color.black, 10, new float[] {30, 30}));
962 break;
963 default:
964 }
965 }
966
967 @SuppressWarnings("unchecked")
968 private static void landmarks() {
969 if (!hasAttribute(Obj.LNDMRK, Att.CATLMK)
970 && (!hasAttribute(Obj.LNDMRK, Att.FUNCTN) || testAttribute(Obj.LNDMRK, Att.FUNCTN, FncFNC.FNC_LGHT))
971 && hasObject(Obj.LIGHTS))
972 lights();
973 else if (Renderer.zoom >= 12) {
974 switch (feature.type) {
975 case LNDMRK:
976 ArrayList<CatLMK> cats = (ArrayList<CatLMK>) getAttList(feature.type, Att.CATLMK);
977 Symbol catSym = Landmarks.Shapes.get(cats.get(0));
978 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) getAttList(feature.type, Att.FUNCTN);
979 Symbol fncSym = Landmarks.Funcs.get(fncs.get(0));
980 if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR))
981 catSym = Landmarks.ChurchTower;
982 if (cats.get(0) == CatLMK.LMK_RADR)
983 fncSym = Landmarks.RadioTV;
984 Renderer.symbol(catSym);
985 Renderer.symbol(fncSym);
986 break;
987 case SILTNK:
988 if (testAttribute(feature.type, Att.CATSIL, CatSIL.SIL_WTRT))
989 Renderer.symbol(Landmarks.WaterTower);
990 break;
991 default:
992 break;
993 }
994 if (Renderer.zoom >= 15)
995 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
996 Signals.addSignals();
997 }
998 }
999
1000 @SuppressWarnings("unchecked")
1001 private static void points() {
1002 boolean ok = false;
1003 switch (feature.type) {
1004 case FOGSIG:
1005 if (Renderer.zoom >= 12) {
1006 if (feature.objs.containsKey(Obj.LIGHTS))
1007 lights();
1008 else
1009 Renderer.symbol(Harbours.Post);
1010 ok = true;
1011 }
1012 break;
1013 default:
1014 if (Renderer.zoom >= 14) {
1015 if (feature.objs.containsKey(Obj.LIGHTS))
1016 lights();
1017 else
1018 Renderer.symbol(Harbours.Post);
1019 ok = true;
1020 }
1021 break;
1022 }
1023 if (ok) {
1024 if (feature.objs.containsKey(Obj.TOPMAR)) {
1025 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
1026 if (topmap.containsKey(Att.TOPSHP)) {
1027 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), null);
1028 }
1029 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
1030 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
1031 if (topmap.containsKey(Att.TOPSHP)) {
1032 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), null);
1033 }
1034 }
1035 Signals.addSignals();
1036 }
1037 }
1038
1039 @SuppressWarnings("unchecked")
1040 private static void lights() {
1041 boolean ok = false;
1042 switch (feature.type) {
1043 case LITMAJ:
1044 case LNDMRK:
1045 if (Renderer.zoom >= 12) {
1046 Renderer.symbol(Beacons.LightMajor);
1047 ok = true;
1048 }
1049 break;
1050 case LITMIN:
1051 case LIGHTS:
1052 case PILPNT:
1053 if (Renderer.zoom >= 14) {
1054 Renderer.symbol(Beacons.LightMinor);
1055 ok = true;
1056 }
1057 break;
1058 default:
1059 break;
1060 }
1061 if (ok) {
1062 if (feature.objs.containsKey(Obj.TOPMAR)) {
1063 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
1064 if (topmap.containsKey(Att.TOPSHP)) {
1065 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)),
1066 getScheme(Obj.TOPMAR), Topmarks.LightDelta);
1067 }
1068 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
1069 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
1070 if (topmap.containsKey(Att.TOPSHP)) {
1071 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)),
1072 getScheme(Obj.DAYMAR), Topmarks.LightDelta);
1073 }
1074 }
1075 Signals.addSignals();
1076 }
1077 }
1078
1079 @SuppressWarnings("unchecked")
1080 private static void marinas() {
1081 if (Renderer.zoom >= 16) {
1082 ArrayList<Symbol> symbols = new ArrayList<>();
1083 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttList(Obj.SMCFAC, Att.CATSCF);
1084 for (CatSCF scf : scfs) {
1085 symbols.add(Facilities.Cats.get(scf));
1086 }
1087 Renderer.cluster(symbols);
1088 }
1089 }
1090
1091 private static void moorings() {
1092 if (Renderer.zoom >= 14) {
1093 switch ((CatMOR) getAttEnum(feature.type, Att.CATMOR)) {
1094 case MOR_DLPN:
1095 Renderer.symbol(Harbours.Dolphin);
1096 break;
1097 case MOR_DDPN:
1098 Renderer.symbol(Harbours.DeviationDolphin);
1099 break;
1100 case MOR_BLRD:
1101 case MOR_POST:
1102 Renderer.symbol(Harbours.Bollard);
1103 break;
1104 case MOR_BUOY:
1105 BoySHP shape = (BoySHP) getAttEnum(feature.type, Att.BOYSHP);
1106 if (shape == BoySHP.BOY_UNKN) {
1107 shape = BoySHP.BOY_SPHR;
1108 }
1109 Renderer.symbol(Buoys.Shapes.get(shape), getScheme(feature.type));
1110 Renderer.symbol(Topmarks.TopMooring, Topmarks.BuoyDeltas.get(shape));
1111 break;
1112 default:
1113 break;
1114 }
1115 Signals.addSignals();
1116 }
1117 }
1118
1119 @SuppressWarnings("unchecked")
1120 private static void notices() {
1121 if (Renderer.zoom >= 14) {
1122 double dx = 0.0, dy = 0.0;
1123 switch (feature.type) {
1124 case BCNCAR:
1125 case BCNISD:
1126 case BCNLAT:
1127 case BCNSAW:
1128 case BCNSPP:
1129 if (testAttribute(Obj.TOPMAR, Att.TOPSHP, TopSHP.TOP_BORD) || testAttribute(Obj.DAYMAR, Att.TOPSHP, TopSHP.TOP_BORD)) {
1130 dy = -100.0;
1131 } else {
1132 dy = -45.0;
1133 }
1134 break;
1135 case NOTMRK:
1136 dy = 0.0;
1137 break;
1138 default:
1139 return;
1140 }
1141 MarSYS sys = MarSYS.SYS_CEVN;
1142 BnkWTW bnk = BnkWTW.BWW_UNKN;
1143 AttVal<?> att = feature.atts.get(Att.MARSYS);
1144 if (att != null) sys = (MarSYS) att.val;
1145 att = feature.atts.get(Att.BNKWTW);
1146 if (att != null) bnk = (BnkWTW) att.val;
1147 ObjTab objs = feature.objs.get(Obj.NOTMRK);
1148 int n = objs.size();
1149 if (n > 5) {
1150 Renderer.symbol(Notices.Notice, new Delta(Handle.CC, AffineTransform.getTranslateInstance(dx, dy)));
1151 } else {
1152 int i = 0;
1153 for (AttMap atts : objs.values()) {
1154 if (atts.get(Att.MARSYS) != null) sys = ((ArrayList<MarSYS>) (atts.get(Att.MARSYS).val)).get(0);
1155 if (atts.get(Att.BNKWTW) != null) bnk = ((ArrayList<BnkWTW>) (atts.get(Att.BNKWTW).val)).get(0);
1156 CatNMK cat = CatNMK.NMK_UNKN;
1157 if (atts.get(Att.CATNMK) != null) cat = ((ArrayList<CatNMK>) (atts.get(Att.CATNMK).val)).get(0);
1158 Symbol sym = Notices.getNotice(cat, sys, bnk);
1159 Scheme sch = Notices.getScheme(sys, bnk);
1160 ArrayList<AddMRK> add = new ArrayList<>();
1161 if (atts.get(Att.ADDMRK) != null) add = (ArrayList<AddMRK>) (atts.get(Att.ADDMRK).val);
1162 Handle h = Handle.CC;
1163 double ax = 0.0;
1164 double ay = 0.0;
1165 switch (i) {
1166 case 0:
1167 if (n != 1) h = null;
1168 break;
1169 case 1:
1170 if (n <= 3) {
1171 h = Handle.RC;
1172 ax = -30;
1173 ay = dy;
1174 } else {
1175 h = Handle.BR;
1176 }
1177 break;
1178 case 2:
1179 if (n <= 3)
1180 h = Handle.LC;
1181 else
1182 h = Handle.BL;
1183 break;
1184 case 3:
1185 if (n == 4)
1186 h = Handle.TC;
1187 else
1188 h = Handle.TR;
1189 break;
1190 case 4:
1191 h = Handle.TL;
1192 break;
1193 }
1194 if (h != null) {
1195 Renderer.symbol(sym, sch, new Delta(h, AffineTransform.getTranslateInstance(dx, dy)));
1196 if (!add.isEmpty())
1197 Renderer.symbol(Notices.NoticeBoard, new Delta(Handle.BC, AffineTransform.getTranslateInstance(ax, ay - 30)));
1198 }
1199 i++;
1200 }
1201 }
1202 }
1203 }
1204
1205 private static void obstructions() {
1206 if ((Renderer.zoom >= 12) && (feature.type == Obj.OBSTRN)) {
1207 switch ((CatOBS) getAttEnum(feature.type, Att.CATOBS)) {
1208 case OBS_BOOM:
1209 Renderer.lineVector(new LineStyle(Color.black, 5, new float[] {20, 20}, null));
1210 if (Renderer.zoom >= 15) {
1211 Renderer.lineText("Boom", new Font("Arial", Font.PLAIN, 80), Color.black, -20);
1212 }
1213 default:
1214 break;
1215 }
1216 }
1217 if ((Renderer.zoom >= 14) && (feature.type == Obj.UWTROC)) {
1218 switch ((WatLEV) getAttEnum(feature.type, Att.WATLEV)) {
1219 case LEV_CVRS:
1220 Renderer.symbol(Areas.RockC);
1221 break;
1222 case LEV_AWSH:
1223 Renderer.symbol(Areas.RockA);
1224 break;
1225 default:
1226 Renderer.symbol(Areas.Rock);
1227 }
1228 } else {
1229 Renderer.symbol(Areas.Rock);
1230 }
1231 }
1232
1233 private static void pipelines() {
1234 if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
1235 if (feature.type == Obj.PIPSOL) {
1236 Renderer.lineSymbols(Areas.Pipeline, 1.0, null, null, 0, Symbols.Mline);
1237 } else if (feature.type == Obj.PIPOHD) {
1238 Renderer.lineVector(new LineStyle(Color.black, 8));
1239 AttMap atts = feature.atts;
1240 double verclr = 0;
1241 if (atts != null) {
1242 if (atts.containsKey(Att.VERCLR)) {
1243 verclr = (Double) atts.get(Att.VERCLR).val;
1244 } else {
1245 verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
1246 }
1247 if (verclr > 0) {
1248 Renderer.labelText(String.valueOf(verclr), new Font("Arial", Font.PLAIN, 50), Color.black, LabelStyle.VCLR,
1249 Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 25)));
1250 }
1251 }
1252 }
1253 }
1254 }
1255
1256 @SuppressWarnings("unchecked")
1257 private static void platforms() {
1258 ArrayList<CatOFP> cats = (ArrayList<CatOFP>) getAttList(Obj.OFSPLF, Att.CATOFP);
1259 if (cats.get(0) == CatOFP.OFP_FPSO)
1260 Renderer.symbol(Buoys.Storage);
1261 else
1262 Renderer.symbol(Landmarks.Platform);
1263 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
1264 Signals.addSignals();
1265 }
1266
1267 private static void ports() {
1268 if (Renderer.zoom >= 14) {
1269 if (feature.type == Obj.CRANES) {
1270 if ((CatCRN) getAttEnum(feature.type, Att.CATCRN) == CatCRN.CRN_CONT)
1271 Renderer.symbol(Harbours.ContainerCrane);
1272 else
1273 Renderer.symbol(Harbours.PortCrane);
1274 } else if (feature.type == Obj.HULKES) {
1275 Renderer.lineVector(new LineStyle(Color.black, 4, null, new Color(0xffe000)));
1276 addName(15, new Font("Arial", Font.BOLD, 40));
1277 }
1278 }
1279 }
1280
1281 private static void separation() {
1282 switch (feature.type) {
1283 case TSEZNE:
1284 case TSSCRS:
1285 case TSSRON:
1286 if (Renderer.zoom <= 15)
1287 Renderer.lineVector(new LineStyle(Symbols.Mtss));
1288 else
1289 Renderer.lineVector(new LineStyle(Symbols.Mtss, 20, null, null));
1290 addName(10, new Font("Arial", Font.BOLD, 150), Symbols.Mline);
1291 break;
1292 case TSELNE:
1293 Renderer.lineVector(new LineStyle(Symbols.Mtss, 20, null, null));
1294 break;
1295 case TSSLPT:
1296 Renderer.lineSymbols(Areas.LaneArrow, 0.5, null, null, 0, Symbols.Mtss);
1297 break;
1298 case TSSBND:
1299 Renderer.lineVector(new LineStyle(Symbols.Mtss, 20, new float[] {40, 40}, null));
1300 break;
1301 case ISTZNE:
1302 Renderer.lineSymbols(Areas.Restricted, 1.0, null, null, 0, Symbols.Mtss);
1303 break;
1304 default:
1305 break;
1306 }
1307 }
1308
1309 @SuppressWarnings("unchecked")
1310 private static void shoreline() {
1311 CatSLC cat = (CatSLC) getAttEnum(feature.type, Att.CATSLC);
1312 if ((Renderer.context.ruleset() == RuleSet.ALL) || (Renderer.context.ruleset() == RuleSet.BASE)) {
1313 if ((cat != CatSLC.SLC_SWAY) && (cat != CatSLC.SLC_TWAL)) {
1314 if (Renderer.zoom >= 12) {
1315 Renderer.lineVector(new LineStyle(Color.black, 10, Symbols.Yland));
1316 } else {
1317 Renderer.lineVector(new LineStyle(Symbols.Yland));
1318 }
1319 }
1320 }
1321 if ((Renderer.context.ruleset() == RuleSet.ALL) || (Renderer.context.ruleset() == RuleSet.SEAMARK)) {
1322 if (Renderer.zoom >= 12) {
1323 switch (cat) {
1324 case SLC_TWAL:
1325 WatLEV lev = (WatLEV) getAttEnum(feature.type, Att.WATLEV);
1326 if (lev == WatLEV.LEV_CVRS) {
1327 Renderer.lineVector(new LineStyle(Color.black, 10, new float[] {40, 40}, null));
1328 if (Renderer.zoom >= 15)
1329 Renderer.lineText("(covers)", new Font("Arial", Font.PLAIN, 60), Color.black, 80);
1330 } else {
1331 Renderer.lineVector(new LineStyle(Color.black, 10, null, null));
1332 }
1333 if (Renderer.zoom >= 15)
1334 Renderer.lineText("Training Wall", new Font("Arial", Font.PLAIN, 60), Color.black, -30);
1335 break;
1336 case SLC_SWAY:
1337 Renderer.lineVector(new LineStyle(Color.black, 2, null, new Color(0xffe000)));
1338 if ((Renderer.zoom >= 16) && feature.objs.containsKey(Obj.SMCFAC)) {
1339 ArrayList<Symbol> symbols = new ArrayList<>();
1340 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttList(Obj.SMCFAC, Att.CATSCF);
1341 for (CatSCF scf : scfs) {
1342 symbols.add(Facilities.Cats.get(scf));
1343 }
1344 Renderer.cluster(symbols);
1345 }
1346 break;
1347 default:
1348 break;
1349 }
1350 }
1351 }
1352 }
1353
1354 @SuppressWarnings("unchecked")
1355 private static void stations() {
1356 if (Renderer.zoom >= 14) {
1357 String str = "";
1358 switch (feature.type) {
1359 case SISTAT:
1360 Renderer.symbol(Harbours.SignalStation);
1361 str = "SS";
1362 ArrayList<CatSIT> tcats = (ArrayList<CatSIT>) getAttList(Obj.SISTAT, Att.CATSIT);
1363 switch (tcats.get(0)) {
1364 case SIT_IPT:
1365 str += "(INT)";
1366 break;
1367 case SIT_PRTE:
1368 str += "(Traffic)";
1369 break;
1370 case SIT_PRTC:
1371 str += "(Port Control)";
1372 break;
1373 case SIT_LOCK:
1374 str += "(Lock)";
1375 break;
1376 case SIT_BRDG:
1377 str += "(Bridge)";
1378 break;
1379 default:
1380 break;
1381 }
1382 break;
1383 case SISTAW:
1384 Renderer.symbol(Harbours.SignalStation);
1385 str = "SS";
1386 str = "SS";
1387 ArrayList<CatSIW> wcats = (ArrayList<CatSIW>) getAttList(Obj.SISTAW, Att.CATSIW);
1388 switch (wcats.get(0)) {
1389 case SIW_STRM:
1390 str += "(Storm)";
1391 break;
1392 case SIW_WTHR:
1393 str += "(Weather)";
1394 break;
1395 case SIW_ICE:
1396 str += "(Ice)";
1397 break;
1398 case SIW_TIDG:
1399 str = "Tide gauge";
1400 break;
1401 case SIW_TIDS:
1402 str = "Tide scale";
1403 break;
1404 case SIW_TIDE:
1405 str += "(Tide)";
1406 break;
1407 case SIW_TSTR:
1408 str += "(Stream)";
1409 break;
1410 case SIW_DNGR:
1411 str += "(Danger)";
1412 break;
1413 case SIW_MILY:
1414 str += "(Firing)";
1415 break;
1416 case SIW_TIME:
1417 str += "(Time)";
1418 break;
1419 default:
1420 break;
1421 }
1422 break;
1423 case RDOSTA:
1424 case RTPBCN:
1425 Renderer.symbol(Harbours.SignalStation);
1426 Renderer.symbol(Beacons.RadarStation);
1427 break;
1428 case RADRFL:
1429 Renderer.symbol(Topmarks.RadarReflector);
1430 break;
1431 case RADSTA:
1432 Renderer.symbol(Harbours.SignalStation);
1433 Renderer.symbol(Beacons.RadarStation);
1434 Renderer.labelText("Ra", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb,
1435 new Delta(Handle.TR, AffineTransform.getTranslateInstance(-30, -70)));
1436 break;
1437 case PILBOP:
1438 Renderer.symbol(Harbours.Pilot);
1439 addName(15, new Font("Arial", Font.BOLD, 40), Symbols.Msymb,
1440 new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, -40)));
1441 CatPIL cat = (CatPIL) getAttEnum(feature.type, Att.CATPIL);
1442 if (cat == CatPIL.PIL_HELI) {
1443 Renderer.labelText("H", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb,
1444 new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
1445 }
1446 break;
1447 case CGUSTA:
1448 Renderer.symbol(Harbours.SignalStation);
1449 str = "CG";
1450 if (feature.objs.containsKey(Obj.RSCSTA)) Renderer.symbol(Harbours.Rescue,
1451 new Delta(Handle.CC, AffineTransform.getTranslateInstance(130, 0)));
1452 break;
1453 case RSCSTA:
1454 Renderer.symbol(Harbours.Rescue);
1455 break;
1456 default:
1457 break;
1458 }
1459 if ((Renderer.zoom >= 15) && !str.isEmpty()) {
1460 Renderer.labelText(str, new Font("Arial", Font.PLAIN, 40), Color.black,
1461 new Delta(Handle.LC, AffineTransform.getTranslateInstance(40, 0)));
1462 }
1463 Signals.addSignals();
1464 }
1465 }
1466
1467 private static void transits() {
1468 if (Renderer.zoom >= 14) {
1469 if (feature.type == Obj.RECTRC) Renderer.lineVector(new LineStyle(Color.black, 10, null, null));
1470 else if (feature.type == Obj.NAVLNE) Renderer.lineVector(new LineStyle(Color.black, 10, new float[] {25, 25}, null));
1471 }
1472 if (Renderer.zoom >= 15) {
1473 String str = "";
1474 String name = getName();
1475 if (name != null)
1476 str += name + " ";
1477 Double ort;
1478 if ((ort = (Double) getAttVal(feature.type, Att.ORIENT)) != null) {
1479 str += df.format(ort) + "º";
1480 if (!str.isEmpty())
1481 Renderer.lineText(str, new Font("Arial", Font.PLAIN, 80), Color.black, -20);
1482 }
1483 }
1484 }
1485
1486 private static void waterways() {
1487 Renderer.lineVector(new LineStyle(Symbols.Bwater, 20, (feature.geom.prim == Pflag.AREA) ? Symbols.Bwater : null));
1488 }
1489
1490 private static void wrecks() {
1491 if (Renderer.zoom >= 14) {
1492 switch ((CatWRK) getAttEnum(feature.type, Att.CATWRK)) {
1493 case WRK_DNGR:
1494 case WRK_MSTS:
1495 Renderer.symbol(Areas.WreckD);
1496 break;
1497 case WRK_HULS:
1498 Renderer.symbol(Areas.WreckS);
1499 break;
1500 default:
1501 Renderer.symbol(Areas.WreckND);
1502 }
1503 }
1504 }
1505}
Note: See TracBrowser for help on using the repository browser.