Omaha #4903 Create more efficient rendering of plot winds.

Former-commit-id: b6de70194699733881023b84dc4c232c9482c5b9
This commit is contained in:
Ben Steffensmeier 2015-11-16 10:50:39 -06:00
parent acc931788c
commit 34f7c7e7cc
28 changed files with 2412 additions and 956 deletions

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Pointdata Plug-in
Bundle-SymbolicName: com.raytheon.viz.pointdata;singleton:=true
Bundle-Version: 1.15.0.qualifier
Bundle-Version: 1.15.1.qualifier
Bundle-Vendor: Raytheon
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.7

View file

@ -1,155 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<bundle>
<displayList>
<displays xsi:type="d2DMapRenderableDisplay"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#bfbfbf"/>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${legend} Scatterometer Winds missing"
plotModelFile="${svg}" pixelSizeHint="25"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true"
lowerLimit="-10000.0" upperLimit="-9998.0" plotMissingData="true">
<binOffset posOffset="${posOffset}" negOffset="${negOffset}" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
<mapping key="windSpd">
<!-- -1.1 to 0.0 converted from knots to m/s -->
<constraint constraintValue="-2.1382--0.0" constraintType="BETWEEN" />
</mapping>
</metadataMap>
<timeQueryMetadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
</timeQueryMetadataMap>
<plotInfoRetriever xsi:type="scatterometerPlotInfoRetriever" />
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#00ff00"/>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${legend} Scatterometer Wind s &lt; 34 kts"
plotModelFile="${svg}" pixelSizeHint="25"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="${posOffset}" negOffset="${negOffset}" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
<mapping key="windSpd">
<!-- 0.0 to 34.0 converted from knots to m/s -->
<constraint constraintValue="0.0--17.49" constraintType="BETWEEN" />
</mapping>
</metadataMap>
<timeQueryMetadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
</timeQueryMetadataMap>
<plotInfoRetriever xsi:type="scatterometerPlotInfoRetriever" />
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#ffff00"/>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${legend} Scatterometer Wind 34 &lt;= s &lt; 48 kts"
plotModelFile="${svg}" pixelSizeHint="25"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="${posOffset}" negOffset="${negOffset}" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
<mapping key="windSpd">
<!-- 34.0 to 48.0 converted from knots to m/s -->
<constraint constraintValue="17.49--24.69" constraintType="BETWEEN" />
</mapping>
</metadataMap>
<timeQueryMetadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
</timeQueryMetadataMap>
<plotInfoRetriever xsi:type="scatterometerPlotInfoRetriever" />
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#ff0000"/>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${legend} Scatterometer Wind s >= 48 kts"
plotModelFile="${svg}" pixelSizeHint="25"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true"
plotMissingData="true">
<binOffset posOffset="${posOffset}" negOffset="${negOffset}" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
<mapping key="windSpd">
<!-- 48.0.0 to 999.0 converted from knots to m/s -->
<constraint constraintValue="24.69--513.93" constraintType="BETWEEN" />
</mapping>
</metadataMap>
<timeQueryMetadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
</timeQueryMetadataMap>
<plotInfoRetriever xsi:type="scatterometerPlotInfoRetriever" />
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
</bundle>

View file

