Omaha #4709 Initial implementation of viz point set resources.

Former-commit-id: 3c8d0990c2eb1f031b23d7c0c5accd92af3196f0
This commit is contained in:
Ben Steffensmeier 2015-08-28 13:42:03 -05:00
parent c99eeea94f
commit 0cb0471380
15 changed files with 1140 additions and 1 deletions

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.raytheon.uf.viz.pointset</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,20 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: PointSet Visualization
Bundle-SymbolicName: com.raytheon.uf.viz.pointset;singleton:=true
Bundle-Version: 1.15.0.qualifier
Bundle-Vendor: RAYTHEON
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Require-Bundle: com.raytheon.uf.common.dataplugin.pointset;bundle-version="1.15.0",
com.raytheon.uf.viz.core;bundle-version="1.15.1",
com.raytheon.uf.common.dataplugin;bundle-version="1.14.0",
com.raytheon.uf.common.geospatial;bundle-version="1.15.0",
com.raytheon.uf.viz.productbrowser.datalisting;bundle-version="1.15.0",
com.raytheon.uf.common.datastorage;bundle-version="1.15.0",
com.raytheon.uf.common.colormap;bundle-version="1.15.0",
org.eclipse.core.runtime;bundle-version="3.8.0",
com.raytheon.uf.viz.drawables.triangulated;bundle-version="1.15.0",
com.raytheon.uf.common.style;bundle-version="1.15.0",
javax.measure;bundle-version="1.0.0",
com.raytheon.uf.common.numeric;bundle-version="1.14.0",
com.raytheon.uf.common.util;bundle-version="1.15.0"

View file

@ -0,0 +1,5 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="com.raytheon.uf.viz.productbrowser.dataDefinition">
<dataDefinition
class="com.raytheon.uf.viz.pointset.PointSetProductBrowserDataDefinition"
name="com.raytheon.uf.viz.pointset.PointSetProductBrowserDataDefinition">
</dataDefinition>
</extension>
</plugin>

View file

