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

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

Add seabed surface

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