@ -21,6 +21,7 @@ package com.raytheon.viz.pointdata.rsc;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@ -75,6 +76,8 @@ import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability;
import com.raytheon.uf.viz.core.rsc.capabilities.DensityCapability;
import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability;
import com.raytheon.viz.pointdata.rsc.progdisc.GenericProgressiveDisclosure;
import com.raytheon.viz.pointdata.rsc.progdisc.GenericProgressiveDisclosure.PlotItem;
import com.raytheon.viz.pointdata.util.MetarPrecipDataContainer;
import com.raytheon.viz.pointdata.util.MetarPrecipDataContainer.PrecipData;
import com.vividsolutions.jts.geom.Coordinate;
@ -90,13 +93,14 @@ import com.vividsolutions.jts.geom.Coordinate;
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 19, 2011 bsteffen Initial creation
* Jun 07, 2013 2070 bsteffen Add geospatial constraints to metar
* precip requests.
* Mar 11, 2014 #2718 randerso Changes for GeoTools 10.5
* Date Ticket# Engineer Description
* ------------- -------- --------- --------------------------------------------
* Aug 19, 2011 7725 bsteffen Initial creation
* Jun 07, 2013 2070 bsteffen Add geospatial constraints to metar precip
* requests.
* Mar 11, 2014 2718 randerso Changes for GeoTools 10.5
* Nov 05, 2015 5070 randerso Adjust font sizes for dpi scaling
* Nov 13, 2015 4903 bsteffen Extract progressive disclosure
*
* </pre>
*
@ -110,15 +114,19 @@ public class MetarPrecipResource extends
private static final int PLOT_PIXEL_SIZE = 30;
private class RenderablePrecipData extends PrecipData {
private class RenderablePrecipData extends PrecipData implements PlotItem {
Double distValue = 0.0;
public final DrawableString string;
DrawableString string = null;
public RenderablePrecipData(PrecipData data) {
public RenderablePrecipData(PrecipData data, DrawableString string) {
super(data.getTimeObs(), data.getStationName(),
data.getPrecipAmt(), data.getLatLon().x, data.getLatLon().y);
this.string = string;
}
@Override
public Coordinate getLocation() {
return new Coordinate(string.basics.x, string.basics.y);
}
}
@ -150,7 +158,7 @@ public class MetarPrecipResource extends
private boolean reproject = false;
private Map<DataTime, List<RenderablePrecipData>> data = new HashMap<DataTime, List<RenderablePrecipData>>();
private Map<DataTime, GenericProgressiveDisclosure<RenderablePrecipData>> data = new HashMap<>();
private IFont font = null;
@ -176,19 +184,27 @@ public class MetarPrecipResource extends
if (time == null) {
return;
}
List<RenderablePrecipData> precips = getPrecipData(time);
if (precips == null) {
GenericProgressiveDisclosure<RenderablePrecipData> disclosure = null;
synchronized (data) {
disclosure = data.get(time);
}
if (disclosure == null) {
dataProcessJob.schedule();
return;
}
if (precips.isEmpty()) {
return;
}
RGB color = getCapability(ColorableCapability.class).getColor();
IExtent extent = paintProps.getView().getExtent();
Double magnification = getCapability(MagnificationCapability.class)
.getMagnification();
Double density = getCapability(DensityCapability.class).getDensity();
double threshold = (PLOT_PIXEL_SIZE * magnification) / density;
threshold = (threshold * extent.getWidth())
/ paintProps.getCanvasBounds().width;
Collection<RenderablePrecipData> precips = disclosure.runDisclosure(
extent, threshold);
if (precips.isEmpty()) {
return;
}
RGB color = getCapability(ColorableCapability.class).getColor();
if (font == null) {
font = target.initializeFont(Font.DIALOG, 8,
@ -198,37 +214,23 @@ public class MetarPrecipResource extends
List<DrawableString> strings = new ArrayList<DrawableString>();
IExtent extent = paintProps.getView().getExtent();
double threshold = (PLOT_PIXEL_SIZE * magnification) / density;
threshold = (threshold * extent.getWidth())
/ paintProps.getCanvasBounds().width;
for (RenderablePrecipData data : precips) {
if (!extent.contains(new double[] { data.string.basics.x,
data.string.basics.y })) {
continue;
}
if (data.distValue >= threshold) {
// This is easier then changing it when the capability changes.
data.string.font = this.font;
data.string.setText(data.string.getText(), color);
strings.add(data.string);
}
// This is easier then changing it when the capability changes.
data.string.font = this.font;
data.string.setText(data.string.getText(), color);
strings.add(data.string);
}
target.drawStrings(strings);
}
private List<RenderablePrecipData> getPrecipData(DataTime time) {
List<RenderablePrecipData> currData = null;
GenericProgressiveDisclosure<RenderablePrecipData> currData = null;
synchronized (data) {
currData = data.get(time);
}
if (currData != null) {
synchronized (currData) {
return new ArrayList<RenderablePrecipData>(currData);
}
return currData.getAll();
}
return null;
}
@ -336,7 +338,9 @@ public class MetarPrecipResource extends
GridEnvelope2D envelope = GridGeometry2D.wrap(
descriptor.getGridGeometry()).getGridRange2D();
synchronized (data) {
for (List<RenderablePrecipData> dataList : data.values()) {
for (GenericProgressiveDisclosure<RenderablePrecipData> disclosure : data
.values()) {
List<RenderablePrecipData> dataList = disclosure.getAll();
Iterator<RenderablePrecipData> it = dataList.iterator();
while (it.hasNext()) {
RenderablePrecipData precip = it.next();
@ -425,22 +429,20 @@ public class MetarPrecipResource extends
rcMap.put("location.stationId", rc);
MetarPrecipDataContainer container = new MetarPrecipDataContainer(
resourceData.getDuration(), rcMap);
for (Entry<DataTime, List<RenderablePrecipData>> entry : data
for (Entry<DataTime, GenericProgressiveDisclosure<RenderablePrecipData>> entry : data
.entrySet()) {
DataTime time = entry.getKey();
if (time.getMatchValid() < earliestTime) {
// No need to reprocess times after the earliest update.
continue;
}
synchronized (entry.getValue()) {
Iterator<RenderablePrecipData> iter = entry.getValue()
.iterator();
while (iter.hasNext()) {
if (newStations.contains(iter.next().getStationName())) {
iter.remove();
}
GenericProgressiveDisclosure<RenderablePrecipData> newValue = new GenericProgressiveDisclosure<>();
for (RenderablePrecipData data : entry.getValue().getAll()) {
if (!newStations.contains(data.getStationName())) {
newValue.add(data);
}
}
entry.setValue(newValue);
addData(time, container.getBasePrecipData(time));
addData(time, container.getDerivedPrecipData(time));
if (monitor.isCanceled()) {
@ -523,10 +525,9 @@ public class MetarPrecipResource extends
private void addData(DataTime time, List<PrecipData> precips) {
if (precips.isEmpty()) {
if (!dataTimes.contains(time)) {
GenericProgressiveDisclosure<RenderablePrecipData> disclosure = new GenericProgressiveDisclosure<RenderablePrecipData>();
synchronized (data) {
List<RenderablePrecipData> newPrecips = Collections
.emptyList();
data.put(time, newPrecips);
data.put(time, disclosure);
}
dataTimes.add(time);
}
@ -544,8 +545,7 @@ public class MetarPrecipResource extends
});
List<RenderablePrecipData> newPrecips = new ArrayList<RenderablePrecipData>(
precips.size());
GenericProgressiveDisclosure<RenderablePrecipData> newPrecips = new GenericProgressiveDisclosure<RenderablePrecipData>();
RGB color = getCapability(ColorableCapability.class).getColor();
@ -558,32 +558,19 @@ public class MetarPrecipResource extends
if (precip instanceof RenderablePrecipData) {
data = (RenderablePrecipData) precip;
} else {
data = new RenderablePrecipData(precip);
double[] px = descriptor.worldToPixel(new double[] {
precip.getLatLon().x, precip.getLatLon().y });
if (!envelope.contains(px[0], px[1])) {
continue;
}
data.string = new DrawableString(formatPrecip(precips.get(i)
.getPrecipAmt()), color);
data.string.setCoordinates(px[0], px[1], px[2]);
data.string.verticallAlignment = VerticalAlignment.MIDDLE;
data.string.horizontalAlignment = HorizontalAlignment.CENTER;
}
double bestDist = Double.MAX_VALUE;
for (RenderablePrecipData exist : newPrecips) {
double xDist = exist.string.basics.x - data.string.basics.x;
double yDist = exist.string.basics.y - data.string.basics.y;
double dist = Math.hypot(xDist, yDist);
if (dist < bestDist) {
bestDist = dist;
}
}
data.distValue = bestDist;
// this checks removes duplicates
if (bestDist > 0) {
newPrecips.add(data);
DrawableString string = new DrawableString(formatPrecip(precips
.get(i).getPrecipAmt()), color);
string.setCoordinates(px[0], px[1], px[2]);
string.verticallAlignment = VerticalAlignment.MIDDLE;
string.horizontalAlignment = HorizontalAlignment.CENTER;
data = new RenderablePrecipData(precip, string);
}
newPrecips.add(data);
}
synchronized (data) {
data.put(time, newPrecips);

View file

@ -0,0 +1,361 @@
/**
* 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.pointdata.rsc.progdisc;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import com.raytheon.uf.viz.core.IExtent;
import com.raytheon.viz.pointdata.rsc.progdisc.GenericProgressiveDisclosure.PlotItem;
import com.vividsolutions.jts.geom.Coordinate;
/**
* A generic progressive disclosure algorithm that will determine a subset of
* {@link PlotItem}s that should be displayed given a particular {@link IExtent}
* and the desired distance between plot items. The exact disclosure for a set
* of items can be weighted by adding the items in a specific order. In general
* the items that are added first will displayed sooner than those added later.
* For example if you were displaying cities, then sorting the cities by
* population before adding would result in large cities being displayed before
* small cities.
* <p>
* This class was designed to scale well for any number of points. To achieve
* this it uses a combination of two distinct algorithms with different
* performance characteristics:
* <ol>
* <li>The <b>static algorithm</b>: When a new item is inserted using this
* algorithm then the position is compared to all the existing items to
* determine the distance from the closest item. When disclosure is run it is
* simply a loop over the items to find any with a large enough distance value.
* This has Θ(n²) insertion time, Θ(n) disclosure time.
* <li>The <b>dynamic algorithm</b>: When a new item is inserted using this
* algorithm it is simply appended to the list of items. When disclosure is run
* then each item is compared to any other displayed items to see if it fits
* into the display without getting to close. This has Θ(1) insertion time,
* Θ(n*m) disclosure time(m is the number of items actually displayed).
* <p>
* The static algorithm is much better for performance if the disclosure is
* going to be reused since it has a much faster disclosure time. However the
* longer insertion time can be a problem for more than 5000-10000 items.
* <p>
* Besides raw performance, a major consideration between the two algorithms is
* that the dynamic algorithm suffers from inconsistent disclosure that can
* cause a flickering artifact as the extent changes. For example if you zoom in
* on a display then sometimes there is enough room to replace a single item
* with two items that are spread further apart, however if those items are too
* close to other items then they may be removed and replaced with items
* slightly further away. A very small change to the extent leads to a very big
* change in the set of items displayed which is generally unpleasant for users.
* <p>
* There are two tweaks to the dynamic algorithm that help mitigate the flicker.
* <ol>
* <li>First, when the dynamic algorithm is used it caches the disclosed items
* and tries to disclose the same items across multiple calls, before
* considering new items. This helps immensely because as the extent changes
* only minimal changes are made to the set of disclosed items. There can still
* be a problem if you zoom in on an area and zoom back out, the extra items
* introduced by zooming in can significantly change the result when zooming
* out. Although this effect is much more gradual than a flicker, it is still
* annoying when there is a specific item of interest that disappears
* unexpectedly.
* <li>Secondly, pure dynamic disclosure is never used, instead a hybrid of
* dynamic/static is always used. For the first few thousand items the insertion
* cost for the static algorithm is very low so using a static algorithm for a
* certain number of points is beneficial. The static items can be quickly
* disclosed before adding in the dynamic points and they act like anchor points
* that help keep the dynamic algorithm more consistent.
* <p>
* The hybrid approach provides a balance between getting something to display
* quickly and keeping the disclosure consistent. If the disclosure is going to
* be used for awhile it may be worthwhile to use the static disclosure more. It
* is possible to asynchronously calculate the static values so that as soon as
* possible the disclosure will be completely consistent(
* {@link #calculateStaticDistances()}.
* <p>
* This class uses internal synchronization to make it safe to use from multiple
* threads. When properly configured all function calls will be very fast so
* there should not be significant waiting.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- -----------------
* Nov 12, 2015 4903 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
* @param <T>
*/
public class GenericProgressiveDisclosure<T extends PlotItem> {
private final int staticToDynamicThreshold;
private AtomicInteger waitingTasks = new AtomicInteger(0);
private int staticCount = 0;
private List<ItemInfo<T>> items = new ArrayList<>();
private List<ItemInfo<T>> prevItems = Collections.emptyList();
public GenericProgressiveDisclosure() {
this(5000);
}
/**
* Construct a new instance with a specific threshold for switching between
* the two disclosure algorithms. Its usually best to keep the number
* relatively small and use {@link #calculateStaticDistances()}
* asynchronously to ensure that that
* {@link #runDisclosure(IExtent, double)} does not have to wait for slow
* calls to {@link #add(PlotItem)}.
*
* @param staticToDynamicThreshold
* the number of items that should calculate static distance
* values before switching to dynamic calculations.
*/
public GenericProgressiveDisclosure(int staticToDynamicThreshold) {
this.staticToDynamicThreshold = staticToDynamicThreshold;
}
/**
* @return all the {@link PlotItem}s contained in this disclosure.
*/
public List<T> getAll() {
ArrayList<T> all = new ArrayList<>();
waitingTasks.incrementAndGet();
synchronized (items) {
all.ensureCapacity(items.size());
for (ItemInfo<T> info : items) {
all.add(info.getItem());
}
}
waitingTasks.decrementAndGet();
return all;
}
/**
* Get a set of items that are all within extent and are not closer together
* than minDistance.
*
* @param extent
* area whcich will contain all items returned
* @param minDistance
* the minimum distance between any two disclosed items, no two
* items returned will be closer than this.
* @return items
*/
public Collection<T> runDisclosure(IExtent extent, double minDistance) {
List<ItemInfo<T>> items = new ArrayList<>();
Set<T> result = new HashSet<>(100);
waitingTasks.incrementAndGet();
synchronized (this.items) {
for (ItemInfo<T> item : getStaticItems()) {
if (item.getDistance() > minDistance && item.within(extent)) {
result.add(item.getItem());
items.add(item);
}
}
if (staticCount < this.items.size()) {
for (ItemInfo<T> item : this.prevItems) {
if (!item.hasDistance() && item.within(extent)
&& getMinDistance(items, item) > minDistance) {
if (result.add(item.getItem())) {
items.add(item);
}
}
}
for (ItemInfo<T> item : getDynamicItems()) {
if (item.within(extent)
&& getMinDistance(items, item) > minDistance) {
if (result.add(item.getItem())) {
items.add(item);
}
}
}
this.prevItems = items;
}
}
waitingTasks.decrementAndGet();
return result;
}
/**
* Add a new item that can be disclosed. This will not do any aggressive
* duplicate checking.
*/
public double add(T item) {
return add(item, false);
}
/**
* Add a new item that can be disclosed.
*
* @param item
* the item to add
* @param checkDuplicate
* when this is true then the item will be checked against all
* existing items and ignored if it is in a location that is
* already used. This slows down the method so if you are
* reasonably certain there are no duplicates its better to use
* false.
* @return The static distance between the new item and the next closest
* item, or NaN if there are too many items for static calculations.
*/
public double add(T item, boolean checkDuplicate) {
ItemInfo<T> info = new ItemInfo<>(item);
waitingTasks.incrementAndGet();
synchronized (items) {
if (items.size() < staticToDynamicThreshold) {
double distance = getMinDistance(items, info);
info.setDistance(distance);
staticCount += 1;
} else if (checkDuplicate) {
for (ItemInfo<T> itemToCheck : items) {
if (itemToCheck.getItem().getLocation()
.equals(item.getLocation())) {
info.setDistance(0);
break;
}
}
}
if (!info.hasDistance() || info.getDistance() > 0) {
items.add(info);
}
}
waitingTasks.decrementAndGet();
return info.getDistance();
}
/**
* Convert any items within the disclosure that are using the dynamic
* algorithm to be able to use the static algorithm. This will result in
* more consistent disclosure and faster execution of
* {@link #runDisclosure(IExtent, double)}. If there are alot of items this
* method can be slow and should not be run on a thread that is sensitive to
* delays.
* <p>
* Running the calculation requires an exclusive lock that can block other
* methods. to avoid causing problems this method will return early if there
* is another thread using this object. The early return will often occur
* after some items have been converted so future calls will have less work
* to do. If the return value indicates an early return then the calling
* code should generally {@link Thread#sleep(long)}, {@link Thread#yield()},
* or do other tasks before calling this method again. Calling this method
* again before other threads have a chance to run will return immediately
* after doing no work.
*
* @return false if the calculation was interrupted and there are more
* dynamic items, true if this disclosure is now 100% static.
*/
public boolean calculateStaticDistances() {
if (waitingTasks.get() > 0) {
return false;
}
synchronized (items) {
while (staticCount < items.size()) {
ItemInfo<T> item = items.get(staticCount);
double distance = getMinDistance(getStaticItems(), item);
if (distance > 0) {
item.setDistance(distance);
staticCount += 1;
} else {
items.remove(staticCount);
}
if (waitingTasks.get() > 0) {
return false;
}
}
return true;
}
}
protected List<ItemInfo<T>> getStaticItems() {
return items.subList(0, staticCount);
}
protected List<ItemInfo<T>> getDynamicItems() {
return items.subList(staticCount, items.size());
}
private double getMinDistance(List<ItemInfo<T>> list, ItemInfo<T> item) {
double min_dist = Double.MAX_VALUE;
for (ItemInfo<T> existing : list) {
double dist = existing.getItem().getLocation()
.distance(item.getItem().getLocation());
if (dist < min_dist
&& (Double.isNaN(existing.getDistance()) || dist < existing
.getDistance())) {
min_dist = dist;
}
}
return min_dist;
}
public static interface PlotItem {
public Coordinate getLocation();
}
private static class ItemInfo<T extends PlotItem> {
private final T item;
private double distance;
public ItemInfo(T item) {
this.item = item;
this.distance = Double.NaN;
}
public T getItem() {
return item;
}
public boolean within(IExtent extent) {
Coordinate location = item.getLocation();
return extent.contains(new double[] { location.x, location.y });
}
public boolean hasDistance() {
return !Double.isNaN(distance);
}
public double getDistance() {
return distance;
}
public void setDistance(double distance) {
this.distance = distance;
}
}
}

View file

@ -0,0 +1,152 @@
/**
* 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.pointdata.rsc.wind;
import java.util.HashSet;
import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
/**
*
* JAXB compatible representation of all the configuration options needed to
* request data and sampling information for wind vectors.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- -----------------
* Nov 13, 2015 4903 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@XmlAccessorType(XmlAccessType.NONE)
public class WindPlotConfig {
@XmlElement
private WindPlotParameter longitude = new WindPlotParameter("longitude");
@XmlElement
private WindPlotParameter latitude = new WindPlotParameter("latitude");
@XmlElement
private WindPlotParameter speed = new WindPlotParameter("windSpd", "kn");
@XmlElement
private WindPlotParameter direction = new WindPlotParameter("windDir");
@XmlElement
private SampleFormat sample;
public WindPlotParameter getLongitude() {
return longitude;
}
public void setLongitude(WindPlotParameter longitude) {
this.longitude = longitude;
}
public WindPlotParameter getLatitude() {
return latitude;
}
public void setLatitude(WindPlotParameter latitude) {
this.latitude = latitude;
}
public WindPlotParameter getSpeed() {
return speed;
}
public void setSpeed(WindPlotParameter speed) {
this.speed = speed;
}
public WindPlotParameter getDirection() {
return direction;
}
public void setDirection(WindPlotParameter direction) {
this.direction = direction;
}
public SampleFormat getSample() {
return sample;
}
public void setSample(SampleFormat sample) {
this.sample = sample;
}
public Set<String> getUniqueParameters() {
Set<String> result = new HashSet<>(5);
result.add(longitude.getParameter());
result.add(latitude.getParameter());
result.add(speed.getParameter());
result.add(direction.getParameter());
if (sample != null) {
result.addAll(sample.getUniqueParameters());
}
return result;
}
@XmlAccessorType(XmlAccessType.NONE)
public static class SampleFormat {
@XmlAttribute
private String text;
@XmlElement(name = "field")
private WindPlotParameter[] fields;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public WindPlotParameter[] getFields() {
return fields;
}
public void setFields(WindPlotParameter[] fields) {
this.fields = fields;
}
public Set<String> getUniqueParameters() {
Set<String> result = new HashSet<>();
for (WindPlotParameter p : fields) {
result.add(p.getParameter());
}
return result;
}
}
}

View file

@ -0,0 +1,236 @@
/**
* 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.pointdata.rsc.wind;
import java.text.ParseException;
import java.text.ParsePosition;
import java.util.Date;
import javax.measure.unit.Unit;
import javax.measure.unit.UnitFormat;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import com.raytheon.uf.common.pointdata.PointDataDescription.Type;
import com.raytheon.uf.common.pointdata.PointDataView;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.util.TimeUtil;
/**
*
* Configuration information for a single parameter that is part of a
* {@link WindPlotConfig}.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- -----------------
* Nov 13, 2015 4903 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@XmlAccessorType(XmlAccessType.NONE)
public class WindPlotParameter {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(WindPlotParameter.class);
@XmlAttribute
private String parameter;
@XmlAttribute
private String unit;
@XmlAttribute
private Boolean time;
@XmlElement(name = "format")
private FormatValue[] formats;
@XmlTransient
private Unit<?> parsedUnit;
/* Avoid spamming logs. */
@XmlTransient
private boolean unitParseFailed = false;
public WindPlotParameter() {
}
public WindPlotParameter(String parameter) {
this.parameter = parameter;
}
public WindPlotParameter(String parameter, String unit) {
this.parameter = parameter;
this.unit = unit;
}
public String getParameter() {
return parameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public Boolean getTime() {
return time;
}
public void setTime(Boolean time) {
this.time = time;
}
public FormatValue[] getFormats() {
return formats;
}
public void setFormats(FormatValue[] formats) {
this.formats = formats;
}
public Unit<?> getParsedUnit() {
if (!unitParseFailed && parsedUnit == null) {
try {
parsedUnit = UnitFormat.getUCUMInstance().parseProductUnit(
unit, new ParsePosition(0));
} catch (ParseException e) {
statusHandler.handle(Priority.WARN,
"Error retrieving wind data.", e);
unitParseFailed = true;
}
}
return parsedUnit;
}
public double getNumericValue(PointDataView view) {
double value = view.getNumber(parameter).doubleValue();
if (unit != null) {
Unit<?> desired = getParsedUnit();
Unit<?> current = view.getUnit(parameter);
if (desired != null && current.isCompatible(desired)) {
value = current.getConverterTo(desired).convert(value);
}
}
return value;
}
public Object getValue(PointDataView view) {
if (view.getType(parameter) == Type.STRING) {
return view.getString(parameter);
} else if (Boolean.TRUE.equals(time)) {
return TimeUtil.newGmtCalendar(new Date(view.getNumber(parameter)
.longValue()));
} else if (formats != null) {
Number value = view.getNumber(parameter);
for (FormatValue format : formats) {
if (format.matches(value)) {
return format.getText();
}
}
return value.toString();
} else if (unit != null) {
return getNumericValue(view);
}
return view.getNumber(parameter);
}
@XmlAccessorType(XmlAccessType.NONE)
public static class FormatValue {
@XmlAttribute
private Double high;
@XmlAttribute
private Double low;
@XmlAttribute
private Double value;
@XmlAttribute
private String text;
public boolean matches(Number value) {
if (this.value != null
&& value.doubleValue() == this.value.doubleValue()) {
return true;
} else if (high != null && low != null
&& high.doubleValue() >= value.doubleValue()
&& low.doubleValue() < value.doubleValue()) {
return true;
}
return false;
}
public Double getHigh() {
return high;
}
public void setHigh(Double high) {
this.high = high;
}
public Double getLow() {
return low;
}
public void setLow(Double low) {
this.low = low;
}
public Double getValue() {
return value;
}
public void setValue(Double value) {
this.value = value;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
}

View file

@ -0,0 +1,268 @@
/**
* 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.pointdata.rsc.wind;
import java.util.Collection;
import org.eclipse.swt.graphics.RGB;
import org.geotools.referencing.GeodeticCalculator;
import com.raytheon.uf.viz.core.IExtent;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.point.display.VectorGraphicsConfig;
import com.raytheon.uf.viz.core.point.display.VectorGraphicsRenderable;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.IResourceDataChanged;
import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability;
import com.raytheon.uf.viz.core.rsc.capabilities.DensityCapability;
import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability;
import com.raytheon.viz.pointdata.rsc.progdisc.GenericProgressiveDisclosure;
import com.raytheon.viz.pointdata.rsc.progdisc.GenericProgressiveDisclosure.PlotItem;
import com.vividsolutions.jts.geom.Coordinate;
/**
*
* Combines a {@link VectorGraphicsRenderable} with a
* {@link GenericProgressiveDisclosure} to generate progressively disclosed wind
* displays.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- -----------------
* Nov 13, 2015 4903 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class WindPlotRenderable {
protected final AbstractVizResource<?, ?> resource;
private final IResourceDataChanged changeListener = new IResourceDataChanged() {
@Override
public void resourceChanged(ChangeType type, Object object) {
if (type == ChangeType.CAPABILITY) {
lastPaintedExtent = null;
}
}
};
protected VectorGraphicsConfig config = new VectorGraphicsConfig();
protected double baseDensity = 1.0;
protected GenericProgressiveDisclosure<Barb> barbs = new GenericProgressiveDisclosure<>();
private VectorGraphicsRenderable renderable;
private double lastPaintedDistance = Double.POSITIVE_INFINITY;
private IExtent lastPaintedExtent;
public WindPlotRenderable(AbstractVizResource<?, ?> resource) {
this.resource = resource;
resource.getResourceData().addChangeListener(changeListener);
}
public VectorGraphicsConfig getConfig() {
return config;
}
public void reconfigure() {
if (lastPaintedExtent != null) {
lastPaintedExtent = null;
resource.issueRefresh();
}
}
public void dispose() {
if (renderable != null) {
renderable.dispose();
renderable = null;
}
resource.getResourceData().removeChangeListener(changeListener);
}
public void paint(IGraphicsTarget target, PaintProperties paintProps)
throws VizException {
IExtent extent = paintProps.getView().getExtent();
if (renderable != null
&& (lastPaintedExtent == null || !lastPaintedExtent
.equals(extent))) {
renderable.dispose();
renderable = null;
}
if (renderable == null) {
double magnification = resource.getCapability(
MagnificationCapability.class).getMagnification();
double ratio = magnification * extent.getWidth()
/ paintProps.getCanvasBounds().width;
config.setSizeScaler(ratio);
renderable = new VectorGraphicsRenderable(getDescriptor(), target,
config);
lastPaintedExtent = extent.clone();
double density = resource.getCapability(DensityCapability.class)
.getDensity();
double minDist = config.getScaledSize() / baseDensity / density;
lastPaintedDistance = minDist;
Collection<Barb> barbs = this.barbs.runDisclosure(extent, minDist);
GeodeticCalculator gc = new GeodeticCalculator();
for (Barb barb : barbs) {
double dir = barb.getDirection();
Coordinate lonLat = barb.getLonLat();
Coordinate plotLoc = barb.getLocation();
gc.setStartingGeographicPoint(lonLat.x, lonLat.y);
double[] world = getDescriptor().pixelToWorld(
new double[] { plotLoc.x, plotLoc.y - 1 });
gc.setDestinationGeographicPoint(world[0], world[1]);
dir -= gc.getAzimuth();
dir = Math.toRadians(dir);
renderable.paintBarb(plotLoc, barb.getMagnitude(), dir);
}
}
renderable.setColor(getColor());
renderable.paint(target);
}
public String getText(Coordinate pixelLoc) {
String text = null;
double bestDist = 100;
if (renderable != null) {
bestDist = renderable.getConfig().getScaledSize() * 2;
}
for (Barb barb : barbs.getAll()) {
double dist = barb.getLocation().distance(pixelLoc);
if (dist < bestDist) {
bestDist = dist;
text = barb.getText();
}
}
return text;
}
protected RGB getColor() {
return resource.getCapability(ColorableCapability.class).getColor();
}
public synchronized boolean optimizeDisclosure() {
return barbs.calculateStaticDistances();
}
public void addBarb(Coordinate lonLat, double magnitude, double direction) {
addBarb(lonLat, magnitude, direction, null, false);
}
public void addBarb(Coordinate lonLat, double magnitude, double direction,
boolean checkDuplicate) {
addBarb(lonLat, magnitude, direction, null, checkDuplicate);
}
public void addBarb(Coordinate lonLat, double magnitude, double direction,
String text) {
addBarb(lonLat, magnitude, direction, text, false);
}
public synchronized void addBarb(Coordinate lonLat, double magnitude,
double direction, String text, boolean checkDuplicate) {
double[] pixel = getDescriptor().worldToPixel(
new double[] { lonLat.x, lonLat.y });
Coordinate plotLoc = new Coordinate(pixel[0], pixel[1]);
double distance = barbs.add(new Barb(lonLat, plotLoc, magnitude,
direction, text), checkDuplicate);
if (Double.isNaN(distance) || distance > lastPaintedDistance) {
IExtent extent = lastPaintedExtent;
if (extent != null && extent.contains(pixel)) {
resource.issueRefresh();
lastPaintedExtent = null;
}
}
}
public synchronized void reproject() {
GenericProgressiveDisclosure<Barb> barbs = this.barbs;
this.barbs = new GenericProgressiveDisclosure<>();
for (Barb barb : barbs.getAll()) {
addBarb(barb.getLonLat(), barb.getMagnitude(), barb.getDirection());
}
}
protected IDescriptor getDescriptor() {
return resource.getDescriptor();
}
private class Barb implements PlotItem {
public final Coordinate lonLat;
public final Coordinate plotLoc;
public final double magnitude;
public final double direction;
public final String text;
public Barb(Coordinate lonLat, Coordinate plotLoc, double magnitude,
double direction, String text) {
this.lonLat = lonLat;
this.plotLoc = plotLoc;
this.magnitude = magnitude;
this.direction = direction;
this.text = text;
}
public Coordinate getLonLat() {
return lonLat;
}
@Override
public Coordinate getLocation() {
return plotLoc;
}
public double getMagnitude() {
return magnitude;
}
public double getDirection() {
return direction;
}
public String getText() {
return text;
}
}
public void setBaseDensity(double baseDensity) {
this.baseDensity = baseDensity;
}
}

View file

@ -0,0 +1,404 @@
/**
* 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.pointdata.rsc.wind;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
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;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.TransformException;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.geospatial.ReferencedCoordinate;
import com.raytheon.uf.common.pointdata.PointDataContainer;
import com.raytheon.uf.common.pointdata.PointDataServerRequest;
import com.raytheon.uf.common.pointdata.PointDataView;
import com.raytheon.uf.common.time.BinOffset;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.time.TimeRange;
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.jobs.JobPool;
import com.raytheon.uf.viz.core.map.IMapDescriptor;
import com.raytheon.uf.viz.core.point.display.VectorGraphicsConfig;
import com.raytheon.uf.viz.core.requests.ThriftClient;
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.viz.pointdata.rsc.wind.WindPlotConfig.SampleFormat;
import com.vividsolutions.jts.geom.Coordinate;
/**
*
* Resource for displaying wind barbs of point data.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- -----------------
* Nov 13, 2015 4903 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class WindPlotResource extends
AbstractVizResource<WindPlotResourceData, IMapDescriptor> {
private JobPool primaryLoadPool;
private Job secondaryLoadJob;
private final Object framesLock = new Object();
private Map<DataTime, DataFrame> frames;
protected WindPlotResource(WindPlotResourceData resourceData,
LoadProperties loadProperties) {
super(resourceData, loadProperties);
}
@Override
protected void initInternal(IGraphicsTarget target) throws VizException {
synchronized (framesLock) {
dataTimes = new CopyOnWriteArrayList<>();
frames = new HashMap<DataTime, DataFrame>();
primaryLoadPool = new JobPool("Loading Wind Data", 4, false);
secondaryLoadJob = new SecondaryUpdateJob();
secondaryLoadJob.setSystem(true);
secondaryLoadJob.schedule();
}
}
@Override
protected void disposeInternal() {
secondaryLoadJob.cancel();
secondaryLoadJob = null;
primaryLoadPool.cancel();
primaryLoadPool = null;
synchronized (framesLock) {
for (DataFrame frame : frames.values()) {
frame.getRenderable().dispose();
}
this.frames = null;
}
}
@Override
protected void paintInternal(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
DataTime time = paintProps.getDataTime();
if (time == null) {
return;
}
DataFrame frame;
synchronized (framesLock) {
frame = frames.get(time);
if (frame == null) {
frame = addFrame(time);
}
}
primaryLoadPool.schedule(frame);
frame.getRenderable().paint(target, paintProps);
}
protected DataFrame addFrame(DataTime dataTime) {
synchronized (framesLock) {
DataFrame frame = frames.get(dataTime);
if (frame == null) {
frame = new DataFrame(dataTime);
int index = Collections.binarySearch(dataTimes, dataTime);
if (index < 0) {
/* Keep the list sorted. */
dataTimes.add(-1 * index - 1, dataTime);
}
frames.put(dataTime, frame);
}
return frame;
}
}
@Override
public void remove(DataTime dataTime) {
synchronized (framesLock) {
frames.remove(dataTime);
super.remove(dataTime);
}
}
@Override
public String inspect(ReferencedCoordinate coord) throws VizException {
if (resourceData.getConfig().getSample() == null) {
return null;
}
DataTime time = descriptor.getTimeForResource(this);
if (time == null) {
return null;
}
DataFrame frame;
synchronized (framesLock) {
frame = frames.get(time);
}
if (frame == null) {
return null;
}
try {
String text = frame.getRenderable().getText(
coord.asPixel(descriptor.getGridGeometry()));
if (text == null) {
text = "NO DATA";
}
return text;
} catch (TransformException | FactoryException e) {
throw new VizException("Unable to transform point for inspect.", e);
}
}
@Override
public void project(CoordinateReferenceSystem crs) throws VizException {
synchronized (framesLock) {
for (DataFrame frame : frames.values()) {
frame.reproject();
}
}
}
@Override
public String getName() {
String name = resourceData.getLegend();
if (name == null) {
name = "Wind";
}
return name;
}
protected void loadData(DataTime dataTime, WindPlotRenderable renderable,
boolean initialLoad) {
WindPlotConfig config = resourceData.getConfig();
SampleFormat sample = config.getSample();
Map<String, RequestConstraint> constraints = new HashMap<>(
resourceData.getFullDataMetadataMap());
constraints.put(PointDataServerRequest.REQUEST_MODE_KEY,
new RequestConstraint(PointDataServerRequest.REQUEST_MODE_2D));
constraints.put(PointDataServerRequest.REQUEST_PARAMETERS_KEY,
new RequestConstraint(config.getUniqueParameters()));
BinOffset binOffset = resourceData.getBinOffset();
if (binOffset == null) {
constraints.put(PluginDataObject.DATATIME_ID,
new RequestConstraint(dataTime.toString()));
} else {
TimeRange range = binOffset.getTimeRange(dataTime);
constraints.put(PluginDataObject.REFTIME_ID, new RequestConstraint(
new DataTime(range.getStart()).toString(), new DataTime(
range.getEnd()).toString()));
}
PointDataServerRequest request = new PointDataServerRequest();
request.setRcMap(constraints);
try {
PointDataContainer container = (PointDataContainer) ThriftClient
.sendRequest(request);
if (container == null) {
return;
}
for (int i = 0; i < container.getAllocatedSz(); i += 1) {
PointDataView view = container.readRandom(i);
double longitude = config.getLongitude().getNumericValue(view);
double latitude = config.getLatitude().getNumericValue(view);
double magnitude = config.getSpeed().getNumericValue(view);
double direction = config.getDirection().getNumericValue(view);
Coordinate lonLat = new Coordinate(longitude, latitude);
if (sample == null) {
renderable.addBarb(lonLat, magnitude, direction,
!initialLoad);
} else {
WindPlotParameter[] fields = sample.getFields();
Object[] args = new Object[fields.length];
for (int c = 0; c < args.length; c += 1) {
args[c] = fields[c].getValue(view);
}
String text = String.format(sample.getText(), args)
.toString();
renderable.addBarb(lonLat, magnitude, direction, text,
!initialLoad);
}
}
} catch (VizException e) {
statusHandler.error("Error retrieving wind data.", e);
}
}
@Override
protected void resourceDataChanged(ChangeType type, Object updateObject) {
if (type == ChangeType.DATA_UPDATE
&& updateObject instanceof PluginDataObject[]) {
synchronized (framesLock) {
BinOffset binOffset = resourceData.getBinOffset();
for (PluginDataObject pdo : (PluginDataObject[]) updateObject) {
DataTime time = pdo.getDataTime();
if (binOffset != null) {
time = binOffset.getNormalizedTime(time);
}
DataFrame frame = frames.get(time);
if (frame != null) {
frame.update();
}
}
secondaryLoadJob.schedule();
}
}
}
private class DataFrame implements Runnable {
private final DataTime time;
private final WindPlotRenderable renderable;
private boolean needsReproject = false;
private boolean needsData = true;
private boolean initialLoad = true;
public DataFrame(DataTime time) {
this.time = time;
this.renderable = new WindPlotRenderable(WindPlotResource.this);
renderable.setBaseDensity(resourceData.getBaseDensity());
VectorGraphicsConfig config = renderable.getConfig();
config.setBaseSize(20);
config.setCalmCircleSizeRatio(0.3);
}
public WindPlotRenderable getRenderable() {
return renderable;
}
public void update() {
needsData = true;
}
public void reproject() {
needsReproject = true;
}
@Override
public void run() {
asyncUpdate();
}
public synchronized boolean asyncUpdate() {
boolean result = needsReproject | needsData;
if (needsReproject) {
needsReproject = false;
renderable.reproject();
}
if (needsData) {
needsData = false;
loadData(time, renderable, initialLoad);
initialLoad = false;
}
return result;
}
}
private class SecondaryUpdateJob extends Job {
public SecondaryUpdateJob() {
super("Updating wind data.");
setSystem(true);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
List<DataFrame> frameList;
synchronized (framesLock) {
if (frames == null) {
return Status.OK_STATUS;
}
frameList = new ArrayList<>(frames.values());
}
for (DataFrame frame : frameList) {
if (frame.asyncUpdate()) {
/*
* Restart after every frame to make sure frames haven't
* been added or removed while it was updating.
*/
schedule();
return Status.OK_STATUS;
}
}
DataTime[] times = descriptor.getFramesInfo().getTimeMap()
.get(WindPlotResource.this);
if (times == null) {
return Status.OK_STATUS;
}
boolean added = false;
for (DataTime time : times) {
if (time == null) {
continue;
}
synchronized (framesLock) {
if (!frames.containsKey(time)) {
addFrame(time);
added = true;
}
}
}
if (added) {
/*
* Restart to ensure data is requested before optimization.
*/
schedule();
return Status.OK_STATUS;
}
boolean finished = true;
for (DataFrame frame : frameList) {
if (!frame.getRenderable().optimizeDisclosure()) {
finished = false;
}
}
if (!finished) {
schedule();
}
return Status.OK_STATUS;
}
}
}

View file

@ -0,0 +1,199 @@
/**
* 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.pointdata.rsc.wind;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.JAXB;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.RequestableMetadataMarshaller;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
/**
*
* Resource data for displaying wind barbs of point data.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- --------- -----------------
* Nov 13, 2015 4903 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
@XmlAccessorType(XmlAccessType.NONE)
public class WindPlotResourceData extends AbstractRequestableResourceData {
@XmlAttribute
private String legend;
@XmlAttribute
private String windFile;
@XmlAttribute
private double baseDensity = 1.0;
@XmlJavaTypeAdapter(value = RequestableMetadataMarshaller.class)
protected HashMap<String, RequestConstraint> dataMetadataMap;
@XmlTransient
protected WindPlotConfig config;
public WindPlotResourceData() {
/*
* Resource data should never instigate a trip to the DB, the resource
* is responsible for requesting its own stuff.
*/
setRetrieveData(false);
setUpdatingOnMetadataOnly(true);
}
@Override
protected AbstractVizResource<?, ?> constructResource(
LoadProperties loadProperties, PluginDataObject[] objects)
throws VizException {
if (config == null) {
IPathManager pathManager = PathManagerFactory.getPathManager();
String path = "plotWind" + IPathManager.SEPARATOR + windFile;
LocalizationFile localizedFile = pathManager
.getStaticLocalizationFile(path);
try (InputStream is = localizedFile.openInputStream()) {
config = JAXB.unmarshal(is, WindPlotConfig.class);
} catch (Exception e) {
throw new VizException("Error loading " + path, e);
}
}
return new WindPlotResource(this, loadProperties);
}
public String getLegend() {
return legend;
}
public void setLegend(String legend) {
this.legend = legend;
}
public String getWindFile() {
return windFile;
}
public void setWindFile(String windFile) {
this.windFile = windFile;
}
public double getBaseDensity() {
return baseDensity;
}
public void setBaseDensity(double baseDensity) {
this.baseDensity = baseDensity;
}
public HashMap<String, RequestConstraint> getDataMetadataMap() {
return dataMetadataMap;
}
public void setDataMetadataMap(
HashMap<String, RequestConstraint> dataMetadataMap) {
this.dataMetadataMap = dataMetadataMap;
}
public Map<String, RequestConstraint> getFullDataMetadataMap() {
Map<String, RequestConstraint> result = new HashMap<>(getMetadataMap());
if (dataMetadataMap != null) {
result.putAll(dataMetadataMap);
}
return result;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result
+ ((dataMetadataMap == null) ? 0 : dataMetadataMap.hashCode());
result = prime * result + ((legend == null) ? 0 : legend.hashCode());
result = prime * result
+ ((windFile == null) ? 0 : windFile.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
WindPlotResourceData other = (WindPlotResourceData) obj;
if (dataMetadataMap == null) {
if (other.dataMetadataMap != null) {
return false;
}
} else if (!dataMetadataMap.equals(other.dataMetadataMap)) {
return false;
}
if (legend == null) {
if (other.legend != null) {
return false;
}
} else if (!legend.equals(other.legend)) {
return false;
}
if (windFile == null) {
if (other.windFile != null) {
return false;
}
} else if (!windFile.equals(other.windFile)) {
return false;
}
return true;
}
public WindPlotConfig getConfig() {
return config;
}
}

View file

@ -1,52 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<bundle>
<displayList>
<displays xsi:type="d2DMapRenderableDisplay"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} IR 3.9u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="IR3.9u" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
<!--
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.
-->
<bundle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<displayList>
<displays xsi:type="mapRenderableDisplay">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} IR 3.9u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="IR3.9u" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
</bundle>

View file

@ -1,52 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<bundle>
<displayList>
<displays xsi:type="d2DMapRenderableDisplay"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} ${legend} Satellite Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="${between}" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
<!--
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.
-->
<bundle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<displayList>
<displays xsi:type="mapRenderableDisplay">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} ${legend} Satellite Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="${between}" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
</bundle>

View file

@ -1,185 +1,136 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<bundle>
<displayList>
<displays xsi:type="d2DMapRenderableDisplay"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 1050mb-526mb Water Vapor 7.0u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="52600--105000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 525mb-476mb Water Vapor 7.0u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="47600--52500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 475mb-426mb Water Vapor 7.0u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="42600--47500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 425mb-376mb Water Vapor 7.0u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="37600--42500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 375mb-327mb Water Vapor 7.0u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="32700--37500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 326mb-100mb Water Vapor 7.0u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="32600--10000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
<!--
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.
-->
<bundle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<displayList>
<displays xsi:type="mapRenderableDisplay">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 1050mb-526mb Water Vapor 7.0u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="52600--105000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 525mb-476mb Water Vapor 7.0u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="47600--52500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 475mb-426mb Water Vapor 7.0u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="42600--47500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 425mb-376mb Water Vapor 7.0u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="37600--42500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 375mb-327mb Water Vapor 7.0u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="32700--37500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 326mb-100mb Water Vapor 7.0u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.0u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="32600--10000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
</bundle>

View file

@ -1,211 +1,154 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<bundle>
<displayList>
<displays xsi:type="d2DMapRenderableDisplay"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 1050mb-626mb Water Vapor 7.4u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="62600--105000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 625mb-576mb Water Vapor 7.4u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="57600--62500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 575mb-526mb Water Vapor 7.4u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="52600--57500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 525mb-476mb Water Vapor 7.4u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="47600--52500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 475mb-426mb Water Vapor 7.4u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="42600--47500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 425mb-377mb Water Vapor 7.4u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="37700--42500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 376mb-100mb Water Vapor 7.4u Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="10000--37600" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
<!--
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.
-->
<bundle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<displayList>
<displays xsi:type="mapRenderableDisplay">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 1050mb-626mb Water Vapor 7.4u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="62600--105000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 625mb-576mb Water Vapor 7.4u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="57600--62500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 575mb-526mb Water Vapor 7.4u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="52600--57500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 525mb-476mb Water Vapor 7.4u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="47600--52500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 475mb-426mb Water Vapor 7.4u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="42600--47500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 425mb-377mb Water Vapor 7.4u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="37700--42500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 376mb-100mb Water Vapor 7.4u Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="WV7.4u" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="10000--37600" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
</bundle>

View file

@ -1,237 +1,172 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<bundle>
<displayList>
<displays xsi:type="d2DMapRenderableDisplay"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties loadWithoutData="true">
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 1050mb-901mb ${legend} Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="90100--105000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 900mb-776mb ${legend} Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="77600--90000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 775mb-601mb ${legend} Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="60100--77500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 600mb-451mb ${legend} Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="45100--60000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 450mb-351mb ${legend} Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="35100--45000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 350mb-276mb ${legend} Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="27600--35000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 275mb-227mb ${legend} Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="22700--27500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
<capabilities>
</capabilities>
</loadProperties>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="plotResourceData" plotSource="${source} 226mb-100mb ${legend} Winds Plot"
plotModelFile="hdwTypePlotDesign.svg"
retrieveData="false" isUpdatingOnMetadataOnly="false"
isRequeryNecessaryOnTimeMatch="true">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="10000--22600" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
<!--
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.
-->
<bundle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<displayList>
<displays xsi:type="mapRenderableDisplay">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 1050mb-901mb ${legend} Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="90100--105000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 900mb-776mb ${legend} Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="77600--90000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 775mb-601mb ${legend} Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="60100--77500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 600mb-451mb ${legend} Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="45100--60000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 450mb-351mb ${legend} Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="35100--45000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 350mb-276mb ${legend} Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="27600--35000" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 275mb-227mb ${legend} Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="22700--27500" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties />
<resourceData xsi:type="windPlotResourceData" legend="${source} 226mb-100mb ${legend} Winds Plot"
windFile="hdw_wind.xml" baseDensity="0.7">
<binOffset posOffset="1800" negOffset="1800" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${pluginName}" constraintType="EQUALS" />
</mapping>
<mapping key="satType">
<constraint constraintValue="${satType}" constraintType="EQUALS" />
</mapping>
<mapping key="pressure">
<constraint constraintValue="10000--22600" constraintType="BETWEEN" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
</bundle>

View file

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<bundle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<displayList>
<displays xsi:type="mapRenderableDisplay">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#bfbfbf" />
</capabilities>
</loadProperties>
<resourceData xsi:type="windPlotResourceData" legend="${legend} Scatterometer Winds missing"
windFile="ascat_wind.xml" baseDensity="2.0">
<binOffset posOffset="${posOffset}" negOffset="${negOffset}" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
</metadataMap>
<dataMetadataMap>
<mapping key="windSpd">
<!-- -1.1 to 0.0 converted from knots to m/s -->
<constraint constraintValue="-2.1382--0.0" constraintType="BETWEEN" />
</mapping>
</dataMetadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#00ff00" />
</capabilities>
</loadProperties>
<resourceData xsi:type="windPlotResourceData" legend="${legend} Scatterometer Wind s &lt; 34 kts"
windFile="ascat_wind.xml" baseDensity="2.0">
<binOffset posOffset="${posOffset}" negOffset="${negOffset}" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
</metadataMap>
<dataMetadataMap>
<mapping key="windSpd">
<!-- 0.0 to 34.0 converted from knots to m/s -->
<constraint constraintValue="0.0--17.49" constraintType="BETWEEN" />
</mapping>
</dataMetadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#ffff00" />
</capabilities>
</loadProperties>
<resourceData xsi:type="windPlotResourceData" legend="${legend} Scatterometer Wind 34 &lt;= s &lt; 48 kts"
windFile="ascat_wind.xml" baseDensity="2.0">
<binOffset posOffset="${posOffset}" negOffset="${negOffset}" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
</metadataMap>
<dataMetadataMap>
<mapping key="windSpd">
<!-- 34.0 to 48.0 converted from knots to m/s -->
<constraint constraintValue="17.49--24.69" constraintType="BETWEEN" />
</mapping>
</dataMetadataMap>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#ff0000" />
</capabilities>
</loadProperties>
<resourceData xsi:type="windPlotResourceData" legend="${legend} Scatterometer Wind s >= 48 kts"
windFile="ascat_wind.xml" baseDensity="2.0">
<binOffset posOffset="${posOffset}" negOffset="${negOffset}" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="${plugin}" constraintType="EQUALS" />
</mapping>
</metadataMap>
<dataMetadataMap>
<mapping key="windSpd">
<!-- 48.0.0 to 999.0 converted from knots to m/s -->
<constraint constraintValue="24.69--513.93" constraintType="BETWEEN" />
</mapping>
</dataMetadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
</bundle>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<windPlot>
<longitude parameter="longitude"/>
<latitude parameter="latitude" />
<magnitude parameter="windSpd" unit="kn"/>
<direction parameter="windDir" />
<sample text="%tH%tMZ %3.0f @ %3.0f RAIN FLAG %s">
<field parameter="validTime" time="true"/>
<field parameter="validTime" time="true"/>
<field parameter="windDir" />
<field parameter="windSpd" unit="kn"/>
<field parameter="probRain">
<format value="-9999" text="?" />
</field>
</sample>
</windPlot>

View file

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<windPlot>
<longitude parameter="longitude"/>
<latitude parameter="latitude" />
<magnitude parameter="windSpd" unit="kn"/>
<direction parameter="windDir" />
<sample text="%tH%tMZ %s %3.1fC %5.0fmb %3.0fdeg %3.0fkts">
<field parameter="validTime" time="true"/>
<field parameter="validTime" time="true"/>
<field parameter="satelliteFreq">
<format low="2.79374e+13" high="2.81374e+13" text="IR" />
<format low="4.04405e+13" high="4.06405e+13" text="WV7.4u" />
<format low="4.27571e+13" high="4.29571e+13" text="WV7.0u" />
<format low="4.40176e+13" high="4.42176e+13" text="WV" />
<format low="4.60538e+14" high="4.62538e+14" text="Vis" />
<format low="7.67699e+13" high="7.69699e+13" text="IR3.9u" />
</field>
<field parameter="coldestTemp" unit="C"/>
<field parameter="pressure" unit="hPa"/>
<field parameter="windDir" />
<field parameter="windSpd" unit="kn"/>
</sample>
</windPlot>