diff --git a/cave/com.raytheon.viz.satellite/.settings/org.eclipse.jdt.core.prefs b/cave/com.raytheon.viz.satellite/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bdd209d2ba..0000000000 --- a/cave/com.raytheon.viz.satellite/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,7 +0,0 @@ -#Thu Mar 26 11:03:00 CDT 2009 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/cave/com.raytheon.viz.satellite/META-INF/MANIFEST.MF b/cave/com.raytheon.viz.satellite/META-INF/MANIFEST.MF index 7b2a3d75be..b3982026d6 100644 --- a/cave/com.raytheon.viz.satellite/META-INF/MANIFEST.MF +++ b/cave/com.raytheon.viz.satellite/META-INF/MANIFEST.MF @@ -2,35 +2,32 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Satellite Visualization Plug-in Bundle-SymbolicName: com.raytheon.viz.satellite;singleton:=true -Bundle-Version: 1.13.0.qualifier +Bundle-Version: 1.14.0.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Bundle-ActivationPolicy: lazy Bundle-Vendor: Raytheon -Eclipse-RegisterBuddy: com.raytheon.viz.core, com.raytheon.uf.viz.core, com.raytheon.viz.ui -Eclipse-BuddyPolicy: ext, global -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - com.raytheon.uf.viz.core, +Require-Bundle: org.eclipse.core.runtime;bundle-version="3.8", + com.raytheon.uf.viz.core;bundle-version="1.14", com.raytheon.uf.common.dataplugin, - com.raytheon.uf.common.dataplugin.satellite, - com.raytheon.uf.common.datastorage, - com.raytheon.uf.common.serialization.comm, - com.raytheon.uf.common.geospatial, + com.raytheon.uf.common.dataplugin.satellite;bundle-version="1.14", + com.raytheon.uf.common.datastorage;bundle-version="1.14", + com.raytheon.uf.common.geospatial;bundle-version="1.14", com.raytheon.uf.common.colormap, - com.raytheon.uf.common.pointdata, - com.raytheon.uf.common.message, - com.raytheon.uf.viz.productbrowser, + com.raytheon.uf.common.pointdata;bundle-version="1.13", + com.raytheon.uf.viz.productbrowser;bundle-version="1.14", com.raytheon.uf.common.derivparam;bundle-version="1.14.0", com.raytheon.uf.viz.ui.menus, com.raytheon.uf.common.style, - com.raytheon.viz.ui, - com.raytheon.viz.core, - javax.measure, + com.raytheon.viz.ui;bundle-version="1.14", com.raytheon.uf.common.inventory;bundle-version="1.14.0", com.raytheon.uf.viz.datacube;bundle-version="1.14.0", - com.raytheon.uf.common.dataplugin.level, + com.raytheon.uf.common.dataplugin.level;bundle-version="1.14", com.raytheon.uf.common.comm, - com.raytheon.uf.common.numeric, - com.raytheon.viz.alerts -Bundle-ActivationPolicy: lazy + com.raytheon.uf.common.numeric;bundle-version="1.14", + com.raytheon.viz.alerts, + com.raytheon.uf.viz.core.rsc;bundle-version="1.14", + javax.measure +Import-Package: com.raytheon.viz.core.rsc, + com.raytheon.viz.core.rsc.hdf5 Export-Package: com.raytheon.viz.satellite, com.raytheon.viz.satellite.rsc -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatResource.java b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatResource.java index 41f30e9b68..d0ebd5ab1c 100644 --- a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatResource.java +++ b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatResource.java @@ -24,15 +24,19 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.measure.Measure; import javax.measure.converter.UnitConverter; import javax.measure.quantity.Temperature; import javax.measure.unit.Unit; +import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.TransformException; import com.raytheon.uf.common.colormap.IColorMap; import com.raytheon.uf.common.colormap.prefs.ColorMapParameters; @@ -43,6 +47,7 @@ import com.raytheon.uf.common.dataplugin.satellite.SatMapCoverage; import com.raytheon.uf.common.dataplugin.satellite.SatelliteRecord; import com.raytheon.uf.common.geospatial.IGridGeometryProvider; import com.raytheon.uf.common.geospatial.ReferencedCoordinate; +import com.raytheon.uf.common.geospatial.data.GeographicDataSource; import com.raytheon.uf.common.style.ParamLevelMatchCriteria; import com.raytheon.uf.common.style.StyleException; import com.raytheon.uf.common.style.StyleManager; @@ -67,6 +72,12 @@ import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; +import com.raytheon.uf.viz.core.rsc.interrogation.ClassInterrogationKey; +import com.raytheon.uf.viz.core.rsc.interrogation.Interrogatable; +import com.raytheon.uf.viz.core.rsc.interrogation.InterrogateMap; +import com.raytheon.uf.viz.core.rsc.interrogation.InterrogationKey; +import com.raytheon.uf.viz.core.rsc.interrogation.Interrogator; +import com.raytheon.uf.viz.core.rsc.interrogation.StringInterrogationKey; import com.raytheon.viz.satellite.SatelliteConstants; import com.raytheon.viz.satellite.inventory.DerivedSatelliteRecord; import com.raytheon.viz.satellite.tileset.SatDataRetriever; @@ -76,6 +87,14 @@ import com.vividsolutions.jts.geom.Coordinate; /** * Provides satellite raster rendering support * + * This resource implements the {@link Interrogatable} interface and provides + * the keys for accessing the value at a point({@link Interrogator#VALUE}), the + * full {@link SatelliteRecord}({@link #SATELLITE_RECORD_INTERROGATE_KEY}), a + * {@link GeographicDataSource} for the currently displayed tileset/level( + * {@link #DATA_SOURCE_INTERROGATE_KEY}), and a special key that returns the + * same value but is only applicable to satellite data types( + * {@link #SATELLITE_DATA_INTERROGATE_ID}) + * *
  * 
  *  SOFTWARE HISTORY
