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

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

use diamond operator

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