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

Last change on this file since 32082 was 32082, checked in by malcolmh, 10 years ago

[seachart] update

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.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 Signals.addSignals(feature);
468 }
469 }
470
471 @SuppressWarnings("unchecked")
472 private static void buoys() {
473 if ((Renderer.zoom >= 14) || ((Renderer.zoom >= 12) && ((feature.type == Obj.BOYLAT) || (feature.type == Obj.BOYCAR)))) {
474 BoySHP shape = (BoySHP) getAttEnum(feature, feature.type, 0, Att.BOYSHP);
475 if (shape == BoySHP.BOY_UNKN) shape = BoySHP.BOY_PILR;
476 Renderer.symbol(feature, Buoys.Shapes.get(shape), getScheme(feature, feature.type));
477 if (feature.objs.containsKey(Obj.TOPMAR)) {
478 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
479 if (topmap.containsKey(Att.TOPSHP)) {
480 Renderer.symbol(feature, Topmarks.Shapes.get(((ArrayList<TopSHP>)(topmap.get(Att.TOPSHP).val)).get(0)), getScheme(feature, Obj.TOPMAR), Topmarks.BuoyDeltas.get(shape));
481 }
482 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
483 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
484 if (topmap.containsKey(Att.TOPSHP)) {
485 Renderer.symbol(feature, Topmarks.Shapes.get(((ArrayList<TopSHP>)(topmap.get(Att.TOPSHP).val)).get(0)), getScheme(feature, Obj.DAYMAR), Topmarks.BuoyDeltas.get(shape));
486 }
487 }
488 Signals.addSignals(feature);
489 }
490 }
491
492 private static void bridges() {
493 if (Renderer.zoom >= 16) {
494 double verclr, verccl, vercop, horclr;
495 AttMap atts = feature.objs.get(Obj.BRIDGE).get(0);
496 String vstr = "";
497 String hstr = "";
498 if (atts != null) {
499 if (atts.containsKey(Att.HORCLR)) {
500 horclr = (Double) atts.get(Att.HORCLR).val;
501 hstr = String.valueOf(horclr);
502 }
503 if (atts.containsKey(Att.VERCLR)) {
504 verclr = (Double) atts.get(Att.VERCLR).val;
505 } else {
506 verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
507 }
508 verccl = atts.containsKey(Att.VERCCL) ? (Double) atts.get(Att.VERCCL).val : 0;
509 vercop = atts.containsKey(Att.VERCOP) ? (Double) atts.get(Att.VERCOP).val : 0;
510 if (verclr > 0) {
511 vstr += String.valueOf(verclr);
512 } else if (verccl > 0) {
513 if (vercop == 0) {
514 vstr += String.valueOf(verccl) + "/-";
515 } else {
516 vstr += String.valueOf(verccl) + "/" + String.valueOf(vercop);
517 }
518 }
519 if (hstr.isEmpty() && !vstr.isEmpty()) {
520 Renderer.labelText(feature, vstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.CC));
521 } else 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.BC));
523 Renderer.labelText(feature, hstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.HCLR, Color.black, Color.white, new Delta(Handle.TC));
524 } else if (!hstr.isEmpty() && vstr.isEmpty()) {
525 Renderer.labelText(feature, hstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.HCLR, Color.black, Color.white, new Delta(Handle.CC));
526 }
527 }
528 }
529 }
530
531 private static void cables() {
532 if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
533 if (feature.type == Obj.CBLSUB) {
534 Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, null, 0, Symbols.Mline);
535 } else if (feature.type == Obj.CBLOHD) {
536 AttMap atts = feature.objs.get(Obj.CBLOHD).get(0);
537 if ((atts != null) && (atts.containsKey(Att.CATCBL)) && (atts.get(Att.CATCBL).val == CatCBL.CBL_POWR)) {
538 Renderer.lineSymbols(feature, Areas.CableDash, 0, Areas.CableDot, Areas.CableFlash, 2, Color.black);
539 } else {
540 Renderer.lineSymbols(feature, Areas.CableDash, 0, Areas.CableDot, null, 2, Color.black);
541 }
542 if (atts != null) {
543 if (atts.containsKey(Att.VERCLR)) {
544 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)));
545 } else if (atts.containsKey(Att.VERCSA)) {
546 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)));
547 }
548 }
549 }
550 }
551 }
552
553 private static void callpoint() {
554 if (Renderer.zoom >= 14) {
555 Symbol symb = Harbours.CallPoint2;
556 TrfTRF trf = (TrfTRF) getAttEnum(feature, feature.type, 0, Att.TRAFIC);
557 if (trf != TrfTRF.TRF_TWOW) {
558 symb = Harbours.CallPoint1;
559 }
560 Double orient = 0.0;
561 if ((orient = (Double) getAttVal(feature, feature.type, 0, Att.ORIENT)) == null) {
562 orient = 0.0;
563 }
564 Renderer.symbol(feature, symb, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(orient))));
565 String chn;
566 if (!(chn = getAttStr(feature, feature.type, 0, Att.COMCHA)).isEmpty()) {
567 Renderer.labelText(feature, ("Ch." + chn), new Font("Arial", Font.PLAIN, 50), Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0,50)));
568 }
569 }
570 }
571
572 private static void distances() {
573 if (Renderer.zoom >= 14) {
574 if (!testAttribute(feature, Obj.DISMAR, 0, Att.CATDIS, CatDIS.DIS_NONI)) {
575 Renderer.symbol(feature, Harbours.DistanceI);
576 } else {
577 Renderer.symbol(feature, Harbours.DistanceU);
578 }
579 if (Renderer.zoom >= 15) {
580 AttMap atts = getAtts(feature, Obj.DISMAR, 0);
581 if ((atts != null) && (atts.containsKey(Att.WTWDIS))) {
582 Double dist = (Double) atts.get(Att.WTWDIS).val;
583 String str = "";
584 if (atts.containsKey(Att.HUNITS)) {
585 switch ((UniHLU) atts.get(Att.HUNITS).val) {
586 case HLU_METR:
587 str += "m ";
588 break;
589 case HLU_FEET:
590 str += "ft ";
591 break;
592 case HLU_HMTR:
593 str += "hm ";
594 break;
595 case HLU_KMTR:
596 str += "km ";
597 break;
598 case HLU_SMIL:
599 str += "M ";
600 break;
601 case HLU_NMIL:
602 str += "NM ";
603 break;
604 default:
605 break;
606 }
607 }
608 str += String.format("%1.0f", dist);
609 Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 45)));
610 }
611 }
612 }
613 }
614
615 private static void floats() {
616 switch (feature.type) {
617 case LITVES:
618 Renderer.symbol(feature, Buoys.Super, getScheme(feature, feature.type));
619 break;
620 case LITFLT:
621 Renderer.symbol(feature, Buoys.Float, getScheme(feature, feature.type));
622 break;
623 case BOYINB:
624 Renderer.symbol(feature, Buoys.Super, getScheme(feature, feature.type));
625 break;
626 default:
627 break;
628 }
629 if (feature.objs.get(Obj.TOPMAR) != null)
630 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), getScheme(feature, Obj.TOPMAR), Topmarks.FloatDelta);
631 Signals.addSignals(feature);
632 }
633
634 private static void gauges() {
635 if (Renderer.zoom >= 14) {
636 Renderer.symbol(feature, Harbours.TideGauge);
637 Signals.addSignals(feature);
638 }
639 }
640
641 @SuppressWarnings("unchecked")
642 private static void harbours() {
643 String name = getName();
644 switch (feature.type) {
645 case ACHBRT:
646 if (Renderer.zoom >= 14) {
647 Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Symbols.Mline));
648 if (Renderer.zoom >= 15) {
649 Renderer.labelText(feature, name == null ? "" : name, new Font("Arial", Font.PLAIN, 30), Symbols.Msymb, LabelStyle.RRCT, Symbols.Mline, Color.white, new Delta(Handle.BC));
650 }
651 }
652 if (getAttVal(feature, Obj.ACHBRT, 0, Att.RADIUS) != null) {
653 double radius;
654 if ((radius = (Double) getAttVal(feature, Obj.ACHBRT, 0, Att.RADIUS)) != 0) {
655 UniHLU units = (UniHLU) getAttEnum(feature, Obj.ACHBRT, 0, Att.HUNITS);
656 if (units == UniHLU.HLU_UNKN) {
657 units = UniHLU.HLU_METR;
658 }
659 Renderer.lineCircle(feature, new LineStyle(Symbols.Mline, 4, new float[] { 10, 10 }, null), radius, units);
660 }
661 }
662 break;
663 case ACHARE:
664 if (Renderer.zoom >= 12) {
665 if (feature.geom.prim != Pflag.AREA) {
666 Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Color.black));
667 } else {
668 Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Symbols.Mline));
669 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Symbols.Mline);
670 }
671 addName(feature, 15, new Font("Arial", Font.BOLD, 60), Symbols.Mline, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
672 ArrayList<StsSTS> sts = (ArrayList<StsSTS>)getAttList(feature, Obj.ACHARE, 0, Att.STATUS);
673 if ((Renderer.zoom >= 15) && (sts.contains(StsSTS.STS_RESV))) {
674 Renderer.labelText(feature, "Reserved", new Font("Arial", Font.PLAIN, 50), Symbols.Mline, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60)));
675 }
676 }
677 ArrayList<CatACH> cats = (ArrayList<CatACH>) getAttList(feature, Obj.ACHARE, 0, Att.CATACH);
678 int dy = (cats.size() - 1) * -30;
679 for (CatACH cat : cats) {
680 switch (cat) {
681 case ACH_DEEP:
682 Renderer.labelText(feature, "DW", new Font("Arial", Font.BOLD, 50), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
683 dy += 60;
684 break;
685 case ACH_TANK:
686 Renderer.labelText(feature, "Tanker", new Font("Arial", Font.BOLD, 50), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
687 dy += 60;
688 break;
689 case ACH_H24P:
690 Renderer.labelText(feature, "24h", new Font("Arial", Font.BOLD, 50), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
691 dy += 60;
692 break;
693 case ACH_EXPL:
694 Renderer.symbol(feature, Harbours.Explosives, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
695 dy += 60;
696 break;
697 case ACH_QUAR:
698 Renderer.symbol(feature, Harbours.Hospital, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
699 dy += 60;
700 break;
701 case ACH_SEAP:
702 Renderer.symbol(feature, Areas.Seaplane, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
703 dy += 60;
704 break;
705 default:
706 }
707 }
708 break;
709 case BERTHS:
710 if (Renderer.zoom >= 14) {
711 Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 6, new float[] { 20, 20 }));
712 Renderer.labelText(feature, name == null ? " " : name, new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, LabelStyle.RRCT, Symbols.Mline, Color.white);
713 }
714 break;
715 case BUISGL:
716 if (Renderer.zoom >= 16) {
717 ArrayList<Symbol> symbols = new ArrayList<Symbol>();
718 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) getAttList(feature, Obj.BUISGL, 0, Att.FUNCTN);
719 for (FncFNC fnc : fncs) {
720 symbols.add(Landmarks.Funcs.get(fnc));
721 }
722 if (feature.objs.containsKey(Obj.SMCFAC)) {
723 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttList(feature, Obj.SMCFAC, 0, Att.CATSCF);
724 for (CatSCF scf : scfs) {
725 symbols.add(Facilities.Cats.get(scf));
726 }
727 }
728 Renderer.cluster(feature, symbols);
729 }
730 break;
731 case HRBFAC:
732 if (Renderer.zoom >= 12) {
733 ArrayList<CatHAF> cathaf = (ArrayList<CatHAF>) getAttList(feature, Obj.HRBFAC, 0, Att.CATHAF);
734 if (cathaf.size() == 1) {
735 switch (cathaf.get(0)) {
736 case HAF_MRNA:
737 Renderer.symbol(feature, Harbours.Marina);
738 break;
739 case HAF_MANF:
740 Renderer.symbol(feature, Harbours.MarinaNF);
741 break;
742 case HAF_FISH:
743 Renderer.symbol(feature, Harbours.Fishing);
744 break;
745 default:
746 Renderer.symbol(feature, Harbours.Harbour);
747 break;
748 }
749 } else {
750 Renderer.symbol(feature, Harbours.Harbour);
751 }
752 }
753 break;
754 default:
755 break;
756 }
757 }
758
759 @SuppressWarnings("unchecked")
760 private static void highways() {
761 switch (feature.type) {
762 case ROADWY:
763 ArrayList<CatROD> cat = (ArrayList<CatROD>) (getAttList(feature, Obj.ROADWY, 0, Att.CATROD));
764 if (cat.size() > 0) {
765 switch (cat.get(0)) {
766 case ROD_MWAY:
767 Renderer.lineVector(feature, new LineStyle(Color.black, 20));
768 break;
769 case ROD_MAJR:
770 Renderer.lineVector(feature, new LineStyle(Color.black, 15));
771 break;
772 case ROD_MINR:
773 Renderer.lineVector(feature, new LineStyle(Color.black, 10));
774 break;
775 default:
776 Renderer.lineVector(feature, new LineStyle(Color.black, 5));
777 }
778 } else {
779 Renderer.lineVector(feature, new LineStyle(Color.black, 5));
780 }
781 break;
782 case RAILWY:
783 Renderer.lineVector(feature, new LineStyle(Color.gray, 10));
784 Renderer.lineVector(feature, new LineStyle(Color.black, 10, new float[] { 30, 30 }));
785 break;
786 default:
787 }
788 }
789
790 @SuppressWarnings("unchecked")
791 private static void landmarks() {
792 ArrayList<CatLMK> cats = (ArrayList<CatLMK>) getAttList(feature, feature.type, 0, Att.CATLMK);
793 Symbol catSym = Landmarks.Shapes.get(cats.get(0));
794 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) getAttList(feature, feature.type, 0, Att.FUNCTN);
795 Symbol fncSym = Landmarks.Funcs.get(fncs.get(0));
796 if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR))
797 catSym = Landmarks.ChurchTower;
798 if ((cats.get(0) == CatLMK.LMK_UNKN) && (fncs.get(0) == FncFNC.FNC_UNKN) && (feature.objs.get(Obj.LIGHTS) != null))
799 catSym = Beacons.LightMajor;
800 if (cats.get(0) == CatLMK.LMK_RADR)
801 fncSym = Landmarks.RadioTV;
802 Renderer.symbol(feature, catSym);
803 Renderer.symbol(feature, fncSym);
804 addName(feature, 15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
805 Signals.addSignals(feature);
806 }
807
808 private static void lights() {
809 switch (feature.type) {
810 case LITMAJ:
811 Renderer.symbol(feature, Beacons.LightMajor);
812 break;
813 case LITMIN:
814 case LIGHTS:
815 Renderer.symbol(feature, Beacons.LightMinor);
816 break;
817 case PILPNT:
818 if (feature.objs.containsKey(Obj.LIGHTS))
819 Renderer.symbol(feature, Beacons.LightMinor);
820 else
821 Renderer.symbol(feature, Harbours.Post);
822 break;
823 default:
824 break;
825 }
826 if (feature.objs.containsKey(Obj.TOPMAR)) {
827 Symbol topmark = Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val);
828 if (topmark != null)
829 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), getScheme(feature, Obj.TOPMAR), Topmarks.LightDelta);
830 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
831 Symbol topmark = Topmarks.Shapes.get(feature.objs.get(Obj.DAYMAR).get(0).get(Att.TOPSHP).val);
832 if (topmark != null)
833 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.DAYMAR).get(0).get(Att.TOPSHP).val), getScheme(feature, Obj.DAYMAR), Topmarks.LightDelta);
834 }
835 Signals.addSignals(feature);
836 }
837
838 @SuppressWarnings("unchecked")
839 private static void marinas() {
840 if (Renderer.zoom >= 16) {
841 ArrayList<Symbol> symbols = new ArrayList<Symbol>();
842 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttList(feature, Obj.SMCFAC, 0, Att.CATSCF);
843 for (CatSCF scf : scfs) {
844 symbols.add(Facilities.Cats.get(scf));
845 }
846 Renderer.cluster(feature, symbols);
847 }
848 }
849
850 private static void moorings() {
851 switch ((CatMOR) getAttEnum(feature, feature.type, 0, Att.CATMOR)) {
852 case MOR_DLPN:
853 Renderer.symbol(feature, Harbours.Dolphin);
854 break;
855 case MOR_DDPN:
856 Renderer.symbol(feature, Harbours.DeviationDolphin);
857 break;
858 case MOR_BLRD:
859 case MOR_POST:
860 Renderer.symbol(feature, Harbours.Bollard);
861 break;
862 case MOR_BUOY:
863 BoySHP shape = (BoySHP) getAttEnum(feature, feature.type, 0, Att.BOYSHP);
864 if (shape == BoySHP.BOY_UNKN) {
865 shape = BoySHP.BOY_SPHR;
866 }
867 Renderer.symbol(feature, Buoys.Shapes.get(shape), getScheme(feature, feature.type));
868 Renderer.symbol(feature, Topmarks.TopMooring, Topmarks.BuoyDeltas.get(shape));
869 break;
870 default:
871 break;
872 }
873 Signals.addSignals(feature);
874 }
875
876 private static void notices() {
877 if (Renderer.zoom >= 14) {
878 double dx = 0.0, dy = 0.0;
879 switch (feature.type) {
880 case BCNCAR:
881 case BCNISD:
882 case BCNLAT:
883 case BCNSAW:
884 case BCNSPP:
885 dy = 45.0;
886 break;
887 case NOTMRK:
888 dy = 0.0;
889 break;
890 default:
891 return;
892 }
893 MarSYS sys = MarSYS.SYS_CEVN;
894// BnkWTW bnk = BnkWTW.BWW_UNKN;
895 AttVal<?> att = feature.atts.get(Att.MARSYS);
896 if (att != null) sys = (MarSYS)att.val;
897 ObjTab objs = feature.objs.get(Obj.NOTMRK);
898 int n = objs.size();
899 if (n > 5) {
900 Renderer.symbol(feature, Notices.Notice, new Delta(Handle.CC, AffineTransform.getTranslateInstance(dx, dy)));
901 } else {
902 int i = 0;
903 for (AttMap atts : objs.values()) {
904 if (atts.get(Att.MARSYS) != null) sys = (MarSYS)(atts.get(Att.MARSYS).val);
905 CatNMK cat = CatNMK.NMK_UNKN;
906 if (atts.get(Att.CATNMK) != null) cat = (CatNMK)(atts.get(Att.CATNMK).val);
907 Symbol sym = Notices.getNotice(cat, sys);
908 Handle h = Handle.CC;
909 switch (i) {
910 case 0:
911 if (n != 1) h = null;
912 break;
913 case 1:
914 if (n <= 3)
915 h = Handle.RC;
916 else
917 h = Handle.BR;
918 break;
919 case 2:
920 if (n <= 3)
921 h = Handle.LC;
922 else
923 h = Handle.BL;
924 break;
925 case 3:
926 if (n == 4)
927 h = Handle.TC;
928 else
929 h = Handle.TR;
930 break;
931 case 4:
932 h = Handle.TL;
933 break;
934 }
935 if (h != null) Renderer.symbol(feature, sym, new Delta(h, AffineTransform.getTranslateInstance(dx, dy)));
936 i++;
937 }
938 }
939 }
940 }
941
942 private static void obstructions() {
943 if ((Renderer.zoom >= 12) && (feature.type == Obj.OBSTRN)) {
944 switch ((CatOBS) getAttEnum(feature, feature.type, 0, Att.CATOBS)) {
945 case OBS_BOOM:
946 Renderer.lineVector(feature, new LineStyle(Color.black, 5, new float[] { 20, 20 }, null));
947 if (Renderer.zoom >= 15) {
948 Renderer.lineText(feature, "Boom", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
949 }
950 default:
951 break;
952 }
953 }
954 if ((Renderer.zoom >= 14) && (feature.type == Obj.UWTROC)) {
955 switch ((WatLEV) getAttEnum(feature, feature.type, 0, Att.WATLEV)) {
956 case LEV_CVRS:
957 Renderer.symbol(feature, Areas.RockC);
958 break;
959 case LEV_AWSH:
960 Renderer.symbol(feature, Areas.RockA);
961 break;
962 default:
963 Renderer.symbol(feature, Areas.Rock);
964 }
965 } else {
966 Renderer.symbol(feature, Areas.Rock);
967 }
968 }
969
970 private static void pipelines() {
971 if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
972 if (feature.type == Obj.PIPSOL) {
973 Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, null, 0, Symbols.Mline);
974 } else if (feature.type == Obj.PIPOHD) {
975 Renderer.lineVector(feature, new LineStyle(Color.black, 8));
976 AttMap atts = feature.atts;
977 double verclr = 0;
978 if (atts != null) {
979 if (atts.containsKey(Att.VERCLR)) {
980 verclr = (Double) atts.get(Att.VERCLR).val;
981 } else {
982 verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
983 }
984 if (verclr > 0) {
985 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)));
986 }
987 }
988 }
989 }
990 }
991
992 @SuppressWarnings("unchecked")
993 private static void platforms() {
994 ArrayList<CatOFP> cats = (ArrayList<CatOFP>) getAttList(feature, Obj.OFSPLF, 0, Att.CATOFP);
995 if ((CatOFP) cats.get(0) == CatOFP.OFP_FPSO)
996 Renderer.symbol(feature, Buoys.Storage);
997 else
998 Renderer.symbol(feature, Landmarks.Platform);
999 addName(feature, 15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
1000 Signals.addSignals(feature);
1001 }
1002
1003 private static void ports() {
1004 if (Renderer.zoom >= 14) {
1005 if (feature.type == Obj.CRANES) {
1006 if ((CatCRN) getAttEnum(feature, feature.type, 0, Att.CATCRN) == CatCRN.CRN_CONT)
1007 Renderer.symbol(feature, Harbours.ContainerCrane);
1008 else
1009 Renderer.symbol(feature, Harbours.PortCrane);
1010 } else if (feature.type == Obj.HULKES) {
1011 Renderer.lineVector(feature, new LineStyle(Color.black, 4, null, new Color(0xffe000)));
1012 addName(feature, 15, new Font("Arial", Font.BOLD, 80));
1013 }
1014 }
1015 }
1016
1017 private static void separation() {
1018 switch (feature.type) {
1019 case TSEZNE:
1020 case TSSCRS:
1021 case TSSRON:
1022 if (Renderer.zoom <= 15)
1023 Renderer.lineVector(feature, new LineStyle(Symbols.Mline));
1024 else
1025 Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 20, null, null));
1026 addName(feature, 10, new Font("Arial", Font.BOLD, 150), Symbols.Mline);
1027 break;
1028 case TSELNE:
1029 Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 20, null, null));
1030 break;
1031 case TSSLPT:
1032 Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, null, 0, Symbols.Mline);
1033 break;
1034 case TSSBND:
1035 Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 20, new float[] { 40, 40 }, null));
1036 break;
1037 case ISTZNE:
1038 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, Symbols.Mline);
1039 break;
1040 default:
1041 break;
1042 }
1043 }
1044
1045 @SuppressWarnings("unchecked")
1046 private static void shoreline() {
1047 CatSLC cat = (CatSLC) getAttEnum(feature, feature.type, 0, Att.CATSLC);
1048 if ((Renderer.context.ruleset() == RuleSet.ALL) || (Renderer.context.ruleset() == RuleSet.BASE)) {
1049 if ((cat != CatSLC.SLC_SWAY) && (cat != CatSLC.SLC_TWAL)) {
1050 if (Renderer.zoom >= 12) {
1051 Renderer.lineVector(feature, new LineStyle(Color.black, 10, Symbols.Yland));
1052 } else {
1053 Renderer.lineVector(feature, new LineStyle(Symbols.Yland));
1054 }
1055 }
1056 }
1057 if ((Renderer.context.ruleset() == RuleSet.ALL) || (Renderer.context.ruleset() == RuleSet.SEAMARK)) {
1058 if (Renderer.zoom >= 12) {
1059 switch (cat) {
1060 case SLC_TWAL:
1061 WatLEV lev = (WatLEV) getAttEnum(feature, feature.type, 0, Att.WATLEV);
1062 if (lev == WatLEV.LEV_CVRS) {
1063 Renderer.lineVector(feature, new LineStyle(Color.black, 10, new float[] { 40, 40 }, null));
1064 if (Renderer.zoom >= 15)
1065 Renderer.lineText(feature, "(covers)", new Font("Arial", Font.PLAIN, 60), Color.black, 0.5, 80);
1066 } else {
1067 Renderer.lineVector(feature, new LineStyle(Color.black, 10, null, null));
1068 }
1069 if (Renderer.zoom >= 15)
1070 Renderer.lineText(feature, "Training Wall", new Font("Arial", Font.PLAIN, 60), Color.black, 0.5, -30);
1071 break;
1072 case SLC_SWAY:
1073 Renderer.lineVector(feature, new LineStyle(Color.black, 2, null, new Color(0xffe000)));
1074 if ((Renderer.zoom >= 16) && feature.objs.containsKey(Obj.SMCFAC)) {
1075 ArrayList<Symbol> symbols = new ArrayList<Symbol>();
1076 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttList(feature, Obj.SMCFAC, 0, Att.CATSCF);
1077 for (CatSCF scf : scfs) {
1078 symbols.add(Facilities.Cats.get(scf));
1079 }
1080 Renderer.cluster(feature, symbols);
1081 }
1082 break;
1083 default:
1084 break;
1085 }
1086 }
1087 }
1088 }
1089
1090 @SuppressWarnings("unchecked")
1091 private static void stations() {
1092 if (Renderer.zoom >= 14) {
1093 String str = "";
1094 switch (feature.type) {
1095 case SISTAT:
1096 Renderer.symbol(feature, Harbours.SignalStation);
1097 str = "SS";
1098 ArrayList<CatSIT> tcats = (ArrayList<CatSIT>) getAttList(feature, Obj.SISTAT, 0, Att.CATSIT);
1099 switch (tcats.get(0)) {
1100 case SIT_IPT:
1101 str += "(INT)";
1102 break;
1103 case SIT_PRTE:
1104 str += "(Traffic)";
1105 break;
1106 case SIT_PRTC:
1107 str += "(Port Control)";
1108 break;
1109 case SIT_LOCK:
1110 str += "(Lock)";
1111 break;
1112 case SIT_BRDG:
1113 str += "(Bridge)";
1114 break;
1115 default:
1116 break;
1117 }
1118 break;
1119 case SISTAW:
1120 Renderer.symbol(feature, Harbours.SignalStation);
1121 str = "SS";
1122 str = "SS";
1123 ArrayList<CatSIW> wcats = (ArrayList<CatSIW>) getAttList(feature, Obj.SISTAW, 0, Att.CATSIW);
1124 switch (wcats.get(0)) {
1125 case SIW_STRM:
1126 str += "(Storm)";
1127 break;
1128 case SIW_WTHR:
1129 str += "(Weather)";
1130 break;
1131 case SIW_ICE:
1132 str += "(Ice)";
1133 break;
1134 case SIW_TIDG:
1135 str = "Tide gauge";
1136 break;
1137 case SIW_TIDS:
1138 str = "Tide scale";
1139 break;
1140 case SIW_TIDE:
1141 str += "(Tide)";
1142 break;
1143 case SIW_TSTR:
1144 str += "(Stream)";
1145 break;
1146 case SIW_DNGR:
1147 str += "(Danger)";
1148 break;
1149 case SIW_MILY:
1150 str += "(Firing)";
1151 break;
1152 case SIW_TIME:
1153 str += "(Time)";
1154 break;
1155 default:
1156 break;
1157 }
1158 break;
1159 case RDOSTA:
1160 case RTPBCN:
1161 Renderer.symbol(feature, Harbours.SignalStation);
1162 Renderer.symbol(feature, Beacons.RadarStation);
1163 break;
1164 case RADSTA:
1165 Renderer.symbol(feature, Harbours.SignalStation);
1166 Renderer.symbol(feature, Beacons.RadarStation);
1167 Renderer.labelText(feature, "Ra", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-30, -70)));
1168 break;
1169 case PILBOP:
1170 Renderer.symbol(feature, Harbours.Pilot);
1171 addName(feature, 15, new Font("Arial", Font.BOLD, 50), Symbols.Msymb , new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, -40)));
1172 CatPIL cat = (CatPIL) getAttEnum(feature, feature.type, 0, Att.CATPIL);
1173 if (cat == CatPIL.PIL_HELI) {
1174 Renderer.labelText(feature, "H", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
1175 }
1176 break;
1177 case CGUSTA:
1178 Renderer.symbol(feature, Harbours.SignalStation);
1179 str = "CG";
1180 if (feature.objs.containsKey(Obj.RSCSTA)) Renderer.symbol(feature, Harbours.Rescue, new Delta(Handle.CC, AffineTransform.getTranslateInstance(130, 0)));
1181 break;
1182 case RSCSTA:
1183 Renderer.symbol(feature, Harbours.Rescue);
1184 break;
1185 default:
1186 break;
1187 }
1188 if ((Renderer.zoom >= 15) && !str.isEmpty()) {
1189 Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.LC, AffineTransform.getTranslateInstance(40, 0)));
1190 }
1191 Signals.addSignals(feature);
1192 }
1193 }
1194
1195 private static void transits() {
1196 if (Renderer.zoom >= 14) {
1197 if (feature.type == Obj.RECTRC) Renderer.lineVector (feature, new LineStyle(Color.black, 10, null, null));
1198 else if (feature.type == Obj.NAVLNE) Renderer.lineVector (feature, new LineStyle(Color.black, 10, new float[] { 25, 25 }, null));
1199 }
1200 if (Renderer.zoom >= 15) {
1201 String str = "";
1202 String name = getName();
1203 if (name != null)
1204 str += name + " ";
1205 Double ort;
1206 if ((ort = (Double) getAttVal(feature, feature.type, 0, Att.ORIENT)) != null) {
1207 str += ort.toString() + "\u0152";
1208 if (!str.isEmpty())
1209 Renderer.lineText(feature, str, new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
1210 }
1211 }
1212 }
1213
1214 private static void waterways() {
1215 Renderer.lineVector(feature, new LineStyle(Symbols.Bwater, 20, (feature.geom.prim == Pflag.AREA) ? Symbols.Bwater : null));
1216 }
1217
1218 private static void wrecks() {
1219 if (Renderer.zoom >= 14) {
1220 switch ((CatWRK) getAttEnum(feature, feature.type, 0, Att.CATWRK)) {
1221 case WRK_DNGR:
1222 case WRK_MSTS:
1223 Renderer.symbol(feature, Areas.WreckD);
1224 break;
1225 case WRK_HULS:
1226 Renderer.symbol(feature, Areas.WreckS);
1227 break;
1228 default:
1229 Renderer.symbol(feature, Areas.WreckND);
1230 }
1231 }
1232 }
1233}
Note: See TracBrowser for help on using the repository browser.