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

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

add sandwaves

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