@ -0,0 +1,178 @@
/**
* 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.uf.viz.pointset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.raytheon.uf.common.datalisting.DataListing;
import com.raytheon.uf.common.datalisting.impl.DefaultDataListing;
import com.raytheon.uf.common.dataplugin.level.Level;
import com.raytheon.uf.common.dataplugin.level.LevelFactory;
import com.raytheon.uf.common.dataplugin.level.MasterLevel;
import com.raytheon.uf.common.dataplugin.pointset.PointSetConstants;
import com.raytheon.uf.common.dataplugin.pointset.PointSetRecord;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.parameter.Parameter;
import com.raytheon.uf.common.parameter.lookup.ParameterLookup;
/**
*
* {@link DataListing} which can format several different pointset elements
* nicely.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------
* Aug 28, 2015 4709 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class PointSetDataListing extends DefaultDataListing {
public PointSetDataListing() throws ReflectiveOperationException {
super(PointSetRecord.class);
}
public PointSetDataListing(List<String> keySet) {
super(PointSetConstants.POINTSET, keySet);
}
public PointSetDataListing(Set<String> keySet) {
super(PointSetConstants.POINTSET, keySet);
}
@Override
public Map<String, RequestConstraint> getRequestConstraints(Map<String, String> keyVals) {
Map<String, RequestConstraint> constraints = super.getRequestConstraints(keyVals);
if (keyVals.containsKey(PointSetConstants.LEVEL_ID)) {
constraints.remove(PointSetConstants.LEVEL_ID);
/*
* Convert Level id to level one and level two values so that it is
* possible to update using a datauri.
*/
Level level = LevelFactory.getInstance().getLevel(
keyVals.get(PointSetConstants.LEVEL_ID));
constraints.put(PointSetConstants.LEVEL_ONE,
new RequestConstraint(level.getLevelOneValueAsString()));
constraints.put(PointSetConstants.LEVEL_TWO,
new RequestConstraint(level.getLevelTwoValueAsString()));
constraints.put(PointSetConstants.MASTER_LEVEL_NAME,
new RequestConstraint(
level.getMasterLevel().getName()));
}
return constraints;
}
@Override
protected Map<String, String> getFormattedValues(String key, Collection<String> values) {
if (PointSetConstants.PARAMETER_ABBREVIATION.equals(key)) {
Map<String, String> formatted = new LinkedHashMap<>();
ParameterLookup lookup = ParameterLookup.getInstance();
for (String value : values) {
Parameter p = lookup.getParameter(value);
if (p == null || p.getName().isEmpty()) {
formatted.put(value, value);
} else {
formatted.put(value, p.getName() + " (" + value + ")");
}
}
return sortByValue(formatted);
} else if (PointSetConstants.LEVEL_ID.equals(key)) {
List<Level> levels = new ArrayList<>(values.size());
LevelFactory lf = LevelFactory.getInstance();
for (String value : values) {
levels.add(lf.getLevel(value));
}
Collections.sort(levels, levelComparator);
Map<String, String> formatted = new LinkedHashMap<>();
for (Level level : levels) {
String levelName = level.toString().replace("_", "-");
levelName = levelName.replace(level.getMasterLevel().getName(), " " + level.getMasterLevel().getName());
formatted.put(Long.toString(level.getId()), levelName);
}
return formatted;
} else if (PointSetConstants.MASTER_LEVEL_NAME.equals(key)) {
Map<String, String> formatted = new LinkedHashMap<>();
LevelFactory lf = LevelFactory.getInstance();
for (String value : values) {
MasterLevel masterLevel = lf.getMasterLevel(value);
formatted.put(masterLevel.getName(), masterLevel.getDescription() + " (" + masterLevel.getName() + ")");
}
return sortByValue(formatted);
}
return super.getFormattedValues(key, values);
}
private static Map<String, String> sortByValue(Map<String, String> formattedMap) {
List<Entry<String, String>> entryList = new ArrayList<>(formattedMap.entrySet());
Collections.sort(entryList, sortByValueComparator);
Map<String, String> sortedMap = new LinkedHashMap<>();
for (Entry<String, String> entry : entryList) {
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
private static final Comparator<Entry<String, String>> sortByValueComparator = new Comparator<Entry<String, String>>() {
@Override
public int compare(Entry<String, String> o1, Entry<String, String> o2) {
int result = o1.getValue().compareTo(o2.getValue());
if (result != 0) {
return result;
}
return o1.getKey().compareTo(o2.getKey());
}
};
private static final Comparator<Level> levelComparator = new Comparator<Level>() {
@Override
public int compare(Level o1, Level o2) {
if (o1.isRangeLevel() == o2.isRangeLevel()) {
int val = Double.compare(o1.getLevelonevalue(), o2.getLevelonevalue());
if (val == 0) {
val = Double.compare(o1.getLeveltwovalue(), o2.getLeveltwovalue());
}
return val;
}
if (o1.isRangeLevel()) {
return 1;
} else {
return -1;
}
}
};
}

View file

@ -0,0 +1,69 @@
/**
* 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.uf.viz.pointset;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.raytheon.uf.common.dataplugin.pointset.PointSetConstants;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.viz.core.rsc.AbstractResourceData;
import com.raytheon.uf.viz.pointset.rsc.PointSetResourceData;
import com.raytheon.uf.viz.productbrowser.datalisting.DataListingProductBrowserDefinition;
/**
*
* Uses the {@link PointSetDataListing} to get metadata for a
* {@link PointSetResourceData}.
*
* <pre>
*
* SOFTWARE HISTORY
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------
* Aug 28, 2015 4709 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class PointSetProductBrowserDataDefinition extends DataListingProductBrowserDefinition {
public PointSetProductBrowserDataDefinition() {
super(new PointSetDataListing(
Arrays.asList(PointSetConstants.DATASET_ID,
PointSetConstants.PARAMETER_ABBREVIATION,
PointSetConstants.MASTER_LEVEL_NAME,
PointSetConstants.LEVEL_ID)));
}
@Override
protected AbstractResourceData createResourceData(Map<String, String> keyVals) {
PointSetResourceData resourceData = new PointSetResourceData();
Map<String, RequestConstraint> constraints = listing.getRequestConstraints(keyVals);
resourceData.setMetadataMap(new HashMap<>(constraints));
return resourceData;
}
}

View file

@ -0,0 +1,76 @@
/**
* 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.uf.viz.pointset.image;
import java.io.FileNotFoundException;
import java.nio.FloatBuffer;
import com.raytheon.uf.common.colormap.image.ColorMapData;
import com.raytheon.uf.common.dataplugin.pointset.PointSetRecord;
import com.raytheon.uf.common.datastorage.DataStoreFactory;
import com.raytheon.uf.common.datastorage.IDataStore;
import com.raytheon.uf.common.datastorage.Request;
import com.raytheon.uf.common.datastorage.StorageException;
import com.raytheon.uf.common.datastorage.records.IDataRecord;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback;
import com.raytheon.uf.viz.core.exception.VizException;
/**
* {@link IColorMapDataRetrievalCallback} implementation for loading point set
* data.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------
* Aug 28, 2015 4709 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class PointSetDataCallback implements
IColorMapDataRetrievalCallback {
private final PointSetRecord record;
public PointSetDataCallback(PointSetRecord record) {
this.record = record;
}
@Override
public ColorMapData getColorMapData() throws VizException {
IDataStore store = DataStoreFactory.getDataStore(record
.getStoragePath().toFile());
try {
IDataRecord record = store.retrieve(this.record.getDataURI(),
DataStoreFactory.DEF_DATASET_NAME, Request.ALL);
float[] data = (float[]) record.getDataObject();
return new ColorMapData(FloatBuffer.wrap(data),
new int[] { data.length });
} catch (StorageException | FileNotFoundException e) {
throw new VizException(e);
}
}
}

View file

@ -0,0 +1,127 @@
/**
* 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.uf.viz.pointset.image;
import java.io.FileNotFoundException;
import java.lang.ref.SoftReference;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.operation.TransformException;
import com.raytheon.uf.common.dataplugin.pointset.PointSetLocation;
import com.raytheon.uf.common.dataplugin.pointset.PointSetRecord;
import com.raytheon.uf.common.dataplugin.pointset.traingulate.DelauneyTriangulator;
import com.raytheon.uf.common.datastorage.StorageException;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.drawables.triangulated.ITriangleLocationCallback;
/**
* {@link IColorMapDataRetrievalCallback} implementation for loading point set
* location data.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------
* Aug 28, 2015 4709 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class PointSetLocationCallback implements
ITriangleLocationCallback {
private final IDescriptor descriptor;
private final PointSetRecord record;
/*
* Kept as soft reference becasue both methods from the interface need the
* location but after they are both called we probably won't need it again
* so let it get reclaimed when the memory is needed.
*/
private SoftReference<PointSetLocation> locationRef;
public PointSetLocationCallback(IDescriptor descriptor,
PointSetRecord record) {
this.descriptor = descriptor;
this.record = record;
}
protected PointSetLocation getLocation() throws VizException {
PointSetLocation location = null;
if (locationRef != null) {
location = locationRef.get();
}
if (location == null) {
try {
location = PointSetLocation.load(record.getStoragePath()
.toFile(), record.getLocationId());
} catch (FileNotFoundException | StorageException e) {
throw new VizException(e);
}
}
return location;
}
@Override
public double[][] getCoordinates() throws VizException {
PointSetLocation location = getLocation();
FloatBuffer longitude = location.getLongitudes().duplicate();
longitude.rewind();
FloatBuffer latitude = location.getLatitudes().duplicate();
latitude.rewind();
int numPoints = longitude.capacity();
double[][] coordinates = new double[numPoints][];
double[] in = new double[2];
for (int i = 0; i < numPoints; i += 1) {
in[0] = longitude.get();
in[1] = latitude.get();
coordinates[i] = descriptor.worldToPixel(in);
}
return coordinates;
}
@Override
public int[] getTriangleIndices() throws VizException {
PointSetLocation location = getLocation();
IntBuffer triangles = location.getTriangles();
if (triangles != null) {
return triangles.array();
}
try {
triangles = new DelauneyTriangulator(true)
.triangulate(location);
return triangles.array();
} catch (TransformException | FactoryException e) {
throw new VizException(e);
}
}
}

