source: osm/applications/editors/josm/plugins/smed2/src/seamap/Rules.java@ 30037

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

save

File size: 36.3 KB
Line 
1/* Copyright 2013 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 seamap;
11
12import java.awt.Color;
13import java.awt.Font;
14import java.awt.geom.AffineTransform;
15import java.util.ArrayList;
16
17import s57.S57val.*;
18import s57.S57att.*;
19import s57.S57obj.*;
20import seamap.Renderer.*;
21import seamap.SeaMap.*;
22import symbols.*;
23import symbols.Symbols.*;
24
25public class Rules {
26
27 static SeaMap map;
28 static int zoom;
29
30 public static final Color Yland = new Color(0x50b0ff);
31 public static final Color Mline = new Color(0x80c480);
32 public static final Color Msymb = new Color(0xa30075);
33
34 public static void rules (SeaMap m, int z) {
35 map = m;
36 zoom = z;
37 ArrayList<Feature> objects;
38 if ((objects = map.features.get(Obj.SLCONS)) != null) for (Feature feature : objects) shoreline(feature);
39 if ((objects = map.features.get(Obj.PIPSOL)) != null) for (Feature feature : objects) pipelines(feature);
40 if ((objects = map.features.get(Obj.CBLSUB)) != null) for (Feature feature : objects) cables(feature);
41 if ((objects = map.features.get(Obj.PIPOHD)) != null) for (Feature feature : objects) pipelines(feature);
42 if ((objects = map.features.get(Obj.CBLOHD)) != null) for (Feature feature : objects) cables(feature);
43 if ((objects = map.features.get(Obj.TSEZNE)) != null) for (Feature feature : objects) separation(feature);
44 if ((objects = map.features.get(Obj.TSSCRS)) != null) for (Feature feature : objects) separation(feature);
45 if ((objects = map.features.get(Obj.TSSRON)) != null) for (Feature feature : objects) separation(feature);
46 if ((objects = map.features.get(Obj.TSELNE)) != null) for (Feature feature : objects) separation(feature);
47 if ((objects = map.features.get(Obj.TSSLPT)) != null) for (Feature feature : objects) separation(feature);
48 if ((objects = map.features.get(Obj.TSSBND)) != null) for (Feature feature : objects) separation(feature);
49 if ((objects = map.features.get(Obj.ISTZNE)) != null) for (Feature feature : objects) separation(feature);
50 if ((objects = map.features.get(Obj.SNDWAV)) != null) for (Feature feature : objects) areas(feature);
51 if ((objects = map.features.get(Obj.OSPARE)) != null) for (Feature feature : objects) areas(feature);
52 if ((objects = map.features.get(Obj.FAIRWY)) != null) for (Feature feature : objects) areas(feature);
53 if ((objects = map.features.get(Obj.DRGARE)) != null) for (Feature feature : objects) areas(feature);
54 if ((objects = map.features.get(Obj.RESARE)) != null) for (Feature feature : objects) areas(feature);
55 if ((objects = map.features.get(Obj.SPLARE)) != null) for (Feature feature : objects) areas(feature);
56 if ((objects = map.features.get(Obj.SEAARE)) != null) for (Feature feature : objects) areas(feature);
57 if ((objects = map.features.get(Obj.OBSTRN)) != null) for (Feature feature : objects) obstructions(feature);
58 if ((objects = map.features.get(Obj.UWTROC)) != null) for (Feature feature : objects) obstructions(feature);
59 if ((objects = map.features.get(Obj.MARCUL)) != null) for (Feature feature : objects) areas(feature);
60 if ((objects = map.features.get(Obj.WTWAXS)) != null) for (Feature feature : objects) waterways(feature);
61 if ((objects = map.features.get(Obj.RECTRC)) != null) for (Feature feature : objects) transits(feature);
62 if ((objects = map.features.get(Obj.NAVLNE)) != null) for (Feature feature : objects) transits(feature);
63 if ((objects = map.features.get(Obj.HRBFAC)) != null) for (Feature feature : objects) harbours(feature);
64 if ((objects = map.features.get(Obj.ACHARE)) != null) for (Feature feature : objects) harbours(feature);
65 if ((objects = map.features.get(Obj.ACHBRT)) != null) for (Feature feature : objects) harbours(feature);
66 if ((objects = map.features.get(Obj.BERTHS)) != null) for (Feature feature : objects) harbours(feature);
67 if ((objects = map.features.get(Obj.LOKBSN)) != null) for (Feature feature : objects) locks(feature);
68 if ((objects = map.features.get(Obj.LKBSPT)) != null) for (Feature feature : objects) locks(feature);
69 if ((objects = map.features.get(Obj.GATCON)) != null) for (Feature feature : objects) locks(feature);
70 if ((objects = map.features.get(Obj.DISMAR)) != null) for (Feature feature : objects) distances(feature);
71 if ((objects = map.features.get(Obj.HULKES)) != null) for (Feature feature : objects) ports(feature);
72 if ((objects = map.features.get(Obj.CRANES)) != null) for (Feature feature : objects) ports(feature);
73 if ((objects = map.features.get(Obj.LNDMRK)) != null) for (Feature feature : objects) landmarks(feature);
74 if ((objects = map.features.get(Obj.BUISGL)) != null) for (Feature feature : objects) harbours(feature);
75 if ((objects = map.features.get(Obj.MORFAC)) != null) for (Feature feature : objects) moorings(feature);
76 if ((objects = map.features.get(Obj.NOTMRK)) != null) for (Feature feature : objects) notices(feature);
77 if ((objects = map.features.get(Obj.SMCFAC)) != null) for (Feature feature : objects) marinas(feature);
78 if ((objects = map.features.get(Obj.BRIDGE)) != null) for (Feature feature : objects) bridges(feature);
79 if ((objects = map.features.get(Obj.LITMAJ)) != null) for (Feature feature : objects) lights(feature);
80 if ((objects = map.features.get(Obj.LITMIN)) != null) for (Feature feature : objects) lights(feature);
81 if ((objects = map.features.get(Obj.LIGHTS)) != null) for (Feature feature : objects) lights(feature);
82 if ((objects = map.features.get(Obj.SISTAT)) != null) for (Feature feature : objects) stations(feature);
83 if ((objects = map.features.get(Obj.SISTAW)) != null) for (Feature feature : objects) stations(feature);
84 if ((objects = map.features.get(Obj.CGUSTA)) != null) for (Feature feature : objects) stations(feature);
85 if ((objects = map.features.get(Obj.RDOSTA)) != null) for (Feature feature : objects) stations(feature);
86 if ((objects = map.features.get(Obj.RADSTA)) != null) for (Feature feature : objects) stations(feature);
87 if ((objects = map.features.get(Obj.RSCSTA)) != null) for (Feature feature : objects) stations(feature);
88 if ((objects = map.features.get(Obj.PILBOP)) != null) for (Feature feature : objects) stations(feature);
89 if ((objects = map.features.get(Obj.WTWGAG)) != null) for (Feature feature : objects) gauges(feature);
90 if ((objects = map.features.get(Obj.OFSPLF)) != null) for (Feature feature : objects) platforms(feature);
91 if ((objects = map.features.get(Obj.WRECKS)) != null) for (Feature feature : objects) wrecks(feature);
92 if ((objects = map.features.get(Obj.LITVES)) != null) for (Feature feature : objects) floats(feature);
93 if ((objects = map.features.get(Obj.LITFLT)) != null) for (Feature feature : objects) floats(feature);
94 if ((objects = map.features.get(Obj.BOYINB)) != null) for (Feature feature : objects) floats(feature);
95 if ((objects = map.features.get(Obj.BOYLAT)) != null) for (Feature feature : objects) buoys(feature);
96 if ((objects = map.features.get(Obj.BOYCAR)) != null) for (Feature feature : objects) buoys(feature);
97 if ((objects = map.features.get(Obj.BOYISD)) != null) for (Feature feature : objects) buoys(feature);
98 if ((objects = map.features.get(Obj.BOYSAW)) != null) for (Feature feature : objects) buoys(feature);
99 if ((objects = map.features.get(Obj.BOYSPP)) != null) for (Feature feature : objects) buoys(feature);
100 if ((objects = map.features.get(Obj.BOYWTW)) != null) for (Feature feature : objects) buoys(feature);
101 if ((objects = map.features.get(Obj.BCNLAT)) != null) for (Feature feature : objects) beacons(feature);
102 if ((objects = map.features.get(Obj.BCNCAR)) != null) for (Feature feature : objects) beacons(feature);
103 if ((objects = map.features.get(Obj.BCNISD)) != null) for (Feature feature : objects) beacons(feature);
104 if ((objects = map.features.get(Obj.BCNSAW)) != null) for (Feature feature : objects) beacons(feature);
105 if ((objects = map.features.get(Obj.BCNSPP)) != null) for (Feature feature : objects) beacons(feature);
106 if ((objects = map.features.get(Obj.BCNWTW)) != null) for (Feature feature : objects) beacons(feature);
107 }
108
109 private static void areas(Feature feature) {
110 String name = Util.getName(feature);
111 switch (feature.type) {
112 case DRGARE:
113 if (zoom < 16)
114 Renderer.lineVector(feature, new LineStyle(Color.black, 8, new float[] { 25, 25 }, new Color(0x40ffffff, true)));
115 else
116 Renderer.lineVector(feature, new LineStyle(Color.black, 8, new float[] { 25, 25 }));
117 if ((zoom >= 12) && (name != null))
118 Renderer.labelText(feature, name, new Font("Arial", Font.PLAIN, 100), LabelStyle.NONE, Color.black);
119 break;
120 case FAIRWY:
121 if (feature.area > 2.0) {
122 if (zoom < 16)
123 Renderer.lineVector(feature, new LineStyle(Mline, 8, new float[] { 50, 50 }, new Color(0x40ffffff, true)));
124 else
125 Renderer.lineVector(feature, new LineStyle(Mline, 8, new float[] { 50, 50 }));
126 } else {
127 if (zoom >= 14)
128 Renderer.lineVector(feature, new LineStyle(null, 0, new Color(0x40ffffff, true)));
129 }
130 break;
131 case MARCUL:
132 if (zoom >= 14)
133 Renderer.symbol(feature, Areas.MarineFarm);
134 if (zoom >= 16)
135 Renderer.lineVector(feature, new LineStyle(Color.black, 4, new float[] { 10, 10 }));
136 break;
137 case OSPARE:
138 if (Util.testAttribute(feature, feature.type, Att.CATPRA, CatPRA.PRA_WFRM)) {
139 Renderer.symbol(feature, Areas.WindFarm);
140 Renderer.lineVector(feature, new LineStyle(Color.black, 20, new float[] { 40, 40 }));
141 if ((zoom >= 15) && (name != null))
142 Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
143 }
144 break;
145 case RESARE:
146 if (zoom >= 12) {
147 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, Mline);
148 if (Util.testAttribute(feature, feature.type, Att.CATPRA, CatREA.REA_NWAK)) {
149 Renderer.symbol(feature, Areas.NoWake);
150 }
151 }
152 break;
153 case SEAARE:
154 switch ((CatSEA) Util.getAttVal(feature, feature.type, 0, Att.CATSEA)) {
155 case SEA_RECH:
156 break;
157 case SEA_BAY:
158 break;
159 case SEA_SHOL:
160 break;
161 case SEA_GAT:
162 case SEA_NRRW:
163 break;
164 default:
165 break;
166 }
167 break;
168/*
169 if (is_type("sea_area")) {
170 if (has_attribute("category")) {
171 make_string("");
172 attribute_switch("category")
173 attribute_case("reach") { if (zoom >= 10) add_string("font-family:Arial;font-weight:normal;font-style:italic;font-size:150;text-anchor:middle") }
174 attribute_case("bay") { if (zoom >= 12) add_string("font-family:Arial;font-weight:normal;font-style:italic;font-size:150;text-anchor:middle") }
175 attribute_case("shoal") { if (zoom >= 14) {
176 if (is_area) {
177 area("stroke:#c480ff;stroke-width:4;stroke-dasharray:25,25;fill:none");
178 if (has_item_attribute("name")) text(item_attribute("name"), "font-family:Arial;font-weight:normal;font-style:italic;font-size:75;text-anchor:middle", 0, -40);
179 text("(Shoal)", "font-family:Arial;font-weight:normal;font-size:60;text-anchor:middle", 0, 0);
180 } else if (is_line) {
181 if (has_item_attribute("name")) way_text(item_attribute("name"), "font-family:Arial;font-weight:normal;font-style:italic;font-size:75;text-anchor:middle", 0.5, -40, line("stroke:none;fill:none"));
182 way_text("(Shoal)", "font-family:Arial;font-weight:normal;font-size:60;text-anchor:middle", 0.5, 0, line("stroke:none;fill:none"));
183 } else {
184 if (has_item_attribute("name")) text(item_attribute("name"), "font-family:Arial;font-weight:normal;font-style:italic;font-size:75;text-anchor:middle", 0, -40);
185 text("(Shoal)", "font-family:Arial;font-weight:normal;font-size:60;text-anchor:middle", 0, 0);
186 }
187 }
188 }
189 attribute_case("gat|narrows") { if (zoom >= 12) add_string("font-family:Arial;font-weight:normal;font-style:italic;font-size:100;text-anchor:middle") }
190 end_switch
191 if ((strlen(string) > 0) && !attribute_test("category", "shoal")) {
192 int ref = line("stroke:none;fill:none");
193 if (ref != 0) {
194 if (has_item_attribute("name")) way_text(item_attribute("name"), string, 0.5, 0, ref);
195 } else {
196 if (has_item_attribute("name")) text(item_attribute("name"), string, 0, 0);
197 }
198 }
199 free_string
200 }
201 }
202 */
203 case SNDWAV:
204 if (zoom >= 12) Renderer.fillPattern(feature, Areas.Sandwaves);
205 break;
206 case SPLARE:
207 if (zoom >= 12) {
208 Renderer.symbol(feature, Areas.Plane);
209 Renderer.lineSymbols(feature, Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Mline);
210 }
211 if ((zoom >= 15) && (name != null))
212 Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
213 break;
214 default:
215 break;
216 }
217 }
218
219 private static void beacons(Feature feature) {
220 BcnSHP shape = (BcnSHP) Util.getAttVal(feature, feature.type, 0, Att.BCNSHP);
221 if (((shape == BcnSHP.BCN_PRCH) || (shape == BcnSHP.BCN_WTHY)) && (feature.type == Obj.BCNLAT)) {
222 CatLAM cat = (CatLAM) Util.getAttVal(feature, feature.type, 0, Att.CATLAM);
223 switch (cat) {
224 case LAM_PORT:
225 if (shape == BcnSHP.BCN_PRCH)
226 Renderer.symbol(feature, Beacons.PerchPort);
227 else
228 Renderer.symbol(feature, Beacons.WithyPort);
229 break;
230 case LAM_STBD:
231 if (shape == BcnSHP.BCN_PRCH)
232 Renderer.symbol(feature, Beacons.PerchStarboard);
233 else
234 Renderer.symbol(feature, Beacons.WithyStarboard);
235 break;
236 default:
237 Renderer.symbol(feature, Beacons.Stake, Util.getScheme(feature, feature.type));
238 }
239 } else {
240 Renderer.symbol(feature, Beacons.Shapes.get(shape), Util.getScheme(feature, feature.type));
241 if (feature.objs.get(Obj.TOPMAR) != null)
242 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Util.getScheme(feature, Obj.TOPMAR), Topmarks.BeaconDelta);
243 }
244 Signals.addSignals(feature);
245 }
246
247 private static void buoys(Feature feature) {
248 BoySHP shape = (BoySHP) Util.getAttVal(feature, feature.type, 0, Att.BOYSHP);
249 Renderer.symbol(feature, Buoys.Shapes.get(shape), Util.getScheme(feature, feature.type));
250 if (Util.hasObject(feature, Obj.TOPMAR)) {
251 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Util.getScheme(feature, Obj.TOPMAR), Topmarks.BuoyDeltas.get(shape));
252 }
253 Signals.addSignals(feature);
254 }
255
256 private static void bridges(Feature feature) {
257 if (zoom >= 16) {
258 double verclr, verccl, vercop;
259 AttMap atts = feature.objs.get(Obj.BRIDGE).get(0);
260 String str = "";
261 if (atts != null) {
262 if (atts.containsKey(Att.VERCLR)) {
263 verclr = (Double) atts.get(Att.VERCLR).val;
264 } else {
265 verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
266 }
267 verccl = atts.containsKey(Att.VERCCL) ? (Double) atts.get(Att.VERCCL).val : 0;
268 vercop = atts.containsKey(Att.VERCOP) ? (Double) atts.get(Att.VERCOP).val : 0;
269 if (verclr > 0) {
270 str += String.valueOf(verclr);
271 } else if (verccl > 0) {
272 if (vercop == 0) {
273 str += String.valueOf(verccl) + "/-";
274 } else {
275 str += String.valueOf(verccl) + "/" + String.valueOf(vercop);
276 }
277 }
278 if (!str.isEmpty())
279 Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 30), LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.CC));
280 }
281 }
282 }
283
284 private static void cables(Feature feature) {
285 if ((zoom >= 16) && (feature.length < 2)) {
286 if (feature.type == Obj.CBLSUB) {
287 Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, null, 0, Mline);
288 } else if (feature.type == Obj.CBLOHD) {
289 AttMap atts = feature.objs.get(Obj.CBLOHD).get(0);
290 if ((atts != null) && (atts.containsKey(Att.CATCBL)) && (atts.get(Att.CATCBL).val == CatCBL.CBL_POWR)) {
291 Renderer.lineSymbols(feature, Areas.CableDash, 0, Areas.CableDot, Areas.CableFlash, 2, Color.black);
292 } else {
293 Renderer.lineSymbols(feature, Areas.CableDash, 0, Areas.CableDot, null, 2, Color.black);
294 }
295 }
296 }
297 }
298
299 private static void distances(Feature feature) {
300 if (zoom >= 14) {
301 if (!Util.testAttribute(feature, Obj.DISMAR, Att.CATDIS, CatDIS.DIS_NONI)) {
302 Renderer.symbol(feature, Harbours.DistanceI);
303 } else {
304 Renderer.symbol(feature, Harbours.DistanceU);
305 }
306 if ((zoom >=15) && Util.hasAttribute(feature, Obj.DISMAR, Att.WTWDIS)) {
307 AttMap atts = feature.objs.get(Obj.DISMAR).get(0);
308 Double dist = (Double) atts.get(Att.WTWDIS).val;
309 String str = "";
310 if (atts.containsKey(Att.HUNITS)) {
311 switch ((UniHLU) atts.get(Att.HUNITS).val) {
312 case HLU_METR:
313 str += "m ";
314 break;
315 case HLU_FEET:
316 str += "ft ";
317 break;
318 case HLU_HMTR:
319 str += "hm ";
320 break;
321 case HLU_KMTR:
322 str += "km ";
323 break;
324 case HLU_SMIL:
325 str += "M ";
326 break;
327 case HLU_NMIL:
328 str += "NM ";
329 break;
330 default:
331 break;
332 }
333 }
334 str += String.format("%1.0f", dist);
335 Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 45)));
336 }
337 }
338 }
339
340 private static void floats(Feature feature) {
341 switch (feature.type) {
342 case LITVES:
343 Renderer.symbol(feature, Buoys.Super, Util.getScheme(feature, feature.type));
344 break;
345 case LITFLT:
346 Renderer.symbol(feature, Buoys.Float, Util.getScheme(feature, feature.type));
347 break;
348 case BOYINB:
349 Renderer.symbol(feature, Buoys.Super, Util.getScheme(feature, feature.type));
350 break;
351 default:
352 break;
353 }
354 if (feature.objs.get(Obj.TOPMAR) != null)
355 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Util.getScheme(feature, Obj.TOPMAR), Topmarks.FloatDelta);
356 Signals.addSignals(feature);
357 }
358
359 private static void gauges(Feature feature) {
360/*object_rules(gauge) {
361 if (zoom >= 14) symbol("tide_gauge");
362}
363*/
364 Signals.addSignals(feature);
365 }
366
367 private static void harbours(Feature feature) {
368 String name = Util.getName(feature);
369 switch (feature.type) {
370 case ACHBRT:
371 if (zoom >= 14) {
372 Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Mline));
373 Renderer.labelText(feature, name == null ? "" : name, new Font("Arial", Font.PLAIN, 30), LabelStyle.RRCT, Mline, Color.white, new Delta(Handle.BC));
374 }
375 double radius = (Double)Util.getAttVal(feature, Obj.ACHBRT, 0, Att.RADIUS);
376 if (radius != 0) {
377 UniHLU units = (UniHLU)Util.getAttVal(feature, Obj.ACHBRT, 0, Att.HUNITS);
378 Renderer.lineCircle (feature, new LineStyle(Mline, 4, new float[] { 10, 10 }, null), radius, units);
379 }
380 break;
381 case ACHARE:
382 if (zoom >= 12) {
383 if (feature.flag != Fflag.AREA) {
384 Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Color.black));
385 } else {
386 Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Mline));
387 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Mline);
388 }
389 if ((zoom >= 15) && ((name) != null)) {
390 Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 60), LabelStyle.NONE, Mline, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
391 }
392 ArrayList<StsSTS> sts = (ArrayList<StsSTS>)Util.getAttVal(feature, Obj.ACHARE, 0, Att.STATUS);
393 if ((zoom >= 15) && (sts != null) && (sts.contains(StsSTS.STS_RESV))) {
394 Renderer.labelText(feature, "Reserved", new Font("Arial", Font.PLAIN, 50), LabelStyle.NONE, Mline, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60)));
395 }
396 }
397 ArrayList<CatACH> cats = (ArrayList<CatACH>)Util.getAttVal(feature, Obj.ACHARE, 0, Att.CATACH);
398 int dy = (cats.size() - 1) * -30;
399 for (CatACH cat : cats) {
400 switch (cat) {
401 case ACH_DEEP:
402 Renderer.labelText(feature, "DW", new Font("Arial", Font.BOLD, 50), LabelStyle.NONE, Mline, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
403 dy += 60;
404 break;
405 case ACH_TANK:
406 Renderer.labelText(feature, "Tanker", new Font("Arial", Font.BOLD, 50), LabelStyle.NONE, Mline, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
407 dy += 60;
408 break;
409 case ACH_H24P:
410 Renderer.labelText(feature, "24h", new Font("Arial", Font.BOLD, 50), LabelStyle.NONE, Mline, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
411 dy += 60;
412 break;
413 case ACH_EXPL:
414 Renderer.symbol(feature, Harbours.Explosives, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
415 dy += 60;
416 break;
417 case ACH_QUAR:
418 Renderer.symbol(feature, Harbours.Hospital, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
419 dy += 60;
420 break;
421 case ACH_SEAP:
422 Renderer.symbol(feature, Areas.Seaplane, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
423 dy += 60;
424 break;
425 }
426 }
427 break;
428 case BERTHS:
429 if (zoom >= 14) {
430 Renderer.labelText(feature, name == null ? " " : name, new Font("Arial", Font.PLAIN, 40), LabelStyle.RRCT, Mline, Color.white, null);
431 }
432 break;
433 case BUISGL:
434 if (zoom >= 16) {
435 ArrayList<Symbol> symbols = new ArrayList();
436 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Util.getAttVal(feature, Obj.BUISGL, 0, Att.FUNCTN);
437 for (FncFNC fnc : fncs) {
438 symbols.add(Landmarks.Funcs.get(fnc));
439 }
440 if (feature.objs.containsKey(Obj.SMCFAC)) {
441 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) Util.getAttVal(feature, Obj.SMCFAC, 0, Att.CATSCF);
442 for (CatSCF scf : scfs) {
443 symbols.add(Facilities.Cats.get(scf));
444 }
445 }
446 Renderer.cluster(feature, symbols);
447 }
448 break;
449 default:
450 break;
451 }
452 }
453/*
454 if ((zoom >= 12) && is_type("harbour")) {
455 if (has_attribute("category")) {
456 attribute_switch("category")
457 attribute_case("marina|yacht") symbol("marina");
458 attribute_case("marina_no_facilities") symbol("marina_nf");
459 attribute_default symbol("harbour");
460 end_switch
461 } else symbol("harbour");
462 if ((zoom >= 15) && (has_item_attribute("name")))
463 text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:middle", 0, -90);
464 }
465*/
466
467 private static void landmarks(Feature feature) {
468 ArrayList<CatLMK> cats = (ArrayList<CatLMK>) Util.getAttVal(feature, feature.type, 0, Att.CATLMK);
469 Symbol catSym = Landmarks.Shapes.get(cats.get(0));
470 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Util.getAttVal(feature, feature.type, 0, Att.FUNCTN);
471 Symbol fncSym = Landmarks.Funcs.get(fncs.get(0));
472 if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR))
473 catSym = Landmarks.ChurchTower;
474 if ((cats.get(0) == CatLMK.LMK_UNKN) && (fncs.get(0) == FncFNC.FNC_UNKN) && (feature.objs.get(Obj.LIGHTS) != null))
475 catSym = Beacons.LightMajor;
476 if (cats.get(0) == CatLMK.LMK_RADR)
477 fncSym = Landmarks.RadioTV;
478 Renderer.symbol(feature, catSym);
479 Renderer.symbol(feature, fncSym);
480/* if (!has_attribute("function") && !has_attribute("category") && has_object("light")) {
481 symbol("lighthouse");
482 if ((zoom >= 15) && has_item_attribute("name"))
483 text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:middle", 0, -70);
484 } else {
485 if ((zoom >= 15) && has_item_attribute("name"))
486 text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:start", 60, -50);
487 }
488}
489*/
490 Signals.addSignals(feature);
491 }
492
493 private static void buildings(Feature feature) {
494 }
495
496 private static void lights(Feature feature) {
497 switch (feature.type) {
498 case LITMAJ:
499 Renderer.symbol(feature, Beacons.LightMajor);
500 break;
501 case LITMIN:
502 case LIGHTS:
503 Renderer.symbol(feature, Beacons.LightMinor);
504 break;
505 }
506 Signals.addSignals(feature);
507 }
508
509 private static void locks(Feature feature) {
510 }
511 private static void marinas(Feature feature) {
512 if (zoom >= 16) {
513
514 }
515 }
516
517 private static void moorings(Feature feature) {
518 CatMOR cat = (CatMOR) Util.getAttVal(feature, feature.type, 0, Att.CATMOR);
519 switch (cat) {
520 case MOR_DLPN:
521 Renderer.symbol(feature, Harbours.Dolphin);
522 break;
523 case MOR_DDPN:
524 Renderer.symbol(feature, Harbours.DeviationDolphin);
525 break;
526 case MOR_BLRD:
527 case MOR_POST:
528 Renderer.symbol(feature, Harbours.Bollard);
529 break;
530 case MOR_BUOY:
531 BoySHP shape = (BoySHP) Util.getAttVal(feature, feature.type, 0, Att.BOYSHP);
532 if (shape == BoySHP.BOY_UNKN)
533 shape = BoySHP.BOY_SPHR;
534 Renderer.symbol(feature, Buoys.Shapes.get(shape), Util.getScheme(feature, feature.type));
535 break;
536 }
537 Signals.addSignals(feature);
538 }
539
540 private static void notices(Feature feature) {
541 if (zoom >= 14) {
542 double dx = 0.0, dy = 0.0;
543 switch (feature.type) {
544 case BCNCAR:
545 case BCNISD:
546 case BCNLAT:
547 case BCNSAW:
548 case BCNSPP:
549 case BCNWTW:
550 dy = 45.0;
551 break;
552 case NOTMRK:
553 dy = 0.0;
554 break;
555 default:
556 return;
557 }
558 Symbol s1 = null, s2 = null;
559 MarSYS sys = MarSYS.SYS_CEVN;
560 BnkWTW bnk = BnkWTW.BWW_UNKN;
561 AttItem att = feature.atts.get(Att.MARSYS);
562 if (att != null) sys = (MarSYS)att.val;
563 ObjTab objs = feature.objs.get(Obj.NOTMRK);
564 int n = objs.size();
565 if (n > 2) {
566 s1 = Notices.Notice;
567 n = 1;
568 } else {
569 for (AttMap atts : objs.values()) {
570 if (atts.get(Att.MARSYS) != null) sys = (MarSYS)atts.get(Att.MARSYS).val;
571 CatNMK cat = CatNMK.NMK_UNKN;
572 if (atts.get(Att.CATNMK) != null) cat = (CatNMK)atts.get(Att.CATNMK).val;
573 s2 = Notices.getNotice(cat, sys);
574 }
575 }
576/* Obj_t *obj = getObj(item, NOTMRK, i);
577 if (obj == NULL) continue;
578 Atta_t add;
579 int idx = 0;
580 while ((add = getAttEnum(obj, ADDMRK, idx++)) != MRK_UNKN) {
581 if ((add == MRK_LTRI) && (i == 2)) swap = true;
582 if ((add == MRK_RTRI) && (i != 2)) swap = true;
583 }
584 }
585 } else {
586
587 }
588 for (int i = 0; i <=2; i++) {
589 Obj_t *obj = getObj(item, NOTMRK, i);
590 if (obj == NULL) continue;
591 Atta_t category = getAttEnum(obj, CATNMK, i);
592 Atta_t add;
593 int idx = 0;
594 int top=0, bottom=0, left=0, right=0;
595 while ((add = getAttEnum(obj, ADDMRK, idx++)) != MRK_UNKN) {
596 switch (add) {
597 case MRK_TOPB:
598 top = add;
599 break;
600 case MRK_BOTB:
601 case MRK_BTRI:
602 bottom = add;
603 break;
604 case MRK_LTRI:
605 left = add;
606 break;
607 case MRK_RTRI:
608 right = add;
609 break;
610 default:
611 break;
612 }
613 }
614 double orient = getAtt(obj, ORIENT) != NULL ? getAtt(obj, ORIENT)->val.val.f : 0.0;
615 int system = getAtt(obj, MARSYS) != NULL ? getAtt(obj, MARSYS)->val.val.e : 0;
616 double flip = 0.0;
617 char *symb = "";
618 char *base = "";
619 char *colour = "black";
620 if ((system == SYS_BWR2) || (system == SYS_BNWR)) {
621 symb = bniwr_map[category];
622 switch (category) {
623 case NMK_NANK:
624 case NMK_LMHR:
625 case NMK_KTPM...NMK_RSPD:
626 {
627 int bank = getAtt(obj, BNKWTW) != NULL ? getAtt(obj, BNKWTW)->val.val.e : 0;
628 switch (bank) {
629 case BWW_LEFT:
630 base = "notice_blb";
631 colour = "red";
632 break;
633 case BWW_RGHT:
634 base = "notice_brb";
635 colour = "green";
636 break;
637 default:
638 base = "notice_bsi";
639 colour = "black";
640 break;
641 }
642 }
643 default:
644 break;
645 }
646 } else if (system == SYS_PPWB) {
647 int bank = getAtt(obj, BNKWTW) != NULL ? getAtt(obj, BNKWTW)->val.val.e : 0;
648 if (bank != 0) {
649 switch (category) {
650 case NMK_WLAR:
651 if (bank == BNK_LEFT)
652 base = "notice_pwlarl";
653 else
654 base = "notice_pwlarr";
655 break;
656 case NMK_WRAL:
657 if (bank == BNK_LEFT)
658 base = "notice_pwrall";
659 else
660 base = "notice_pwralr";
661 break;
662 case NMK_KTPM:
663 if (bank == BNK_LEFT)
664 base = "notice_ppml";
665 else
666 base = "notice_ppmr";
667 break;
668 case NMK_KTSM:
669 if (bank == BNK_LEFT)
670 base = "notice_psml";
671 else
672 base = "notice_psmr";
673 break;
674 case NMK_KTMR:
675 if (bank == BNK_LEFT)
676 base = "notice_pmrl";
677 else
678 base = "notice_pmrr";
679 break;
680 case NMK_CRTP:
681 if (bank == BNK_LEFT)
682 base = "notice_pcpl";
683 else
684 base = "notice_pcpr";
685 break;
686 case NMK_CRTS:
687 if (bank == BNK_LEFT)
688 base = "notice_pcsl";
689 else
690 base = "notice_pcsr";
691 break;
692 default:
693 break;
694 }
695 }
696 } else {
697 symb = notice_map[category];
698 switch (category) {
699 case NMK_NOVK...NMK_NWSH:
700 case NMK_NMTC...NMK_NLBG:
701 base = "notice_a";
702 break;
703 case NMK_MVTL...NMK_CHDR:
704 base = "notice_b";
705 break;
706 case NMK_PRTL...NMK_PRTR:
707 case NMK_OVHC...NMK_LBGP:
708 base = "notice_e";
709 colour = "white";
710 break;
711 default:
712 break;
713 }
714 switch (category) {
715 case NMK_MVTL:
716 case NMK_ANKP:
717 case NMK_PRTL:
718 case NMK_MWAL:
719 case NMK_MWAR:
720 flip = 180.0;
721 break;
722 case NMK_SWWR:
723 case NMK_WRSL:
724 case NMK_WARL:
725 flip = -90.0;
726 break;
727 case NMK_SWWC:
728 case NMK_SWWL:
729 case NMK_WLSR:
730 case NMK_WALR:
731 flip = 90.0;
732 break;
733 default:
734 break;
735 }
736 }
737 if (n == 2) {
738 dx = (((i != 2) && swap) || ((i == 2) && !swap)) ? -30.0 : 30.0;
739 }
740 if (top == MRK_TOPB)
741 renderSymbol(item, NOTMRK, "notice_board", "", "", BC, dx, dy, orient);
742 if (bottom == MRK_BOTB)
743 renderSymbol(item, NOTMRK, "notice_board", "", "", BC, dx, dy, orient+180);
744 if (bottom == MRK_BTRI)
745 renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient+180);
746 if (left == MRK_LTRI)
747 renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient-90);
748 if (right == MRK_RTRI)
749 renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient+90);
750 renderSymbol(item, NOTMRK, base, "", "", CC, dx, dy, orient);
751 renderSymbol(item, NOTMRK, symb, "", colour, CC, dx, dy, orient+flip);
752 }
753*/
754 }
755 }
756 private static void obstructions(Feature feature) {
757 if ((zoom >= 14) && (feature.type == Obj.UWTROC)) {
758 WatLEV lvl = (WatLEV) Util.getAttVal(feature, feature.type, 0, Att.WATLEV);
759 switch (lvl) {
760 case LEV_CVRS:
761 Renderer.symbol(feature, Areas.RockC);
762 break;
763 case LEV_AWSH:
764 Renderer.symbol(feature, Areas.RockA);
765 break;
766 default:
767 Renderer.symbol(feature, Areas.Rock);
768 }
769 } else {
770 Renderer.symbol(feature, Areas.Rock);
771 }
772 }
773 private static void pipelines(Feature feature) {
774 if (zoom >= 14) {
775 if (feature.type == Obj.PIPSOL) {
776 Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, null, 0, Mline);
777 } else if (feature.type == Obj.PIPOHD) {
778
779 }
780 }
781 }
782 private static void platforms(Feature feature) {
783 ArrayList<CatOFP> cats = (ArrayList<CatOFP>)Util.getAttVal(feature, Obj.OFSPLF, 0, Att.CATOFP);
784 if ((CatOFP) cats.get(0) == CatOFP.OFP_FPSO)
785 Renderer.symbol(feature, Buoys.Storage);
786 else
787 Renderer.symbol(feature, Landmarks.Platform);
788 String name = Util.getName(feature);
789 if ((zoom >= 15) && (name != null))
790 Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
791/*object_rules(platforms) {
792 if (has_object("fog_signal")) object(fogs);
793 if (has_object("radar_transponder")) object(rtbs);
794 if (has_object("light")) object(lights);
795}
796*/
797 }
798 private static void ports(Feature feature) {
799 if (zoom >= 14) {
800 if (feature.type == Obj.CRANES) {
801 if ((CatCRN) Util.getAttVal(feature, feature.type, 0, Att.CATCRN) == CatCRN.CRN_CONT)
802 Renderer.symbol(feature, Harbours.ContainerCrane);
803 else
804 Renderer.symbol(feature, Harbours.PortCrane);
805 } else if (feature.type == Obj.HULKES) {
806 Renderer.lineVector(feature, new LineStyle(Color.black, 4, null, new Color(0xffe000)));
807 String name = Util.getName(feature);
808 if ((zoom >= 15) && (name != null))
809 Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, null, null);
810 }
811 }
812 }
813 private static void separation(Feature feature) {
814 switch (feature.type) {
815 case TSEZNE:
816 case TSSCRS:
817 case TSSRON:
818 if (zoom <= 15)
819 Renderer.lineVector(feature, new LineStyle(null, 0, null, new Color(0x80c48080, true)));
820 else
821 Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, null, null));
822 String name = Util.getName(feature);
823 if ((zoom >= 10) && (name != null))
824 Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 150), LabelStyle.NONE, new Color(0x80c48080, true), null, null);
825 break;
826 case TSELNE:
827 Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, null, null));
828 break;
829 case TSSLPT:
830 Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, null, 0, new Color(0x80c48080, true));
831 break;
832 case TSSBND:
833 Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, new float[] { 40, 40 }, null));
834 break;
835 case ISTZNE:
836 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, new Color(0x80c48080, true));
837 break;
838 }
839 }
840 private static void shoreline(Feature feature) {
841 if (zoom >= 12) {
842 switch ((CatSLC) Util.getAttVal(feature, feature.type, 0, Att.CATSLC)) {
843 case SLC_TWAL:
844 WatLEV lev = (WatLEV) Util.getAttVal(feature, feature.type, 0, Att.WATLEV);
845 if (lev == WatLEV.LEV_CVRS) {
846 Renderer.lineVector(feature, new LineStyle(Color.black, 10, new float[] { 40, 40 }, null));
847 if (zoom >= 15)
848 Renderer.lineText(feature, "(covers)", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, 20);
849 } else {
850 Renderer.lineVector(feature, new LineStyle(Color.black, 10, null, null));
851 }
852 if (zoom >= 15)
853 Renderer.lineText(feature, "Training Wall", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
854 }
855 }
856 }
857
858 private static void stations(Feature feature) {
859 if (zoom >= 14) {
860 switch (feature.type) {
861 case SISTAT:
862 case SISTAW:
863 Renderer.symbol(feature, Harbours.SignalStation);
864 String str = "SS";
865 // Append (cat) to str
866 Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(30, 0)));
867 break;
868 case RDOSTA:
869 Renderer.symbol(feature, Harbours.SignalStation);
870 Renderer.symbol(feature, Beacons.RadarStation);
871 break;
872 case RADSTA:
873 Renderer.symbol(feature, Harbours.SignalStation);
874 Renderer.symbol(feature, Beacons.RadarStation);
875 break;
876 case PILBOP:
877 Renderer.symbol(feature, Harbours.Pilot);
878 break;
879 case CGUSTA:
880 Renderer.symbol(feature, Harbours.SignalStation);
881 Renderer.labelText(feature, "CG", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(30, 0)));
882 break;
883 case RSCSTA:
884 Renderer.symbol(feature, Harbours.Rescue);
885 break;
886 }
887 }
888 Signals.addSignals(feature);
889 }
890
891 private static void transits(Feature feature) {
892 if (zoom >= 12) {
893 if (feature.type == Obj.RECTRC) Renderer.lineVector (feature, new LineStyle(Color.black, 10, null, null));
894 else if (feature.type == Obj.NAVLNE) Renderer.lineVector (feature, new LineStyle(Color.black, 10, new float[] { 25, 25 }, null));
895 }
896 if (zoom >= 15) {
897 String str = "";
898 String name = Util.getName(feature);
899 if (name != null) str += name + " ";
900 Double ort = (Double) Util.getAttVal(feature, feature.type, 0, Att.ORIENT);
901 if (ort != null) str += ort.toString() + "\u0152";
902 if (!str.isEmpty()) Renderer.lineText(feature, str, new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
903 }
904 }
905 private static void waterways(Feature feature) {
906
907 }
908
909 private static void wrecks(Feature feature) {
910 if (zoom >= 14) {
911 CatWRK cat = (CatWRK) Util.getAttVal(feature, feature.type, 0, Att.CATWRK);
912 switch (cat) {
913 case WRK_DNGR:
914 case WRK_MSTS:
915 Renderer.symbol(feature, Areas.WreckD);
916 break;
917 case WRK_HULS:
918 Renderer.symbol(feature, Areas.WreckS);
919 break;
920 default:
921 Renderer.symbol(feature, Areas.WreckND);
922 }
923 }
924 }
925}
Note: See TracBrowser for help on using the repository browser.