source: osm/applications/editors/josm/plugins/smed2/src/render/Rules.java@ 30325

Last change on this file since 30325 was 30325, checked in by malcolmh, 12 years ago

save

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