View file

@ -0,0 +1,127 @@
/**
* 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.uf.viz.pointset.rsc;
import com.raytheon.uf.common.colormap.prefs.ColorMapParameters;
import com.raytheon.uf.common.dataplugin.pointset.PointSetRecord;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability;
import com.raytheon.uf.viz.drawables.triangulated.ITriangulatedImage;
import com.raytheon.uf.viz.drawables.triangulated.ITriangulatedImageExtension;
import com.raytheon.uf.viz.pointset.image.PointSetDataCallback;
import com.raytheon.uf.viz.pointset.image.PointSetLocationCallback;
/**
* Object responsible for rendering a single frame of point set data.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------
* Aug 28, 2015 4709 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class PointSetFrame {
private static final transient IUFStatusHandler logger = UFStatus
.getHandler(PointSetFrame.class);
private final PointSetRecord record;
private final PointSetResource resource;
private ITriangulatedImage image;
private volatile boolean staged = false;
public PointSetFrame(PointSetRecord record, PointSetResource resource) {
super();
this.record = record;
this.resource = resource;
}
public PointSetRecord getRecord() {
return record;
}
/**
* Release any graphics resources associated with this image. This must not
* be called concurrently with paint.
*/
public void dispose() {
ITriangulatedImage image = this.image;
if (image != null) {
image.dispose();
}
image = null;
staged = false;
}
public String inspect(double x, double y) {
return image.getDataValue(x, y) + record.getParameter().getUnitString();
}
public boolean paint(PaintProperties paintProps, IGraphicsTarget target)
throws VizException {
ITriangulatedImage image = this.image;
if (image == null) {
ColorMapParameters colorMapParameters = resource.getCapability(
ColorMapCapability.class).getColorMapParameters();
ITriangulatedImageExtension triangleExt = target
.getExtension(ITriangulatedImageExtension.class);
this.image = triangleExt.initializeImage(colorMapParameters,
new PointSetLocationCallback(resource.getDescriptor(),
record), new PointSetDataCallback(record));
return false;
} else if (staged) {
ITriangulatedImageExtension triangleExt = target
.getExtension(ITriangulatedImageExtension.class);
triangleExt.drawImage(paintProps, image);
return true;
} else {
return false;
}
}
public void stage() {
ITriangulatedImage image = this.image;
if (image == null || staged) {
return;
}
try {
image.stage();
staged = true;
resource.issueRefresh();
} catch (VizException e) {
logger.error("Unable to stage point set data.", e);
}
}
}

