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

Last change on this file since 30992 was 30992, checked in by malcolmh, 11 years ago

Rules debugs

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