diff --git a/cave/com.raytheon.uf.viz.aviation.advisory/META-INF/MANIFEST.MF b/cave/com.raytheon.uf.viz.aviation.advisory/META-INF/MANIFEST.MF index 0f434a5f7b..1d79bda9e6 100644 --- a/cave/com.raytheon.uf.viz.aviation.advisory/META-INF/MANIFEST.MF +++ b/cave/com.raytheon.uf.viz.aviation.advisory/META-INF/MANIFEST.MF @@ -12,6 +12,7 @@ Import-Package: com.raytheon.uf.common.dataplugin, com.raytheon.uf.viz.core.drawables, com.raytheon.uf.viz.core.exception, com.raytheon.uf.viz.core.map, + com.raytheon.uf.viz.core.point.display, com.raytheon.uf.viz.core.rsc, com.raytheon.uf.viz.core.rsc.capabilities, com.vividsolutions.jts.algorithm, diff --git a/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/AdvisoryRecord.java b/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/AdvisoryRecord.java index 15e4930f48..38e8da166c 100644 --- a/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/AdvisoryRecord.java +++ b/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/AdvisoryRecord.java @@ -33,7 +33,6 @@ import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LinearRing; import com.vividsolutions.jts.geom.Polygon; - /** * * A class containing all parameters necessary for an outline resource to be @@ -45,6 +44,7 @@ import com.vividsolutions.jts.geom.Polygon; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Oct 2, 2009 bsteffen Initial creation + * Jul 7, 2015 10352 byin Added labelSymbolId * * * @@ -52,7 +52,7 @@ import com.vividsolutions.jts.geom.Polygon; * @version 1.0 */ public class AdvisoryRecord { - + private static GeometryFactory FACTORY = new GeometryFactory(); protected static final UnitConverter NM_TO_METERS = NonSI.NAUTICAL_MILE @@ -61,21 +61,23 @@ public class AdvisoryRecord { protected static final int NUM_VERTICES = 40; protected static final double ANGLE_STEP = 360.0 / NUM_VERTICES; - + public enum AdvisoryResourceType { LINE, ISOL, AREA, TEXT } private AdvisoryResourceType type; - + private Polygon polygon; private Coordinate[] line; private Coordinate labelLoc; - + private String label; + private char labelSymbolId = 0; + private String inspectString; public AdvisoryRecord(Coordinate labelLoc, String label) { @@ -98,7 +100,7 @@ public class AdvisoryRecord { this.label = label; this.inspectString = inspectString; } - + public AdvisoryRecord(Coordinate[] line, double diameter, String label, String inspectString) { this.type = AdvisoryResourceType.LINE; @@ -144,7 +146,7 @@ public class AdvisoryRecord { this.label = label; this.inspectString = inspectString; } - + public AdvisoryRecord(Coordinate center, double diameter, String label, String inspectString) { this.type = AdvisoryResourceType.ISOL; @@ -167,7 +169,7 @@ public class AdvisoryRecord { this.label = label; this.inspectString = inspectString; } - + /** * Convert a pair of Lat Lon coords to a pair of pixel coords in a certain * direction and a certain distance away @@ -202,8 +204,7 @@ public class AdvisoryRecord { * @return a new Coordinate at the correct location */ public static Coordinate getPointOnCircle(Coordinate center, - double distance, - double angle) { + double distance, double angle) { while (angle > 180) { angle -= 360; } @@ -268,5 +269,12 @@ public class AdvisoryRecord { return inspectString; } - + public char getLabelSymbolId() { + return labelSymbolId; + } + + public void setLabelSymbolId(char labelSymbolId) { + this.labelSymbolId = labelSymbolId; + } + } diff --git a/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/adapter/AirmetDataAdapter.java b/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/adapter/AirmetDataAdapter.java index ad7a0c84d7..3cf7bcbbd2 100644 --- a/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/adapter/AirmetDataAdapter.java +++ b/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/adapter/AirmetDataAdapter.java @@ -47,6 +47,9 @@ import com.vividsolutions.jts.geom.Coordinate; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Oct 2, 2009 bsteffen Initial creation + * Jul 7, 2015 10352 byin Display symbols for turb/icing + * and hazard types for IFR/MTOS + * * * * @@ -56,14 +59,28 @@ import com.vividsolutions.jts.geom.Coordinate; @XmlAccessorType(XmlAccessType.NONE) public class AirmetDataAdapter extends AbstractAdvisoryDataAdapter { - private static final String LABEL_FORMAT = "%d%s"; - private static final String INSPECT_FORMAT = "Valid UNTIL %02d%02d%02d\n%s"; private static final String REPORT_INDICATOR = "AIRMET"; private static final String SEGMENT_SEPERATOR = "\n. \n"; + private static final String TURBULENCE_TYPE = "TURBULENCE"; + + private static final String ICING_TYPE = "ICING"; + + private static final String IFR_TYPE = "INSTRUMENT FLIGHT RULES"; + + private static final String MTN_TYPE = "MOUNTAIN OBSCURATION"; + + private static final String IFR_LABEL = "IFR"; + + private static final String MTN_LABEL = "MTOS"; + + protected static final char TURBULENCE_SYMBOL = '\u007b'; + + protected static final char ICING_SYMBOL = '\u007e'; + private static final float LINE_WIDTH = 1.5f; private static final LineStyle LINE_STYLE = LineStyle.SOLID; @@ -111,7 +128,6 @@ public class AirmetDataAdapter extends AbstractAdvisoryDataAdapter { coords[loc.getIndex() - 1] = new Coordinate(loc.getLongitude(), loc.getLatitude()); } - int updateNumber = parent.getUpdateNumber(); String sequenceId = report.getSequenceID(); if (sequenceId == null) { sequenceId = ""; @@ -134,11 +150,30 @@ public class AirmetDataAdapter extends AbstractAdvisoryDataAdapter { } else { segment = ""; } - String label = String.format(LABEL_FORMAT, updateNumber, sequenceId); + String inspectString = String.format(INSPECT_FORMAT, day, hour, min, segment); + String hazType = report.getHazardType(); + ; + String label; + + if (hazType.equalsIgnoreCase(IFR_TYPE)) { + label = IFR_LABEL; + } else if (hazType.equalsIgnoreCase(MTN_TYPE)) { + label = MTN_LABEL; + } else { + label = ""; + } + AdvisoryRecord aRecord = new AdvisoryRecord(coords, label, inspectString); + + if (hazType.equalsIgnoreCase(ICING_TYPE)) { + aRecord.setLabelSymbolId(ICING_SYMBOL); + } else if (hazType.equalsIgnoreCase(TURBULENCE_TYPE)) { + aRecord.setLabelSymbolId(TURBULENCE_SYMBOL); + } + return aRecord; } diff --git a/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/rsc/AdvisoryResource.java b/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/rsc/AdvisoryResource.java index 2798382f26..f80012899a 100644 --- a/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/rsc/AdvisoryResource.java +++ b/cave/com.raytheon.uf.viz.aviation.advisory/src/com/raytheon/uf/viz/aviation/advisory/rsc/AdvisoryResource.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.graphics.Rectangle; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.raytheon.uf.common.dataplugin.PluginDataObject; @@ -42,12 +43,15 @@ import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; import com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle; import com.raytheon.uf.viz.core.IGraphicsTarget.VerticalAlignment; +import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.drawables.IFont; import com.raytheon.uf.viz.core.drawables.IFont.Style; +import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.IWireframeShape; import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.MapDescriptor; +import com.raytheon.uf.viz.core.point.display.SymbolLoader; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.rsc.IResourceDataChanged; import com.raytheon.uf.viz.core.rsc.LoadProperties; @@ -75,6 +79,7 @@ import com.vividsolutions.jts.geom.Polygon; * Jun 13, 2011 9758 cjeanbap Set colorString of AdvisoryResourceData. * Aug 14, 2014 3523 mapeters Updated deprecated {@link DrawableString#textStyle} * assignments. + * Jul 7, 2015 10352 byin Added SymbolLoader to plot symbols * * * @author bsteffen @@ -101,6 +106,8 @@ public class AdvisoryResource extends private float magnification; + private SymbolLoader symbolLoader; + protected AdvisoryResource(AdvisoryResourceData resourceData, LoadProperties loadProperties) { super(resourceData, loadProperties); @@ -188,6 +195,7 @@ public class AdvisoryResource extends font.dispose(); } this.font = target.initializeFont("Monospace", 10, new Style[] {}); + this.symbolLoader = new SymbolLoader(); } @Override @@ -209,6 +217,7 @@ public class AdvisoryResource extends } this.displayedDataTime = curDataTime; + double scale[] = getScale(paintProps); if (mainShape == null || dottedShape == null || dashedShape == null) { clearShapes(); @@ -283,6 +292,21 @@ public class AdvisoryResource extends RGB[] colors = new RGB[labels.length]; Arrays.fill(colors, color); + double x = pixelLoc[0]; + double y = pixelLoc[1]; + + if (record.getLabelSymbolId() != 0) { + IImage symbolImg = symbolLoader.getImage(target, color, + (char) record.getLabelSymbolId()); + + Coordinate ul = new Coordinate(x, y); + Coordinate ur = new Coordinate(x + 12 * scale[0], y); + Coordinate lr = new Coordinate(ur.x, y + 12 * scale[1]); + Coordinate ll = new Coordinate(x, lr.y); + PixelCoverage extent = new PixelCoverage(ul, ur, lr, ll); + target.drawRaster(symbolImg, extent, paintProps); + } + DrawableString dStrings = new DrawableString(labels, colors); dStrings.font = font; dStrings.setCoordinates(pixelLoc[0], pixelLoc[1]); @@ -418,4 +442,13 @@ public class AdvisoryResource extends clearShapes(); } + private double[] getScale(PaintProperties paintProps) { + IExtent extent = paintProps.getView().getExtent(); + Rectangle canvasBounds = paintProps.getCanvasBounds(); + double[] scale = new double[2]; + scale[0] = extent.getWidth() / canvasBounds.width; + scale[1] = extent.getHeight() / canvasBounds.height; + return scale; + } + }