View file

@ -0,0 +1,294 @@
/**
* 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.uf.viz.pointset.rsc;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.measure.unit.Unit;
import javax.measure.unit.UnitFormat;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.TransformException;
import com.raytheon.uf.common.colormap.ColorMapException;
import com.raytheon.uf.common.colormap.ColorMapLoader;
import com.raytheon.uf.common.colormap.image.ColorMapData;
import com.raytheon.uf.common.colormap.image.ColorMapData.ColorMapDataType;
import com.raytheon.uf.common.colormap.prefs.ColorMapParameters;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataplugin.pointset.PointSetRecord;
import com.raytheon.uf.common.geospatial.ReferencedCoordinate;
import com.raytheon.uf.common.numeric.UnsignedNumbers;
import com.raytheon.uf.common.style.ParamLevelMatchCriteria;
import com.raytheon.uf.common.style.StyleException;
import com.raytheon.uf.common.style.StyleManager;
import com.raytheon.uf.common.style.StyleManager.StyleType;
import com.raytheon.uf.common.style.StyleRule;
import com.raytheon.uf.common.style.image.ColorMapParameterFactory;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.util.BufferUtil;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.drawables.PaintStatus;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.map.IMapDescriptor;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.IResourceDataChanged.ChangeType;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability;
import com.raytheon.uf.viz.pointset.image.PointSetDataCallback;
import com.vividsolutions.jts.geom.Coordinate;
/**
* Resource for rendering {@link PointSetRecord} data.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------
* Aug 28, 2015 4709 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class PointSetResource extends
AbstractVizResource<PointSetResourceData, IMapDescriptor> {
private final PointSetStageJob stageJob = new PointSetStageJob();
private Map<DataTime, PointSetFrame> frames = new HashMap<>();
protected PointSetResource(PointSetResourceData resourceData,
LoadProperties loadProperties) {
super(resourceData, loadProperties);
this.dataTimes = new ArrayList<>();
}
@Override
protected void resourceDataChanged(ChangeType type, Object updateObject) {
if (type == ChangeType.DATA_UPDATE) {
for (PluginDataObject pdo : (PluginDataObject[]) updateObject) {
addRecord((PointSetRecord) pdo);
}
}
super.resourceDataChanged(type, updateObject);
}
public ColorMapParameters createColorMapParameters(PointSetRecord record)
throws VizException {
ParamLevelMatchCriteria matchCriteria = new ParamLevelMatchCriteria();
matchCriteria.setParameterName(Arrays.asList(record.getParameter()
.getAbbreviation()));
// TODO convert level to a style level.
//matchCriteria.setLevels(new ArrayList<Level>());
matchCriteria.setCreatingEntityNames(Arrays.asList(record
.getDatasetId()));
try {
StyleRule styleRule = StyleManager.getInstance().getStyleRule(
StyleType.IMAGERY, matchCriteria);
if (styleRule != null) {
return ColorMapParameterFactory.build(styleRule, record
.getParameter().getUnit());
} else {
ColorMapData data = new PointSetDataCallback(record)
.getColorMapData();
ColorMapDataType type = data.getDataType();
Buffer buffer = BufferUtil.duplicate(data.getBuffer());
buffer.rewind();
float min = Float.POSITIVE_INFINITY;
float max = Float.NEGATIVE_INFINITY;
while (buffer.hasRemaining()) {
float val = extractVal(type, buffer);
if (val < min) {
min = val;
}
if (val > max) {
max = val;
}
}
return ColorMapParameterFactory.build(min, max,
data.getDataUnit(), matchCriteria);
}
} catch (StyleException e) {
throw new VizException(e);
}
}
private float extractVal(ColorMapDataType type, Buffer buffer)
throws VizException {
switch (type) {
case SIGNED_BYTE:
return ((ByteBuffer) buffer).get();
case BYTE:
return UnsignedNumbers.ubyteToShort(((ByteBuffer) buffer).get());
case SHORT:
return ((ShortBuffer) buffer).get();
case UNSIGNED_SHORT:
return UnsignedNumbers.ushortToInt(((ShortBuffer) buffer).get());
case INT:
return ((IntBuffer) buffer).get();
case FLOAT:
return ((FloatBuffer) buffer).get();
case DOUBLE:
return (float) ((DoubleBuffer) buffer).get();
default:
throw new VizException("Unable to handle data of type: " + type);
}
}
public void addRecord(PointSetRecord record) {
synchronized (frames) {
if (frames.isEmpty() && getStatus() == ResourceStatus.INITIALIZED) {
try {
/*
* Normally this happens in init but this is a fallback if
* the resource was inited with no data.
*/
createColorMapParameters(record);
} catch (VizException e) {
statusHandler.error(
"Unable to create color map parameters.", e);
}
}
frames.put(record.getDataTime(), new PointSetFrame(record, this));
dataTimes.add(record.getDataTime());
Collections.sort(dataTimes);
}
}
@Override
public void remove(DataTime dataTime) {
synchronized (frames) {
PointSetFrame frame = frames.remove(dataTime);
frame.dispose();
super.remove(dataTime);
}
}
@Override
protected void disposeInternal() {
synchronized (frames) {
for (PointSetFrame frame : frames.values()) {
frame.dispose();
}
frames.clear();
}
}
@Override
protected void paintInternal(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
PointSetFrame frame = frames.get(paintProps.getDataTime());
if (frame == null) {
return;
}
boolean painted = frame.paint(paintProps, target);
if (!painted) {
stageJob.schedule(frame);
updatePaintStatus(PaintStatus.INCOMPLETE);
}
}
@Override
protected void initInternal(IGraphicsTarget target) throws VizException {
if (!frames.isEmpty()) {
ColorMapParameters colorMapParameters = createColorMapParameters(frames
.values().iterator().next().getRecord());
if (colorMapParameters.getColorMapName() == null) {
colorMapParameters.setColorMapName("Grid/gridded data");
}
try {
colorMapParameters.setColorMap(ColorMapLoader
.loadColorMap(colorMapParameters.getColorMapName()));
} catch (ColorMapException e) {
throw new VizException(e);
}
getCapability(ColorMapCapability.class).setColorMapParameters(
colorMapParameters);
}
}
@Override
public String getName() {
PointSetFrame frame = frames.get(descriptor.getTimeForResource(this));
if (frame == null) {
return "Point Set Data";
} else {
PointSetRecord record = frame.getRecord();
String unitStr = record.getParameter().getUnitString();
ColorMapParameters parameters = getCapability(
ColorMapCapability.class).getColorMapParameters();
if (parameters != null) {
Unit<?> unit = parameters.getDisplayUnit();
if (unit != null) {
unitStr = UnitFormat.getUCUMInstance().format(unit);
}
}
return frame.getRecord().getDatasetId() + " " + record.getLevel()
+ " " + record.getParameter().getName() + " (" + unitStr
+ ")";
}
}
@Override
public String inspect(ReferencedCoordinate coord) throws VizException {
PointSetFrame frame = frames.get(descriptor.getTimeForResource(this));
if (frame == null) {
return null;
} else {
try {
Coordinate ll = coord.asLatLon();
double[] pix = descriptor.worldToPixel(new double[] { ll.x,
ll.y });
return frame.inspect(pix[0], pix[1]);
} catch (FactoryException | TransformException e) {
throw new VizException(e);
}
}
}
@Override
public void project(CoordinateReferenceSystem crs) throws VizException {
synchronized (frames) {
for (PointSetFrame frame : frames.values()) {
frame.dispose();
}
}
}
}

