Issue #1162 - Fix the NCEP/Hydro RFC FFG Mosaic displays.

Fixed the grid resource and created FFGVizGroupResource.

Change-Id: I4e90fb77c9a27da049e6c06d091076961e7f304c

Former-commit-id: ec28f8f28f [formerly 643eaea29d] [formerly 9fe028c438 [formerly d99d895daeaa049c6b4e683b7fbd37186f5ef1dc]]
Former-commit-id: 9fe028c438
Former-commit-id: ff2bb36d39
This commit is contained in:
Mike Duff 2012-09-20 10:17:47 -05:00
parent cb9434d637
commit 2e0b64277c
5 changed files with 337 additions and 48 deletions

View file

@ -50,6 +50,7 @@ import com.raytheon.viz.grid.util.TiltRequest;
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Mar 18, 2010 bsteffen Initial creation * Mar 18, 2010 bsteffen Initial creation
* *
*
* </pre> * </pre>
* *
* @author bsteffen * @author bsteffen
@ -60,7 +61,7 @@ public class RequestableDataRecord extends GribRecord {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private AbstractRequestableData requester; private final AbstractRequestableData requester;
public RequestableDataRecord(AbstractRequestableData requester) public RequestableDataRecord(AbstractRequestableData requester)
throws VizException { throws VizException {
@ -74,6 +75,9 @@ public class RequestableDataRecord extends GribRecord {
coverage); coverage);
} }
GribModel modelInfo = new GribModel(); GribModel modelInfo = new GribModel();
if (requester instanceof GribRequestableData) {
setGridVersion(((GribRequestableData) requester).getGribSource().getGridVersion());
}
modelInfo.setModelName(requester.getSource()); modelInfo.setModelName(requester.getSource());
modelInfo.setLocation(coverage); modelInfo.setLocation(coverage);
modelInfo.setLevel(requester.getLevel()); modelInfo.setLevel(requester.getLevel());

View file

@ -0,0 +1,203 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.viz.grid.rsc;
import java.util.ArrayList;
import java.util.Map;
import com.raytheon.uf.common.geospatial.ReferencedCoordinate;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.drawables.ResourcePair;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.map.MapDescriptor;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.IRefreshListener;
import com.raytheon.uf.viz.core.rsc.IResourceDataChanged;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.ResourceList;
import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability;
import com.raytheon.viz.core.rsc.VizGroupResourceData;
/**
* FFG Group Resource class.
*
* Based off VizGroupResource.java
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Sep 19, 2012 1162 mpduff Initial creation.
*
* </pre>
*
* @author mpduff
* @version 1.0
*/
public class FFGVizGroupResource extends
AbstractVizResource<VizGroupResourceData, MapDescriptor> implements
IResourceDataChanged, IRefreshListener {
private final String NO_DATA = "No Data";
/**
* Constructor.
*
* @param resourceData
* @param loadProperties
*/
protected FFGVizGroupResource(VizGroupResourceData resourceData,
LoadProperties loadProperties) {
super(resourceData, loadProperties);
dataTimes = new ArrayList<DataTime>();
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#disposeInternal()
*/
@Override
protected void disposeInternal() {
for (ResourcePair rp : this.resourceData.getResourceList()) {
if (rp.getResource() != null) {
rp.getResource().dispose();
}
}
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.rsc.AbstractVizResource#paintInternal(com.raytheon
* .uf.viz.core.IGraphicsTarget,
* com.raytheon.uf.viz.core.drawables.PaintProperties)
*/
@Override
protected void paintInternal(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
for (ResourcePair rp : this.resourceData.getResourceList()) {
if (rp.getResource() != null) {
rp.getResource().paint(target, paintProps);
}
}
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.rsc.AbstractVizResource#inspect(com.raytheon
* .uf.common.geospatial.ReferencedCoordinate)
*/
@Override
public String inspect(ReferencedCoordinate coord) throws VizException {
ResourceList rl = resourceData.getResourceList();
String value = "No Data";
for (ResourcePair pair : rl) {
if (pair.getResource() != null) {
AbstractVizResource<?,?> rsc = pair.getResource();
value = rsc.inspect(coord);
if (!value.equals(NO_DATA)) {
return value;
}
}
}
return value;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.rsc.AbstractVizResource#interrogate(com.raytheon
* .uf.common.geospatial.ReferencedCoordinate)
*/
@Override
public Map<String, Object> interrogate(ReferencedCoordinate coord)
throws VizException {
// TODO Auto-generated method stub
return super.interrogate(coord);
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.rsc.AbstractVizResource#initInternal(com.raytheon
* .uf.viz.core.IGraphicsTarget)
*/
@Override
protected void initInternal(IGraphicsTarget target) throws VizException {
for (AbstractVizResource<?, ?> resource : resourceData.getRscs()) {
if (resource != null) {
resource.init(target);
resource.registerListener(this);
}
}
// If child resources have capabilities that this does not, steal them
for (AbstractVizResource<?, ?> rcs : getResourceData().getRscs()) {
for (AbstractCapability capability : rcs.getCapabilities()
.getCapabilityClassCollection()) {
this.getCapabilities().addCapability(capability);
capability.setResourceData(resourceData);
}
}
// Spread my master capability set to all my children
for (AbstractCapability capability : getCapabilities()
.getCapabilityClassCollection()) {
for (AbstractVizResource<?, ?> rcs : getResourceData().getRscs()) {
rcs.getCapabilities().addCapability(capability);
}
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.rsc.IRefreshListener#refresh()
*/
@Override
public void refresh() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.rsc.IResourceDataChanged#resourceChanged(com
* .raytheon.uf.viz.core.rsc.IResourceDataChanged.ChangeType,
* java.lang.Object)
*/
@Override
public void resourceChanged(ChangeType type, Object object) {
// TODO Auto-generated method stub
}
}

View file

@ -19,9 +19,10 @@
**/ **/
package com.raytheon.viz.grid.rsc; package com.raytheon.viz.grid.rsc;
import javax.measure.unit.Unit;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability;
import com.raytheon.viz.core.rsc.VizGroupResource;
import com.raytheon.viz.core.rsc.VizGroupResourceData; import com.raytheon.viz.core.rsc.VizGroupResourceData;
/** /**
@ -34,6 +35,7 @@ import com.raytheon.viz.core.rsc.VizGroupResourceData;
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Jan 29, 2011 mpduff Initial creation * Jan 29, 2011 mpduff Initial creation
* Sep 19, 2012 1162 mpudff Protect against null pointer
* *
* </pre> * </pre>
* *
@ -54,8 +56,12 @@ public class FfgGridNameGenerator extends GridNameGenerator {
*/ */
@Override @Override
public String getName(AbstractVizResource<?, ?> absResource) { public String getName(AbstractVizResource<?, ?> absResource) {
String unit = ((VizGroupResource) absResource).getCapability(ColorMapCapability.class).getColorMapParameters().getDisplayUnit().toString(); Unit<?> unitObj = ((FFGVizGroupResource) absResource).getCapability(ColorMapCapability.class).getColorMapParameters().getDisplayUnit();
return ((VizGroupResourceData) absResource.getResourceData()).getName() + "(" + unit + ")"; if (unitObj != null) {
return ((VizGroupResourceData) absResource.getResourceData()).getName() + "(" + unitObj.toString() + ")";
}
return ((VizGroupResourceData) absResource.getResourceData()).getName();
} }
} }