@@ -101,6 +120,7 @@ import com.vividsolutions.jts.geom.Coordinate;
  *  Apr 09, 2014  2947      bsteffen    Improve flexibility of sat derived
  *                                      parameters, implement ImageProvider
  *  May 06, 2014            njensen     Improve error message
+ *  Jun 12, 2014  3238      bsteffen    Implement Interrogatable
  * 
  * 
* @@ -109,30 +129,51 @@ import com.vividsolutions.jts.geom.Coordinate; */ public class SatResource extends AbstractPluginDataObjectResource - implements ImageProvider { + implements ImageProvider, Interrogatable { - /** String id to look for satellite-provided data values */ + /** + * String id to look for satellite-provided data values + * + * @deprecated use #SATELLITE_DATA_INTERROGATE_KEY and + * {@link #interrogate(ReferencedCoordinate, DataTime, InterrogationKey...)} + */ + @Deprecated public static final String SATELLITE_DATA_INTERROGATE_ID = "satelliteDataValue"; + @SuppressWarnings("unchecked") + public static final InterrogationKey> SATELLITE_DATA_INTERROGATE_KEY = new StringInterrogationKey<>( + SATELLITE_DATA_INTERROGATE_ID, + (Class>) ((Class) Measure.class)); + + private static final InterrogationKey SATELLITE_RECORD_INTERROGATE_KEY = new ClassInterrogationKey<>( + SatelliteRecord.class); + + private static final InterrogationKey DATA_SOURCE_INTERROGATE_KEY = new ClassInterrogationKey<>( + GeographicDataSource.class); + private static class InterrogationResult { - private final SatelliteRecord record; + private final SatTileSetRenderable renderable; private final double value; - public InterrogationResult(SatelliteRecord record, double value) { - this.record = record; + public InterrogationResult(SatTileSetRenderable renderable, double value) { + this.renderable = renderable; this.value = value; } public SatelliteRecord getRecord() { - return record; + return renderable.getSatelliteRecord(); } public double getValue() { return value; } + public GeographicDataSource getDataSource() { + return renderable.getCurrentLevelDataSource(); + } + } private class SatRenderable implements IRenderable { @@ -225,8 +266,7 @@ public class SatResource extends for (SatTileSetRenderable renderable : tileMap.values()) { double rValue = renderable.interrogate(latLon, requestUnit); if (Double.isNaN(rValue) == false) { - result = new InterrogationResult( - renderable.getSatelliteRecord(), rValue); + result = new InterrogationResult(renderable, rValue); } } } @@ -550,4 +590,54 @@ public class SatResource extends return true; } + @Override + public Set> getInterrogationKeys() { + Set> result = new HashSet<>(); + result.add(Interrogator.VALUE); + result.add(SATELLITE_DATA_INTERROGATE_KEY); + result.add(SATELLITE_RECORD_INTERROGATE_KEY); + result.add(DATA_SOURCE_INTERROGATE_KEY); + return result; + } + + @Override + public InterrogateMap interrogate(ReferencedCoordinate coordinate, + DataTime time, InterrogationKey... keys) { + InterrogateMap result = new InterrogateMap(); + SatRenderable renderable = (SatRenderable) getRenderable(time); + if (renderable == null) { + return result; + } + ColorMapParameters parameters = getCapability(ColorMapCapability.class) + .getColorMapParameters(); + Unit dataUnit = parameters.getColorMapUnit(); + InterrogationResult renderableResult = null; + try { + renderableResult = renderable.interrogate(coordinate.asLatLon(), + dataUnit); + } catch (VizException | TransformException | FactoryException e) { + statusHandler.error("Cannot interrogate satellite data", e); + } + if (renderableResult == null) { + return result; + } + double dataValue = renderableResult.getValue(); + Measure value = Measure.valueOf(dataValue, dataUnit); + for (InterrogationKey key : keys) { + if (Interrogator.VALUE.equals(key)) { + result.put(Interrogator.VALUE, value); + } else if (SATELLITE_DATA_INTERROGATE_KEY.equals(key)) { + result.put(SATELLITE_DATA_INTERROGATE_KEY, value); + } else if (SATELLITE_RECORD_INTERROGATE_KEY.equals(key)) { + result.put(SATELLITE_RECORD_INTERROGATE_KEY, + renderableResult.getRecord()); + } else if (DATA_SOURCE_INTERROGATE_KEY.equals(key)) { + result.put(DATA_SOURCE_INTERROGATE_KEY, + renderableResult.getDataSource()); + } + } + + return result; + } + } diff --git a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/tileset/SatTileSetRenderable.java b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/tileset/SatTileSetRenderable.java index f580c81b7c..2abbba3afb 100644 --- a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/tileset/SatTileSetRenderable.java +++ b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/tileset/SatTileSetRenderable.java @@ -19,12 +19,23 @@ **/ package com.raytheon.viz.satellite.tileset; +import org.geotools.coverage.grid.GeneralGridEnvelope; +import org.geotools.coverage.grid.GridGeometry2D; +import org.opengis.coverage.grid.GridEnvelope; + import com.raytheon.uf.common.colormap.image.ColorMapData; import com.raytheon.uf.common.dataplugin.satellite.SatelliteRecord; +import com.raytheon.uf.common.geospatial.data.GeographicDataSource; +import com.raytheon.uf.common.numeric.source.DataSource; +import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.VizApp; +import com.raytheon.uf.viz.core.drawables.IColormappedImage; +import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.tile.RecordTileSetRenderable; import com.raytheon.uf.viz.core.tile.Tile; +import com.raytheon.uf.viz.core.tile.TileLevel; /** * Satellite tile set renderable, uses {@link SatDataRetriever} for {@link Tile} @@ -37,6 +48,8 @@ import com.raytheon.uf.viz.core.tile.Tile; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jun 19, 2013 mschenke Initial creation + * Jun 19, 2014 3238 bsteffen Add method to create a DataSource for + * a tile level. * * * @@ -78,4 +91,65 @@ public class SatTileSetRenderable extends RecordTileSetRenderable { public SatelliteRecord getSatelliteRecord() { return (SatelliteRecord) record; } + + public GeographicDataSource getCurrentLevelDataSource() { + TileLevel level = tileSet.getTileLevel(lastPaintedLevel); + DataSource tile = new TileLevelDataSource(level); + GridEnvelope range = tileSetGeometry.getGridRange(); + int levelFactor = 2 * level.getLevel(); + if (levelFactor == 0) { + levelFactor = 1; + } + int startX = range.getLow(0) / levelFactor; + int startY = range.getLow(1) / levelFactor; + int width = range.getSpan(0) / levelFactor; + int height = range.getSpan(1) / levelFactor; + + GridGeometry2D levelGeometry = new GridGeometry2D( + new GeneralGridEnvelope(new int[] { startX, startY }, + new int[] { width, height }, false), + tileSetGeometry.getEnvelope()); + + return new GeographicDataSource(tile, levelGeometry); + } + + private class TileLevelDataSource implements DataSource { + + private final TileLevel level; + + public TileLevelDataSource(TileLevel level) { + this.level = level; + } + + @Override + public double getDataValue(final int x, final int y) { + Tile tile = level.getTile((double) x, (double) y); + IColormappedImage cmapImage = null; + if (tile != null) { + DrawableImage di = imageMap.get(tile); + if (di != null) { + IImage image = di.getImage(); + if (image instanceof IColormappedImage) { + cmapImage = (IColormappedImage) image; + } + } + } + if (cmapImage != null) { + final IColormappedImage theImage = cmapImage; + final double[] result = new double[1]; + VizApp.runSync(new Runnable() { + + @Override + public void run() { + result[0] = theImage.getValue(x % tileSize, y + % tileSize); + } + + }); + return result[0]; + } + return Double.NaN; + } + + } }