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

Last change on this file since 35461 was 35461, checked in by malcolmh, 4 years ago

[Seachart] Publish new release

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