View file

@ -28,10 +28,13 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.drawables.ResourcePair;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData; import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.viz.core.rsc.VizGroupResourceData; import com.raytheon.viz.core.rsc.VizGroupResourceData;
@ -85,4 +88,11 @@ public class FfgVizGroupResourceData extends VizGroupResourceData {
return availableTimes.toArray(new DataTime[availableTimes.size()]); return availableTimes.toArray(new DataTime[availableTimes.size()]);
} }
@Override
protected AbstractVizResource<?, ?> constructResource(
LoadProperties loadProperties, PluginDataObject[] objects)
throws VizException {
return new FFGVizGroupResource(this, loadProperties);
}
} }

View file

@ -112,6 +112,7 @@ import com.raytheon.viz.core.rsc.hdf5.AbstractTileSet;
import com.raytheon.viz.core.rsc.hdf5.MemoryBasedTileSet; import com.raytheon.viz.core.rsc.hdf5.MemoryBasedTileSet;
import com.raytheon.viz.core.style.image.ImagePreferences; import com.raytheon.viz.core.style.image.ImagePreferences;
import com.raytheon.viz.grid.GridLevelTranslator; import com.raytheon.viz.grid.GridLevelTranslator;
import com.raytheon.viz.grid.record.RequestableDataRecord;
import com.raytheon.viz.grid.rsc.GridNameGenerator.IGridNameResource; import com.raytheon.viz.grid.rsc.GridNameGenerator.IGridNameResource;
import com.raytheon.viz.grid.rsc.GridNameGenerator.LegendParameters; import com.raytheon.viz.grid.rsc.GridNameGenerator.LegendParameters;
import com.raytheon.viz.grid.xml.FieldDisplayTypesFactory; import com.raytheon.viz.grid.xml.FieldDisplayTypesFactory;
@ -139,7 +140,8 @@ import com.vividsolutions.jts.io.WKTReader;
* 06/19/2012 14988 D. Friedman Choose interpolation method based on * 06/19/2012 14988 D. Friedman Choose interpolation method based on
* ImagingCapability.isInterpolationState(). * ImagingCapability.isInterpolationState().
* Oversample reprojected grids. * Oversample reprojected grids.
* * 09/20/2012 15394 mpduff Condense the PDOs based on grid version.
* Get DataTime from paintProps.
* </pre> * </pre>
* *
* @author chammack * @author chammack
@ -540,7 +542,7 @@ public class GridResource extends
} }
private class DataRetrievalJob extends Job { private class DataRetrievalJob extends Job {
private ConcurrentLinkedQueue<GridMemoryBasedTileSet> tilesToRetrieve = new ConcurrentLinkedQueue<GridMemoryBasedTileSet>(); private final ConcurrentLinkedQueue<GridMemoryBasedTileSet> tilesToRetrieve = new ConcurrentLinkedQueue<GridMemoryBasedTileSet>();
public DataRetrievalJob() { public DataRetrievalJob() {
super("Retrieving Gridded Data"); super("Retrieving Gridded Data");
@ -566,7 +568,7 @@ public class GridResource extends
} }
} }
private DataRetrievalJob dataRetriever = new DataRetrievalJob(); private final DataRetrievalJob dataRetriever = new DataRetrievalJob();
/** /**
* Constructor * Constructor
@ -807,6 +809,7 @@ public class GridResource extends
this.target = target; this.target = target;
if (pdosToParse.size() > 0) { if (pdosToParse.size() > 0) {
condensePDOs();
for (PluginDataObject pdo : pdosToParse) { for (PluginDataObject pdo : pdosToParse) {
createTile(pdo); createTile(pdo);
} }
@ -893,6 +896,68 @@ public class GridResource extends
} }
} }
/**
* Condense the PDOs to one pdo per level per DataTime based on
* the gridVersion.
*/
private void condensePDOs() {
Map<DataTime, Map<String, List<PluginDataObject>>> dateMap = new HashMap<DataTime, Map<String, List<PluginDataObject>>>();
List<PluginDataObject> newList = new ArrayList<PluginDataObject>();
for (PluginDataObject pdo : pdosToParse) {
if (pdo instanceof RequestableDataRecord) {
String level = null;
if (!dateMap.containsKey(pdo.getDataTime())) {
Map<String, List<PluginDataObject>> levelMap = new HashMap<String, List<PluginDataObject>>();
RequestableDataRecord rdr = (RequestableDataRecord) pdo;
level = rdr.getModelInfo().getLevel().getLevelInfo();
levelMap.put(level, new ArrayList<PluginDataObject>());
dateMap.put(pdo.getDataTime(), levelMap);
}
Map<String, List<PluginDataObject>> levelsMap = dateMap.get(pdo
.getDataTime());
String lvl = ((RequestableDataRecord) pdo).getModelInfo()
.getLevelInfo();
if (!levelsMap.containsKey(lvl)) {
levelsMap.put(lvl, new ArrayList<PluginDataObject>());
}
levelsMap.get(lvl).add(pdo);
}
}
// loop over each date
for (DataTime time : dateMap.keySet()) {
Map<String, List<PluginDataObject>> levelMap = dateMap.get(time);
// loop over each level
for (String key : levelMap.keySet()) {
List<PluginDataObject> pdos = levelMap.get(key);
PluginDataObject maxVersionedPdo = null;
int maxVersion = -1;
// loop over all the pdos for this level
for (PluginDataObject pdo : pdos) {
RequestableDataRecord rdr = (RequestableDataRecord) pdo;
int version = ((GribRecord) rdr).getGridVersion();
if (version > maxVersion) {
maxVersion = version;
maxVersionedPdo = pdo;
}
}
newList.add(maxVersionedPdo);
}
}
if (!newList.isEmpty()) {
pdosToParse.clear();
pdosToParse.addAll(newList);
}
}
/** /**
* Combine the given tiles sets * Combine the given tiles sets
* *
@ -1202,7 +1267,7 @@ public class GridResource extends
PaintProperties paintProps) throws VizException { PaintProperties paintProps) throws VizException {
this.target = target; this.target = target;
DataTime time = descriptor.getFramesInfo().getTimeForResource(this); DataTime time = paintProps.getDataTime();
Map<Float, GridMemoryBasedTileSet> tileGroup = tileSet.get(time); Map<Float, GridMemoryBasedTileSet> tileGroup = tileSet.get(time);
if (tileGroup == null) { if (tileGroup == null) {
return; return;
@ -1520,9 +1585,10 @@ public class GridResource extends
if (object instanceof ImagingCapability) { if (object instanceof ImagingCapability) {
// TODO: check if interpolation state really changed // TODO: check if interpolation state really changed
try { try {
if (descriptor != null) if (descriptor != null) {
project(descriptor.getGridGeometry() project(descriptor.getGridGeometry()
.getCoordinateReferenceSystem()); .getCoordinateReferenceSystem());
}
} catch (VizException e) { } catch (VizException e) {
statusHandler.handle(Priority.PROBLEM, statusHandler.handle(Priority.PROBLEM,
"Error updating grid resource imaging", e); "Error updating grid resource imaging", e);