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

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

[seachart] update

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