View file

@ -0,0 +1,62 @@
/**
* 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.uf.viz.pointset.rsc;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataplugin.pointset.PointSetRecord;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
/**
* Resource data for creating {@link PointSetResource}s.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------
* Aug 28, 2015 4709 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@XmlAccessorType(XmlAccessType.NONE)
public class PointSetResourceData extends AbstractRequestableResourceData {
@Override
protected PointSetResource constructResource(
LoadProperties loadProperties, PluginDataObject[] objects)
throws VizException {
PointSetResource resource = new PointSetResource(this, loadProperties);
for (PluginDataObject object : objects) {
resource.addRecord((PointSetRecord) object);
}
return resource;
}
}

View file

@ -0,0 +1,71 @@
/**
* 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.uf.viz.pointset.rsc;
import java.util.Deque;
import java.util.concurrent.LinkedBlockingDeque;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
/**
* Stages point set frames in the background.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------
* Aug 28, 2015 4709 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class PointSetStageJob extends Job {
private Deque<PointSetFrame> frames = new LinkedBlockingDeque<>();
public PointSetStageJob() {
super("Staging PointSet data");
}
public void schedule(PointSetFrame frame) {
if (!frames.contains(frame)) {
frames.add(frame);
}
this.schedule();
}
@Override
protected IStatus run(IProgressMonitor monitor) {
PointSetFrame frame = frames.poll();
while (frame != null) {
frame.stage();
frame = frames.poll();
}
return Status.OK_STATUS;
}
}

View file

@ -0,0 +1,63 @@
/**
* 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.uf.common.dataplugin.pointset;
/**
*
* Contains some useful constants for dealing with point set data, mostly just
* hibernate names of attributes.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------
* Aug 28, 2015 4709 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class PointSetConstants {
public static final String POINTSET = "pointset";
public static final String DATASET_ID = "datasetId";
public static final String PARAMETER = "parameter";
public static final String PARAMETER_ABBREVIATION = PARAMETER
+ ".abbreviation";
public static final String PARAMETER_NAME = PARAMETER + ".name";
public static final String LEVEL = "level";
public static final String LEVEL_ID = LEVEL + ".id";
public static final String MASTER_LEVEL_NAME = LEVEL + ".masterLevel.name";
public static final String LEVEL_ONE = LEVEL + ".levelonevalue";
public static final String LEVEL_TWO = LEVEL + ".leveltwovalue";
}

View file

@ -144,7 +144,7 @@ public class PointSetRecord extends PersistablePluginDataObject {
@Override
public String getPluginName() {
return "pointset";
return PointSetConstants.POINTSET;
}
}