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

Last change on this file since 32097 was 32095, checked in by malcolmh, 9 years ago

[SeaChart] improvements

File size: 46.5 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, Color>(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, Patt>(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<Color>();
147 for (ColCOL col : (ArrayList<ColCOL>) getAttList(obj, Att.COLOUR)) {
148 colours.add(bodyColours.get(col));
149 }
150 ArrayList<Patt> patterns = new ArrayList<Patt>();
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, int idx, Att att) {
158 AttMap atts;
159 if ((atts = getAtts(obj, idx)) != 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 (testObject(Obj.SLCONS)) for (Feature f : objects) if (testFeature(f)) shoreline();
219 if ((Renderer.context.ruleset() == RuleSet.ALL) || (Renderer.context.ruleset() == RuleSet.SEAMARK)) {
220 if (testObject(Obj.PIPSOL)) for (Feature f : objects) if (testFeature(f)) pipelines();
221 if (testObject(Obj.CBLSUB)) for (Feature f : objects) if (testFeature(f)) cables();
222 if (testObject(Obj.PIPOHD)) for (Feature f : objects) if (testFeature(f)) pipelines();
223 if (testObject(Obj.CBLOHD)) for (Feature f : objects) if (testFeature(f)) cables();
224 if (testObject(Obj.TSEZNE)) for (Feature f : objects) if (testFeature(f)) separation();
225 if (testObject(Obj.TSSCRS)) for (Feature f : objects) if (testFeature(f)) separation();
226 if (testObject(Obj.TSSRON)) for (Feature f : objects) if (testFeature(f)) separation();
227 if (testObject(Obj.TSELNE)) for (Feature f : objects) if (testFeature(f)) separation();
228 if (testObject(Obj.TSSLPT)) for (Feature f : objects) if (testFeature(f)) separation();
229 if (testObject(Obj.TSSBND)) for (Feature f : objects) if (testFeature(f)) separation();
230 if (testObject(Obj.ISTZNE)) for (Feature f : objects) if (testFeature(f)) separation();
231 if (testObject(Obj.SNDWAV)) for (Feature f : objects) if (testFeature(f)) areas();
232 if (testObject(Obj.OSPARE)) for (Feature f : objects) if (testFeature(f)) areas();
233 if (testObject(Obj.FAIRWY)) for (Feature f : objects) if (testFeature(f)) areas();
234 if (testObject(Obj.DRGARE)) for (Feature f : objects) if (testFeature(f)) areas();
235 if (testObject(Obj.RESARE)) for (Feature f : objects) if (testFeature(f)) areas();
236 if (testObject(Obj.PRCARE)) for (Feature f : objects) if (testFeature(f)) areas();
237 if (testObject(Obj.SPLARE)) for (Feature f : objects) if (testFeature(f)) areas();
238 if (testObject(Obj.SEAARE)) for (Feature f : objects) if (testFeature(f)) areas();
239 if (testObject(Obj.OBSTRN)) for (Feature f : objects) if (testFeature(f)) obstructions();
240 if (testObject(Obj.UWTROC)) for (Feature f : objects) if (testFeature(f)) obstructions();
241 if (testObject(Obj.MARCUL)) for (Feature f : objects) if (testFeature(f)) areas();
242 if (testObject(Obj.RECTRC)) for (Feature f : objects) if (testFeature(f)) transits();
243 if (testObject(Obj.NAVLNE)) for (Feature f : objects) if (testFeature(f)) transits();
244 if (testObject(Obj.HRBFAC)) for (Feature f : objects) if (testFeature(f)) harbours();
245 if (testObject(Obj.ACHARE)) for (Feature f : objects) if (testFeature(f)) harbours();
246 if (testObject(Obj.ACHBRT)) for (Feature f : objects) if (testFeature(f)) harbours();
247 if (testObject(Obj.BERTHS)) for (Feature f : objects) if (testFeature(f)) harbours();
248 if (testObject(Obj.DISMAR)) for (Feature f : objects) if (testFeature(f)) distances();
249 if (testObject(Obj.HULKES)) for (Feature f : objects) if (testFeature(f)) ports();
250 if (testObject(Obj.CRANES)) for (Feature f : objects) if (testFeature(f)) ports();
251 if (testObject(Obj.LNDMRK)) for (Feature f : objects) if (testFeature(f)) landmarks();
252 if (testObject(Obj.SILTNK)) for (Feature f : objects) if (testFeature(f)) landmarks();
253 if (testObject(Obj.BUISGL)) for (Feature f : objects) if (testFeature(f)) harbours();
254 if (testObject(Obj.MORFAC)) for (Feature f : objects) if (testFeature(f)) moorings();
255 if (testObject(Obj.NOTMRK)) for (Feature f : objects) if (testFeature(f)) notices();
256 if (testObject(Obj.SMCFAC)) for (Feature f : objects) if (testFeature(f)) marinas();
257 if (testObject(Obj.BRIDGE)) for (Feature f : objects) if (testFeature(f)) bridges();
258 if (testObject(Obj.PILPNT)) for (Feature f : objects) if (testFeature(f)) lights();
259 if (testObject(Obj.RDOCAL)) for (Feature f : objects) if (testFeature(f)) callpoint();
260 if (testObject(Obj.LITMIN)) for (Feature f : objects) if (testFeature(f)) lights();
261 if (testObject(Obj.LITMAJ)) for (Feature f : objects) if (testFeature(f)) lights();
262 if (testObject(Obj.LIGHTS)) for (Feature f : objects) if (testFeature(f)) lights();
263 if (testObject(Obj.SISTAT)) for (Feature f : objects) if (testFeature(f)) stations();
264 if (testObject(Obj.SISTAW)) for (Feature f : objects) if (testFeature(f)) stations();
265 if (testObject(Obj.CGUSTA)) for (Feature f : objects) if (testFeature(f)) stations();
266 if (testObject(Obj.RDOSTA)) for (Feature f : objects) if (testFeature(f)) stations();
267 if (testObject(Obj.RADRFL)) for (Feature f : objects) if (testFeature(f)) stations();
268 if (testObject(Obj.RADSTA)) for (Feature f : objects) if (testFeature(f)) stations();
269 if (testObject(Obj.RTPBCN)) for (Feature f : objects) if (testFeature(f)) stations();
270 if (testObject(Obj.RSCSTA)) for (Feature f : objects) if (testFeature(f)) stations();
271 if (testObject(Obj.PILBOP)) for (Feature f : objects) if (testFeature(f)) stations();
272 if (testObject(Obj.WTWGAG)) for (Feature f : objects) if (testFeature(f)) gauges();
273 if (testObject(Obj.OFSPLF)) for (Feature f : objects) if (testFeature(f)) platforms();
274 if (testObject(Obj.WRECKS)) for (Feature f : objects) if (testFeature(f)) wrecks();
275 if (testObject(Obj.LITVES)) for (Feature f : objects) if (testFeature(f)) floats();
276 if (testObject(Obj.LITFLT)) for (Feature f : objects) if (testFeature(f)) floats();
277 if (testObject(Obj.BOYINB)) for (Feature f : objects) if (testFeature(f)) floats();
278 if (testObject(Obj.BOYLAT)) for (Feature f : objects) if (testFeature(f)) buoys();
279 if (testObject(Obj.BOYCAR)) for (Feature f : objects) if (testFeature(f)) buoys();
280 if (testObject(Obj.BOYISD)) for (Feature f : objects) if (testFeature(f)) buoys();
281 if (testObject(Obj.BOYSAW)) for (Feature f : objects) if (testFeature(f)) buoys();
282 if (testObject(Obj.BOYSPP)) for (Feature f : objects) if (testFeature(f)) buoys();
283 if (testObject(Obj.BCNLAT)) for (Feature f : objects) if (testFeature(f)) beacons();
284 if (testObject(Obj.BCNCAR)) for (Feature f : objects) if (testFeature(f)) beacons();
285 if (testObject(Obj.BCNISD)) for (Feature f : objects) if (testFeature(f)) beacons();
286 if (testObject(Obj.BCNSAW)) for (Feature f : objects) if (testFeature(f)) beacons();
287 if (testObject(Obj.BCNSPP)) for (Feature f : objects) if (testFeature(f)) beacons();
288 }
289 }
290
291 private static void areas() {
292 String name = getName();
293 switch (feature.type) {
294 case BUAARE:
295 Renderer.lineVector(new LineStyle(new Color(0x20000000, true)));
296 break;
297 case COALNE:
298 if (Renderer.zoom >= 12)
299 Renderer.lineVector(new LineStyle(Color.black, 10));
300 break;
301 case DEPARE:
302 Double depmax = 0.0;
303 if (((depmax = (Double) getAttVal(Obj.DEPARE, Att.DRVAL2)) != null) && (depmax <= 0.0)) {
304 Renderer.lineVector(new LineStyle(Symbols.Gdries));
305 }
306 break;
307 case LAKARE:
308 if ((Renderer.zoom >= 12) || (feature.geom.area > 10.0))
309 Renderer.lineVector(new LineStyle(Symbols.Bwater));
310 break;
311 case DRGARE:
312 if (Renderer.zoom < 16)
313 Renderer.lineVector(new LineStyle(Color.black, 8, new float[] { 25, 25 }, new Color(0x40ffffff, true)));
314 else
315 Renderer.lineVector(new LineStyle(Color.black, 8, new float[] { 25, 25 }));
316 addName(12, new Font("Arial", Font.PLAIN, 100), new Delta(Handle.CC, new AffineTransform()));
317 break;
318 case FAIRWY:
319 if (feature.geom.area > 2.0) {
320 if (Renderer.zoom < 16)
321 Renderer.lineVector(new LineStyle(Symbols.Mline, 8, new float[] { 50, 50 }, new Color(0x40ffffff, true)));
322 else
323 Renderer.lineVector(new LineStyle(Symbols.Mline, 8, new float[] { 50, 50 }));
324 } else {
325 if (Renderer.zoom >= 14)
326 Renderer.lineVector(new LineStyle(new Color(0x40ffffff, true)));
327 }
328 break;
329 case LKBSPT:
330 case LOKBSN:
331 case HRBBSN:
332 if (Renderer.zoom >= 12) {
333 Renderer.lineVector(new LineStyle(Color.black, 10, Symbols.Bwater));
334 } else {
335 Renderer.lineVector(new LineStyle(Symbols.Bwater));
336 }
337 break;
338 case HRBFAC:
339 if (feature.objs.get(Obj.HRBBSN) != null) {
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 }
346 break;
347 case LNDARE:
348 Renderer.lineVector(new LineStyle(Symbols.Yland));
349 break;
350 case MARCUL:
351 if (Renderer.zoom >= 12) {
352 if (Renderer.zoom >= 14) {
353 Renderer.symbol(Areas.MarineFarm);
354 }
355 if ((feature.geom.area > 0.2) || ((feature.geom.area > 0.05) && (Renderer.zoom >= 14)) || ((feature.geom.area > 0.005) && (Renderer.zoom >= 16))) {
356 Renderer.lineVector(new LineStyle(Color.black, 4, new float[] { 10, 10 }));
357 }
358 }
359 break;
360 case OSPARE:
361 if (testAttribute(feature.type, Att.CATPRA, CatPRA.PRA_WFRM)) {
362 Renderer.symbol(Areas.WindFarm);
363 Renderer.lineVector(new LineStyle(Color.black, 20, new float[] { 40, 40 }));
364 addName(15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
365 }
366 break;
367 case RESARE:
368 case MIPARE:
369 if (Renderer.zoom >= 12) {
370 Renderer.lineSymbols(Areas.Restricted, 1.0, null, null, 0, Symbols.Mline);
371 if (testAttribute(feature.type, Att.CATREA, CatREA.REA_NWAK)) {
372 Renderer.symbol(Areas.NoWake);
373 }
374 }
375 break;
376 case PRCARE:
377 if (Renderer.zoom >= 12) {
378 Renderer.lineVector(new LineStyle(Symbols.Mline, 10, new float[] { 40, 40 }));
379 }
380 break;
381 case SEAARE:
382 switch ((CatSEA) getAttEnum(feature.type, Att.CATSEA)) {
383 case SEA_RECH:
384 if ((Renderer.zoom >= 10) && (name != null))
385 if (feature.geom.prim == Pflag.LINE) {
386 Renderer.lineText(name, new Font("Arial", Font.PLAIN, 150), Color.black, 0.5, -40);
387 } else {
388 Renderer.labelText(name, new Font("Arial", Font.PLAIN, 150), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
389 }
390 break;
391 case SEA_BAY:
392 if ((Renderer.zoom >= 12) && (name != null))
393 if (feature.geom.prim == Pflag.LINE) {
394 Renderer.lineText(name, new Font("Arial", Font.PLAIN, 150), Color.black, 0.5, -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_SHOL:
400 if (Renderer.zoom >= 14) {
401 if (feature.geom.prim == Pflag.AREA) {
402 Renderer.lineVector(new LineStyle(new Color(0xc480ff), 4, new float[] { 25, 25 }));
403 if (name != null) {
404 Renderer.labelText(name, new Font("Arial", Font.ITALIC, 75), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
405 Renderer.labelText("(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, new Delta(Handle.BC));
406 }
407 } else if (feature.geom.prim == Pflag.LINE) {
408 if (name != null) {
409 Renderer.lineText(name, new Font("Arial", Font.ITALIC, 75), Color.black, 0.5, -40);
410 Renderer.lineText("(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, 0.5, 0);
411 }
412 } else {
413 if (name != null) {
414 Renderer.labelText(name, new Font("Arial", Font.ITALIC, 75), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
415 Renderer.labelText("(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, new Delta(Handle.BC));
416 }
417 }
418 }
419 break;
420 case SEA_GAT:
421 case SEA_NRRW:
422 addName(12, new Font("Arial", Font.PLAIN, 100));
423 break;
424 default:
425 break;
426 }
427 break;
428 case SNDWAV:
429 if (Renderer.zoom >= 12) Renderer.fillPattern(Areas.Sandwaves);
430 break;
431 case SPLARE:
432 if (Renderer.zoom >= 12) {
433 Renderer.symbol(Areas.Plane, new Scheme(Symbols.Msymb));
434 Renderer.lineSymbols(Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Symbols.Mline);
435 }
436 addName(15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
437 break;
438 default:
439 break;
440 }
441 }
442
443 @SuppressWarnings("unchecked")
444 private static void beacons() {
445 if ((Renderer.zoom >= 14) || ((Renderer.zoom >= 12) && ((feature.type == Obj.BCNLAT) || (feature.type == Obj.BCNCAR)))
446 || ((Renderer.zoom >= 11) && ((feature.type == Obj.BCNSAW) || hasObject(Obj.RTPBCN)))) {
447 BcnSHP shape = (BcnSHP)getAttEnum(feature.type, Att.BCNSHP);
448 if (shape == BcnSHP.BCN_UNKN)
449 shape = BcnSHP.BCN_PILE;
450 if ((shape == BcnSHP.BCN_WTHY) && (feature.type == Obj.BCNLAT)) {
451 switch ((CatLAM) getAttEnum(feature.type, Att.CATLAM)) {
452 case LAM_PORT:
453 Renderer.symbol(Beacons.WithyPort);
454 break;
455 case LAM_STBD:
456 Renderer.symbol(Beacons.WithyStarboard);
457 break;
458 default:
459 Renderer.symbol(Beacons.Stake, getScheme(feature.type));
460 }
461 } else if ((shape == BcnSHP.BCN_PRCH) && (feature.type == Obj.BCNLAT) && !(feature.objs.containsKey(Obj.TOPMAR))) {
462 switch ((CatLAM) getAttEnum(feature.type, Att.CATLAM)) {
463 case LAM_PORT:
464 Renderer.symbol(Beacons.PerchPort);
465 break;
466 case LAM_STBD:
467 Renderer.symbol(Beacons.PerchStarboard);
468 break;
469 default:
470 Renderer.symbol(Beacons.Stake, getScheme(feature.type));
471 }
472 } else {
473 Renderer.symbol(Beacons.Shapes.get(shape), getScheme(feature.type));
474 if (feature.objs.containsKey(Obj.TOPMAR)) {
475 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
476 if (topmap.containsKey(Att.TOPSHP)) {
477 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>)(topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), Topmarks.BeaconDelta);
478 }
479 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
480 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
481 if (topmap.containsKey(Att.TOPSHP)) {
482 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>)(topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), Topmarks.BeaconDelta);
483 }
484 }
485 }
486 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
487 Signals.addSignals();
488 }
489 }
490
491 @SuppressWarnings("unchecked")
492 private static void buoys() {
493 if ((Renderer.zoom >= 14) || ((Renderer.zoom >= 12) && ((feature.type == Obj.BOYLAT) || (feature.type == Obj.BOYCAR)))
494 || ((Renderer.zoom >= 11) && ((feature.type == Obj.BOYSAW) || hasObject(Obj.RTPBCN)))) {
495 BoySHP shape = (BoySHP) getAttEnum(feature.type, Att.BOYSHP);
496 if (shape == BoySHP.BOY_UNKN) shape = BoySHP.BOY_PILR;
497 Renderer.symbol(Buoys.Shapes.get(shape), getScheme(feature.type));
498 if (feature.objs.containsKey(Obj.TOPMAR)) {
499 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
500 if (topmap.containsKey(Att.TOPSHP)) {
501 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>)(topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), Topmarks.BuoyDeltas.get(shape));
502 }
503 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
504 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
505 if (topmap.containsKey(Att.TOPSHP)) {
506 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>)(topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), Topmarks.BuoyDeltas.get(shape));
507 }
508 }
509 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
510 Signals.addSignals();
511 }
512 }
513
514 private static void bridges() {
515 if (Renderer.zoom >= 16) {
516 double verclr, verccl, vercop, horclr;
517 AttMap atts = feature.objs.get(Obj.BRIDGE).get(0);
518 String vstr = "";
519 String hstr = "";
520 if (atts != null) {
521 if (atts.containsKey(Att.HORCLR)) {
522 horclr = (Double) atts.get(Att.HORCLR).val;
523 hstr = String.valueOf(horclr);
524 }
525 if (atts.containsKey(Att.VERCLR)) {
526 verclr = (Double) atts.get(Att.VERCLR).val;
527 } else {
528 verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
529 }
530 verccl = atts.containsKey(Att.VERCCL) ? (Double) atts.get(Att.VERCCL).val : 0;
531 vercop = atts.containsKey(Att.VERCOP) ? (Double) atts.get(Att.VERCOP).val : 0;
532 if (verclr > 0) {
533 vstr += String.valueOf(verclr);
534 } else if (verccl > 0) {
535 if (vercop == 0) {
536 vstr += String.valueOf(verccl) + "/-";
537 } else {
538 vstr += String.valueOf(verccl) + "/" + String.valueOf(vercop);
539 }
540 }
541 if (hstr.isEmpty() && !vstr.isEmpty()) {
542 Renderer.labelText(vstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.CC));
543 } else if (!hstr.isEmpty() && !vstr.isEmpty()) {
544 Renderer.labelText(vstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.BC));
545 Renderer.labelText(hstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.HCLR, Color.black, Color.white, new Delta(Handle.TC));
546 } else if (!hstr.isEmpty() && vstr.isEmpty()) {
547 Renderer.labelText(hstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.HCLR, Color.black, Color.white, new Delta(Handle.CC));
548 }
549 }
550 }
551 }
552
553 private static void cables() {
554 if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
555 if (feature.type == Obj.CBLSUB) {
556 Renderer.lineSymbols(Areas.Cable, 0.0, null, null, 0, Symbols.Mline);
557 } else if (feature.type == Obj.CBLOHD) {
558 AttMap atts = feature.objs.get(Obj.CBLOHD).get(0);
559 if ((atts != null) && (atts.containsKey(Att.CATCBL)) && (atts.get(Att.CATCBL).val == CatCBL.CBL_POWR)) {
560 Renderer.lineSymbols(Areas.CableDash, 0, Areas.CableDot, Areas.CableFlash, 2, Color.black);
561 } else {
562 Renderer.lineSymbols(Areas.CableDash, 0, Areas.CableDot, null, 2, Color.black);
563 }
564 if (atts != null) {
565 if (atts.containsKey(Att.VERCLR)) {
566 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)));
567 } else if (atts.containsKey(Att.VERCSA)) {
568 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)));
569 }
570 }
571 }
572 }
573 }
574
575 private static void callpoint() {
576 if (Renderer.zoom >= 14) {
577 Symbol symb = Harbours.CallPoint2;
578 TrfTRF trf = (TrfTRF) getAttEnum(feature.type, Att.TRAFIC);
579 if (trf != TrfTRF.TRF_TWOW) {
580 symb = Harbours.CallPoint1;
581 }
582 Double orient = 0.0;
583 if ((orient = (Double) getAttVal(feature.type, Att.ORIENT)) == null) {
584 orient = 0.0;
585 }
586 Renderer.symbol(symb, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(orient))));
587 String chn;
588 if (!(chn = getAttStr(feature.type, Att.COMCHA)).isEmpty()) {
589 Renderer.labelText(("Ch." + chn), new Font("Arial", Font.PLAIN, 50), Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0,50)));
590 }
591 }
592 }
593
594 private static void distances() {
595 if (Renderer.zoom >= 14) {
596 if (!testAttribute(Obj.DISMAR, Att.CATDIS, CatDIS.DIS_NONI)) {
597 Renderer.symbol(Harbours.DistanceI);
598 } else {
599 Renderer.symbol(Harbours.DistanceU);
600 }
601 if (Renderer.zoom >= 15) {
602 AttMap atts = getAtts(Obj.DISMAR, 0);
603 if ((atts != null) && (atts.containsKey(Att.WTWDIS))) {
604 Double dist = (Double) atts.get(Att.WTWDIS).val;
605 String str = "";
606 if (atts.containsKey(Att.HUNITS)) {
607 switch ((UniHLU) atts.get(Att.HUNITS).val) {
608 case HLU_METR:
609 str += "m ";
610 break;
611 case HLU_FEET:
612 str += "ft ";
613 break;
614 case HLU_HMTR:
615 str += "hm ";
616 break;
617 case HLU_KMTR:
618 str += "km ";
619 break;
620 case HLU_SMIL:
621 str += "M ";
622 break;
623 case HLU_NMIL:
624 str += "NM ";
625 break;
626 default:
627 break;
628 }
629 }
630 str += String.format("%1.0f", dist);
631 Renderer.labelText(str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 45)));
632 }
633 }
634 }
635 }
636
637 @SuppressWarnings("unchecked")
638 private static void floats() {
639 if ((Renderer.zoom >= 12) || ((Renderer.zoom >= 11) && ((feature.type == Obj.LITVES) || (feature.type == Obj.BOYINB) || hasObject(Obj.RTPBCN)))) {
640 switch (feature.type) {
641 case LITVES:
642 Renderer.symbol(Buoys.Super, getScheme(feature.type));
643 break;
644 case LITFLT:
645 Renderer.symbol(Buoys.Float, getScheme(feature.type));
646 break;
647 case BOYINB:
648 Renderer.symbol(Buoys.Super, getScheme(feature.type));
649 break;
650 default:
651 break;
652 }
653 if (feature.objs.containsKey(Obj.TOPMAR)) {
654 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
655 if (topmap.containsKey(Att.TOPSHP)) {
656 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>)(topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), Topmarks.FloatDelta);
657 }
658 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
659 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
660 if (topmap.containsKey(Att.TOPSHP)) {
661 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>)(topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), Topmarks.FloatDelta);
662 }
663 }
664 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
665 Signals.addSignals();
666 }
667 }
668
669 private static void gauges() {
670 if (Renderer.zoom >= 14) {
671 Renderer.symbol(Harbours.TideGauge);
672 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
673 Signals.addSignals();
674 }
675 }
676
677 @SuppressWarnings("unchecked")
678 private static void harbours() {
679 String name = getName();
680 switch (feature.type) {
681 case ACHBRT:
682 if (Renderer.zoom >= 14) {
683 Renderer.symbol(Harbours.Anchorage, new Scheme(Symbols.Mline));
684 if (Renderer.zoom >= 15) {
685 Renderer.labelText(name == null ? "" : name, new Font("Arial", Font.PLAIN, 30), Symbols.Msymb, LabelStyle.RRCT, Symbols.Mline, Color.white, new Delta(Handle.BC));
686 }
687 }
688 if (getAttVal(Obj.ACHBRT, Att.RADIUS) != null) {
689 double radius;
690 if ((radius = (Double) getAttVal(Obj.ACHBRT, Att.RADIUS)) != 0) {
691 UniHLU units = (UniHLU) getAttEnum(Obj.ACHBRT, Att.HUNITS);
692 if (units == UniHLU.HLU_UNKN) {
693 units = UniHLU.HLU_METR;
694 }
695 Renderer.lineCircle(new LineStyle(Symbols.Mline, 4, new float[] { 10, 10 }, null), radius, units);
696 }
697 }
698 break;
699 case ACHARE:
700 if (Renderer.zoom >= 12) {
701 if (feature.geom.prim != Pflag.AREA) {
702 Renderer.symbol(Harbours.Anchorage, new Scheme(Color.black));
703 } else {
704 Renderer.symbol(Harbours.Anchorage, new Scheme(Symbols.Mline));
705 Renderer.lineSymbols(Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Symbols.Mline);
706 }
707 addName(15, new Font("Arial", Font.BOLD, 60), Symbols.Mline, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
708 ArrayList<StsSTS> sts = (ArrayList<StsSTS>) getAttList(Obj.ACHARE, Att.STATUS);
709 if ((Renderer.zoom >= 15) && (sts.contains(StsSTS.STS_RESV))) {
710 Renderer.labelText("Reserved", new Font("Arial", Font.PLAIN, 50), Symbols.Mline, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60)));
711 }
712 ArrayList<CatACH> cats = (ArrayList<CatACH>) getAttList(Obj.ACHARE, Att.CATACH);
713 int dy = (cats.size() - 1) * -30;
714 for (CatACH cat : cats) {
715 switch (cat) {
716 case ACH_DEEP:
717 Renderer.labelText("DW", new Font("Arial", Font.BOLD, 50), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
718 dy += 60;
719 break;
720 case ACH_TANK:
721 Renderer.labelText("Tanker", new Font("Arial", Font.BOLD, 50), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
722 dy += 60;
723 break;
724 case ACH_H24P:
725 Renderer.labelText("24h", new Font("Arial", Font.BOLD, 50), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
726 dy += 60;
727 break;
728 case ACH_EXPL:
729 Renderer.symbol(Harbours.Explosives, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
730 dy += 60;
731 break;
732 case ACH_QUAR:
733 Renderer.symbol(Harbours.Hospital, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
734 dy += 60;
735 break;
736 case ACH_SEAP:
737 Renderer.symbol(Areas.Seaplane, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
738 dy += 60;
739 break;
740 default:
741 }
742 }
743 }
744 break;
745 case BERTHS:
746 if (Renderer.zoom >= 14) {
747 Renderer.lineVector(new LineStyle(Symbols.Mline, 6, new float[] { 20, 20 }));
748 Renderer.labelText(name == null ? " " : name, new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, LabelStyle.RRCT, Symbols.Mline, Color.white);
749 }
750 break;
751 case BUISGL:
752 if (Renderer.zoom >= 16) {
753 ArrayList<Symbol> symbols = new ArrayList<Symbol>();
754 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) getAttList(Obj.BUISGL, Att.FUNCTN);
755 for (FncFNC fnc : fncs) {
756 symbols.add(Landmarks.Funcs.get(fnc));
757 }
758 if (feature.objs.containsKey(Obj.SMCFAC)) {
759 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttList(Obj.SMCFAC, Att.CATSCF);
760 for (CatSCF scf : scfs) {
761 symbols.add(Facilities.Cats.get(scf));
762 }
763 }
764 Renderer.cluster(symbols);
765 }
766 break;
767 case HRBFAC:
768 if (Renderer.zoom >= 12) {
769 ArrayList<CatHAF> cathaf = (ArrayList<CatHAF>) getAttList(Obj.HRBFAC, Att.CATHAF);
770 if (cathaf.size() == 1) {
771 switch (cathaf.get(0)) {
772 case HAF_MRNA:
773 Renderer.symbol(Harbours.Marina);
774 break;
775 case HAF_MANF:
776 Renderer.symbol(Harbours.MarinaNF);
777 break;
778 case HAF_FISH:
779 Renderer.symbol(Harbours.Fishing);
780 break;
781 default:
782 Renderer.symbol(Harbours.Harbour);
783 break;
784 }
785 } else {
786 Renderer.symbol(Harbours.Harbour);
787 }
788 }
789 break;
790 default:
791 break;
792 }
793 }
794
795 @SuppressWarnings("unchecked")
796 private static void highways() {
797 switch (feature.type) {
798 case ROADWY:
799 ArrayList<CatROD> cat = (ArrayList<CatROD>) (getAttList(Obj.ROADWY, Att.CATROD));
800 if (cat.size() > 0) {
801 switch (cat.get(0)) {
802 case ROD_MWAY:
803 Renderer.lineVector(new LineStyle(Color.black, 20));
804 break;
805 case ROD_MAJR:
806 Renderer.lineVector(new LineStyle(Color.black, 15));
807 break;
808 case ROD_MINR:
809 Renderer.lineVector(new LineStyle(Color.black, 10));
810 break;
811 default:
812 Renderer.lineVector(new LineStyle(Color.black, 5));
813 }
814 } else {
815 Renderer.lineVector(new LineStyle(Color.black, 5));
816 }
817 break;
818 case RAILWY:
819 Renderer.lineVector(new LineStyle(Color.gray, 10));
820 Renderer.lineVector(new LineStyle(Color.black, 10, new float[] { 30, 30 }));
821 break;
822 default:
823 }
824 }
825
826 @SuppressWarnings("unchecked")
827 private static void landmarks() {
828 if (testAttribute(Obj.LNDMRK, Att.CATLMK, CatLMK.LMK_UNKN)
829 && (testAttribute(Obj.LNDMRK, Att.CATLMK, FncFNC.FNC_UNKN) || testAttribute(Obj.LNDMRK, Att.CATLMK, FncFNC.FNC_LGHT))
830 && hasObject(Obj.LIGHTS))
831 lights();
832 if (Renderer.zoom >= 12) {
833 switch (feature.type) {
834 case LNDMRK:
835 ArrayList<CatLMK> cats = (ArrayList<CatLMK>) getAttList(feature.type, Att.CATLMK);
836 Symbol catSym = Landmarks.Shapes.get(cats.get(0));
837 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) getAttList(feature.type, Att.FUNCTN);
838 Symbol fncSym = Landmarks.Funcs.get(fncs.get(0));
839 if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR))
840 catSym = Landmarks.ChurchTower;
841 if (cats.get(0) == CatLMK.LMK_RADR)
842 fncSym = Landmarks.RadioTV;
843 Renderer.symbol(catSym);
844 Renderer.symbol(fncSym);
845 break;
846 case SILTNK:
847 if (testAttribute(feature.type, Att.CATSIL, CatSIL.SIL_WTRT))
848 Renderer.symbol(Landmarks.WaterTower);
849 break;
850 default:
851 break;
852 }
853 if (Renderer.zoom >= 15)
854 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
855 Signals.addSignals();
856 }
857 }
858
859 @SuppressWarnings("unchecked")
860 private static void lights() {
861 boolean ok = false;
862 switch (feature.type) {
863 case LITMAJ:
864 case LNDMRK:
865 Renderer.symbol(Beacons.LightMajor);
866 ok = true;
867 break;
868 case LITMIN:
869 case LIGHTS:
870 if (Renderer.zoom >= 14) {
871 Renderer.symbol(Beacons.LightMinor);
872 ok = true;
873 }
874 break;
875 case PILPNT:
876 if (Renderer.zoom >= 14) {
877 if (feature.objs.containsKey(Obj.LIGHTS))
878 Renderer.symbol(Beacons.LightMinor);
879 else
880 Renderer.symbol(Harbours.Post);
881 ok = true;
882 }
883 break;
884 default:
885 break;
886 }
887 if (ok) {
888 if (feature.objs.containsKey(Obj.TOPMAR)) {
889 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
890 if (topmap.containsKey(Att.TOPSHP)) {
891 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), Topmarks.LightDelta);
892 }
893 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
894 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
895 if (topmap.containsKey(Att.TOPSHP)) {
896 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), Topmarks.LightDelta);
897 }
898 }
899 Signals.addSignals();
900 }
901 }
902
903 @SuppressWarnings("unchecked")
904 private static void marinas() {
905 if (Renderer.zoom >= 16) {
906 ArrayList<Symbol> symbols = new ArrayList<Symbol>();
907 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttList(Obj.SMCFAC, Att.CATSCF);
908 for (CatSCF scf : scfs) {
909 symbols.add(Facilities.Cats.get(scf));
910 }
911 Renderer.cluster(symbols);
912 }
913 }
914
915 private static void moorings() {
916 if (Renderer.zoom >= 14) {
917 switch ((CatMOR) getAttEnum(feature.type, Att.CATMOR)) {
918 case MOR_DLPN:
919 Renderer.symbol(Harbours.Dolphin);
920 break;
921 case MOR_DDPN:
922 Renderer.symbol(Harbours.DeviationDolphin);
923 break;
924 case MOR_BLRD:
925 case MOR_POST:
926 Renderer.symbol(Harbours.Bollard);
927 break;
928 case MOR_BUOY:
929 BoySHP shape = (BoySHP) getAttEnum(feature.type, Att.BOYSHP);
930 if (shape == BoySHP.BOY_UNKN) {
931 shape = BoySHP.BOY_SPHR;
932 }
933 Renderer.symbol(Buoys.Shapes.get(shape), getScheme(feature.type));
934 Renderer.symbol(Topmarks.TopMooring, Topmarks.BuoyDeltas.get(shape));
935 break;
936 default:
937 break;
938 }
939 Signals.addSignals();
940 }
941 }
942
943 private static void notices() {
944 if (Renderer.zoom >= 14) {
945 double dx = 0.0, dy = 0.0;
946 switch (feature.type) {
947 case BCNCAR:
948 case BCNISD:
949 case BCNLAT:
950 case BCNSAW:
951 case BCNSPP:
952 dy = 45.0;
953 break;
954 case NOTMRK:
955 dy = 0.0;
956 break;
957 default:
958 return;
959 }
960 MarSYS sys = MarSYS.SYS_CEVN;
961// BnkWTW bnk = BnkWTW.BWW_UNKN;
962 AttVal<?> att = feature.atts.get(Att.MARSYS);
963 if (att != null) sys = (MarSYS)att.val;
964 ObjTab objs = feature.objs.get(Obj.NOTMRK);
965 int n = objs.size();
966 if (n > 5) {
967 Renderer.symbol(Notices.Notice, new Delta(Handle.CC, AffineTransform.getTranslateInstance(dx, dy)));
968 } else {
969 int i = 0;
970 for (AttMap atts : objs.values()) {
971 if (atts.get(Att.MARSYS) != null) sys = (MarSYS)(atts.get(Att.MARSYS).val);
972 CatNMK cat = CatNMK.NMK_UNKN;
973 if (atts.get(Att.CATNMK) != null) cat = (CatNMK)(atts.get(Att.CATNMK).val);
974 Symbol sym = Notices.getNotice(cat, sys);
975 Handle h = Handle.CC;
976 switch (i) {
977 case 0:
978 if (n != 1) h = null;
979 break;
980 case 1:
981 if (n <= 3)
982 h = Handle.RC;
983 else
984 h = Handle.BR;
985 break;
986 case 2:
987 if (n <= 3)
988 h = Handle.LC;
989 else
990 h = Handle.BL;
991 break;
992 case 3:
993 if (n == 4)
994 h = Handle.TC;
995 else
996 h = Handle.TR;
997 break;
998 case 4:
999 h = Handle.TL;
1000 break;
1001 }
1002 if (h != null) Renderer.symbol(sym, new Delta(h, AffineTransform.getTranslateInstance(dx, dy)));
1003 i++;
1004 }
1005 }
1006 }
1007 }
1008
1009 private static void obstructions() {
1010 if ((Renderer.zoom >= 12) && (feature.type == Obj.OBSTRN)) {
1011 switch ((CatOBS) getAttEnum(feature.type, Att.CATOBS)) {
1012 case OBS_BOOM:
1013 Renderer.lineVector(new LineStyle(Color.black, 5, new float[] { 20, 20 }, null));
1014 if (Renderer.zoom >= 15) {
1015 Renderer.lineText("Boom", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
1016 }
1017 default:
1018 break;
1019 }
1020 }
1021 if ((Renderer.zoom >= 14) && (feature.type == Obj.UWTROC)) {
1022 switch ((WatLEV) getAttEnum(feature.type, Att.WATLEV)) {
1023 case LEV_CVRS:
1024 Renderer.symbol(Areas.RockC);
1025 break;
1026 case LEV_AWSH:
1027 Renderer.symbol(Areas.RockA);
1028 break;
1029 default:
1030 Renderer.symbol(Areas.Rock);
1031 }
1032 } else {
1033 Renderer.symbol(Areas.Rock);
1034 }
1035 }
1036
1037 private static void pipelines() {
1038 if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
1039 if (feature.type == Obj.PIPSOL) {
1040 Renderer.lineSymbols(Areas.Pipeline, 1.0, null, null, 0, Symbols.Mline);
1041 } else if (feature.type == Obj.PIPOHD) {
1042 Renderer.lineVector(new LineStyle(Color.black, 8));
1043 AttMap atts = feature.atts;
1044 double verclr = 0;
1045 if (atts != null) {
1046 if (atts.containsKey(Att.VERCLR)) {
1047 verclr = (Double) atts.get(Att.VERCLR).val;
1048 } else {
1049 verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
1050 }
1051 if (verclr > 0) {
1052 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)));
1053 }
1054 }
1055 }
1056 }
1057 }
1058
1059 @SuppressWarnings("unchecked")
1060 private static void platforms() {
1061 ArrayList<CatOFP> cats = (ArrayList<CatOFP>) getAttList(Obj.OFSPLF, Att.CATOFP);
1062 if ((CatOFP) cats.get(0) == CatOFP.OFP_FPSO)
1063 Renderer.symbol(Buoys.Storage);
1064 else
1065 Renderer.symbol(Landmarks.Platform);
1066 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
1067 Signals.addSignals();
1068 }
1069
1070 private static void ports() {
1071 if (Renderer.zoom >= 14) {
1072 if (feature.type == Obj.CRANES) {
1073 if ((CatCRN) getAttEnum(feature.type, Att.CATCRN) == CatCRN.CRN_CONT)
1074 Renderer.symbol(Harbours.ContainerCrane);
1075 else
1076 Renderer.symbol(Harbours.PortCrane);
1077 } else if (feature.type == Obj.HULKES) {
1078 Renderer.lineVector(new LineStyle(Color.black, 4, null, new Color(0xffe000)));
1079 addName(15, new Font("Arial", Font.BOLD, 40));
1080 }
1081 }
1082 }
1083
1084 private static void separation() {
1085 switch (feature.type) {
1086 case TSEZNE:
1087 case TSSCRS:
1088 case TSSRON:
1089 if (Renderer.zoom <= 15)
1090 Renderer.lineVector(new LineStyle(Symbols.Mtss));
1091 else
1092 Renderer.lineVector(new LineStyle(Symbols.Mtss, 20, null, null));
1093 addName(10, new Font("Arial", Font.BOLD, 150), Symbols.Mline);
1094 break;
1095 case TSELNE:
1096 Renderer.lineVector(new LineStyle(Symbols.Mtss, 20, null, null));
1097 break;
1098 case TSSLPT:
1099 Renderer.lineSymbols(Areas.LaneArrow, 0.5, null, null, 0, Symbols.Mtss);
1100 break;
1101 case TSSBND:
1102 Renderer.lineVector(new LineStyle(Symbols.Mtss, 20, new float[] { 40, 40 }, null));
1103 break;
1104 case ISTZNE:
1105 Renderer.lineSymbols(Areas.Restricted, 1.0, null, null, 0, Symbols.Mtss);
1106 break;
1107 default:
1108 break;
1109 }
1110 }
1111
1112 @SuppressWarnings("unchecked")
1113 private static void shoreline() {
1114 CatSLC cat = (CatSLC) getAttEnum(feature.type, Att.CATSLC);
1115 if ((Renderer.context.ruleset() == RuleSet.ALL) || (Renderer.context.ruleset() == RuleSet.BASE)) {
1116 if ((cat != CatSLC.SLC_SWAY) && (cat != CatSLC.SLC_TWAL)) {
1117 if (Renderer.zoom >= 12) {
1118 Renderer.lineVector(new LineStyle(Color.black, 10, Symbols.Yland));
1119 } else {
1120 Renderer.lineVector(new LineStyle(Symbols.Yland));
1121 }
1122 }
1123 }
1124 if ((Renderer.context.ruleset() == RuleSet.ALL) || (Renderer.context.ruleset() == RuleSet.SEAMARK)) {
1125 if (Renderer.zoom >= 12) {
1126 switch (cat) {
1127 case SLC_TWAL:
1128 WatLEV lev = (WatLEV) getAttEnum(feature.type, Att.WATLEV);
1129 if (lev == WatLEV.LEV_CVRS) {
1130 Renderer.lineVector(new LineStyle(Color.black, 10, new float[] { 40, 40 }, null));
1131 if (Renderer.zoom >= 15)
1132 Renderer.lineText("(covers)", new Font("Arial", Font.PLAIN, 60), Color.black, 0.5, 80);
1133 } else {
1134 Renderer.lineVector(new LineStyle(Color.black, 10, null, null));
1135 }
1136 if (Renderer.zoom >= 15)
1137 Renderer.lineText("Training Wall", new Font("Arial", Font.PLAIN, 60), Color.black, 0.5, -30);
1138 break;
1139 case SLC_SWAY:
1140 Renderer.lineVector(new LineStyle(Color.black, 2, null, new Color(0xffe000)));
1141 if ((Renderer.zoom >= 16) && feature.objs.containsKey(Obj.SMCFAC)) {
1142 ArrayList<Symbol> symbols = new ArrayList<Symbol>();
1143 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttList(Obj.SMCFAC, Att.CATSCF);
1144 for (CatSCF scf : scfs) {
1145 symbols.add(Facilities.Cats.get(scf));
1146 }
1147 Renderer.cluster(symbols);
1148 }
1149 break;
1150 default:
1151 break;
1152 }
1153 }
1154 }
1155 }
1156
1157 @SuppressWarnings("unchecked")
1158 private static void stations() {
1159 if (Renderer.zoom >= 14) {
1160 String str = "";
1161 switch (feature.type) {
1162 case SISTAT:
1163 Renderer.symbol(Harbours.SignalStation);
1164 str = "SS";
1165 ArrayList<CatSIT> tcats = (ArrayList<CatSIT>) getAttList(Obj.SISTAT, Att.CATSIT);
1166 switch (tcats.get(0)) {
1167 case SIT_IPT:
1168 str += "(INT)";
1169 break;
1170 case SIT_PRTE:
1171 str += "(Traffic)";
1172 break;
1173 case SIT_PRTC:
1174 str += "(Port Control)";
1175 break;
1176 case SIT_LOCK:
1177 str += "(Lock)";
1178 break;
1179 case SIT_BRDG:
1180 str += "(Bridge)";
1181 break;
1182 default:
1183 break;
1184 }
1185 break;
1186 case SISTAW:
1187 Renderer.symbol(Harbours.SignalStation);
1188 str = "SS";
1189 str = "SS";
1190 ArrayList<CatSIW> wcats = (ArrayList<CatSIW>) getAttList(Obj.SISTAW, Att.CATSIW);
1191 switch (wcats.get(0)) {
1192 case SIW_STRM:
1193 str += "(Storm)";
1194 break;
1195 case SIW_WTHR:
1196 str += "(Weather)";
1197 break;
1198 case SIW_ICE:
1199 str += "(Ice)";
1200 break;
1201 case SIW_TIDG:
1202 str = "Tide gauge";
1203 break;
1204 case SIW_TIDS:
1205 str = "Tide scale";
1206 break;
1207 case SIW_TIDE:
1208 str += "(Tide)";
1209 break;
1210 case SIW_TSTR:
1211 str += "(Stream)";
1212 break;
1213 case SIW_DNGR:
1214 str += "(Danger)";
1215 break;
1216 case SIW_MILY:
1217 str += "(Firing)";
1218 break;
1219 case SIW_TIME:
1220 str += "(Time)";
1221 break;
1222 default:
1223 break;
1224 }
1225 break;
1226 case RDOSTA:
1227 case RTPBCN:
1228 Renderer.symbol(Harbours.SignalStation);
1229 Renderer.symbol(Beacons.RadarStation);
1230 break;
1231 case RADRFL:
1232 Renderer.symbol(Topmarks.RadarReflector);
1233 break;
1234 case RADSTA:
1235 Renderer.symbol(Harbours.SignalStation);
1236 Renderer.symbol(Beacons.RadarStation);
1237 Renderer.labelText("Ra", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-30, -70)));
1238 break;
1239 case PILBOP:
1240 Renderer.symbol(Harbours.Pilot);
1241 addName(15, new Font("Arial", Font.BOLD, 40), Symbols.Msymb , new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, -40)));
1242 CatPIL cat = (CatPIL) getAttEnum(feature.type, Att.CATPIL);
1243 if (cat == CatPIL.PIL_HELI) {
1244 Renderer.labelText("H", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
1245 }
1246 break;
1247 case CGUSTA:
1248 Renderer.symbol(Harbours.SignalStation);
1249 str = "CG";
1250 if (feature.objs.containsKey(Obj.RSCSTA)) Renderer.symbol(Harbours.Rescue, new Delta(Handle.CC, AffineTransform.getTranslateInstance(130, 0)));
1251 break;
1252 case RSCSTA:
1253 Renderer.symbol(Harbours.Rescue);
1254 break;
1255 default:
1256 break;
1257 }
1258 if ((Renderer.zoom >= 15) && !str.isEmpty()) {
1259 Renderer.labelText(str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.LC, AffineTransform.getTranslateInstance(40, 0)));
1260 }
1261 Signals.addSignals();
1262 }
1263 }
1264
1265 private static void transits() {
1266 if (Renderer.zoom >= 14) {
1267 if (feature.type == Obj.RECTRC) Renderer.lineVector (new LineStyle(Color.black, 10, null, null));
1268 else if (feature.type == Obj.NAVLNE) Renderer.lineVector (new LineStyle(Color.black, 10, new float[] { 25, 25 }, null));
1269 }
1270 if (Renderer.zoom >= 15) {
1271 String str = "";
1272 String name = getName();
1273 if (name != null)
1274 str += name + " ";
1275 Double ort;
1276 if ((ort = (Double) getAttVal(feature.type, Att.ORIENT)) != null) {
1277 str += df.format(ort) + "º";
1278 if (!str.isEmpty())
1279 Renderer.lineText(str, new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
1280 }
1281 }
1282 }
1283
1284 private static void waterways() {
1285 Renderer.lineVector(new LineStyle(Symbols.Bwater, 20, (feature.geom.prim == Pflag.AREA) ? Symbols.Bwater : null));
1286 }
1287
1288 private static void wrecks() {
1289 if (Renderer.zoom >= 14) {
1290 switch ((CatWRK) getAttEnum(feature.type, Att.CATWRK)) {
1291 case WRK_DNGR:
1292 case WRK_MSTS:
1293 Renderer.symbol(Areas.WreckD);
1294 break;
1295 case WRK_HULS:
1296 Renderer.symbol(Areas.WreckS);
1297 break;
1298 default:
1299 Renderer.symbol(Areas.WreckND);
1300 }
1301 }
1302 }
1303}
Note: See TracBrowser for help on using the repository browser.