Merge remote-tracking branch 'asm/asm_16.1.2' into master_16.1.2
Former-commit-id: 6e90fbcc490105418e7fdfa377d9769206de6d17
This commit is contained in:
commit
0836b37c4a
2 changed files with 76 additions and 8 deletions
|
@ -103,6 +103,7 @@
|
|||
point="com.raytheon.viz.ui.contextualMenu">
|
||||
<contextualMenu
|
||||
actionClass="com.raytheon.viz.warngen.gui.ShowExtensionAreaToggleAction"
|
||||
capabilityClass="com.raytheon.viz.warngen.gui.WarngenLayer"
|
||||
name="com.raytheon.viz.warngen.ShowExtensionAreaToggle"
|
||||
sortID="600">
|
||||
</contextualMenu>
|
||||
|
|
|
@ -251,6 +251,7 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier;
|
|||
* 12/09/2015 ASM #18209 D. Friedman Support cwaStretch dam break polygons.
|
||||
* 12/21/2015 DCS 17942 D. Friedman Support "extension area": polygon can extend past normal features into WFO's marine/land areas.
|
||||
* Show preview of redrawn polygon when developer mode property is set.
|
||||
* 01/06/2016 ASM #18453 D. Friedman Cache extension areas so they are not regenerated on Restart or (limited) template changes.
|
||||
* </pre>
|
||||
*
|
||||
* @author mschenke
|
||||
|
@ -419,6 +420,14 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
return fipsIds;
|
||||
}
|
||||
|
||||
private boolean isEquivalentTo(GeospatialDataAccessor other) {
|
||||
return other != null && geoData == other.geoData
|
||||
&& ((areaConfig.getFipsField() == null && other.areaConfig.getFipsField() == null)
|
||||
|| (areaConfig.getFipsField() != null
|
||||
&& areaConfig.getFipsField().equals(
|
||||
other.areaConfig.getFipsField())));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class CustomMaps extends Job {
|
||||
|
@ -777,6 +786,23 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
|
||||
}
|
||||
|
||||
private static class ExtensionAreaRecord {
|
||||
private GeospatialDataAccessor primaryGDA;
|
||||
private GeospatialDataAccessor gda;
|
||||
private ExtensionAreaOptions options;
|
||||
private Geometry geometry;
|
||||
private Geometry extensionAreaVis;
|
||||
public ExtensionAreaRecord(GeospatialDataAccessor primaryGDA,
|
||||
GeospatialDataAccessor gda, ExtensionAreaOptions options,
|
||||
Geometry geometry, Geometry extensionAreaVis) {
|
||||
this.primaryGDA = primaryGDA;
|
||||
this.gda = gda;
|
||||
this.options = options;
|
||||
this.geometry = geometry;
|
||||
this.extensionAreaVis = extensionAreaVis;
|
||||
}
|
||||
}
|
||||
|
||||
private class ExtensionAreaManager extends Job implements IChangeListener {
|
||||
private ExtensionAreaOptions options = new ExtensionAreaOptions();
|
||||
private WritableValue observableOptions = new WritableValue(options, null);
|
||||
|
@ -784,9 +810,10 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
private GeospatialDataAccessor primaryGDA;
|
||||
private GeospatialDataAccessor gda;
|
||||
|
||||
private Geometry geometry;
|
||||
private FutureTask<Geometry> geometryFuture;
|
||||
|
||||
private Map<String, ExtensionAreaRecord> cache = new HashMap<String, ExtensionAreaRecord>(3);
|
||||
|
||||
public ExtensionAreaManager() {
|
||||
super("Generate extension area");
|
||||
observableOptions.addChangeListener(this);
|
||||
|
@ -815,7 +842,7 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
boolean recreateArea = true;
|
||||
ExtensionAreaOptions oldOptions = this.options;
|
||||
if (oldOptions != null) {
|
||||
if (primaryGDA == geoAccessor
|
||||
if (primaryGDA != null && primaryGDA.isEquivalentTo(geoAccessor)
|
||||
&& oldOptions.getDistance() == options.getDistance()
|
||||
&& oldOptions.getSimplificationTolerance() ==
|
||||
options.getSimplificationTolerance()) {
|
||||
|
@ -824,7 +851,6 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
}
|
||||
this.options = options.clone();
|
||||
if (recreateArea) {
|
||||
geometry = null;
|
||||
if (geometryFuture != null) {
|
||||
geometryFuture.cancel(true);
|
||||
geometryFuture = null;
|
||||
|
@ -844,10 +870,12 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
error = e;
|
||||
}
|
||||
if (gda != null) {
|
||||
if (! useCachedArea(primaryGDA, gda, options)) {
|
||||
geometryFuture = new FutureTask<Geometry>(
|
||||
new ExtensionAreaGeometryTask(options,
|
||||
primaryGDA, gda));
|
||||
schedule();
|
||||
}
|
||||
} else {
|
||||
statusHandler.handle(Priority.WARN,
|
||||
"Could not determine geospatial data type for polygon extension area",
|
||||
|
@ -866,6 +894,40 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
}
|
||||
}
|
||||
|
||||
private boolean useCachedArea(GeospatialDataAccessor primaryGDA,
|
||||
GeospatialDataAccessor gda, ExtensionAreaOptions options) {
|
||||
ExtensionAreaRecord ear = null;
|
||||
|
||||
synchronized (cache) {
|
||||
ear = cache.get(primaryGDA.areaConfig.getAreaSource());
|
||||
}
|
||||
if (ear != null && ear.primaryGDA.isEquivalentTo(primaryGDA) &&
|
||||
ear.gda.isEquivalentTo(gda) &&
|
||||
ear.options.getDistance() == options.getDistance() &&
|
||||
ear.options.getSimplificationTolerance() == options.getSimplificationTolerance()) {
|
||||
this.geometryFuture = new FutureTask<Geometry>(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// do nothing
|
||||
}
|
||||
}, ear.geometry);
|
||||
this.geometryFuture.run();
|
||||
extensionAreaVis = ear.extensionAreaVis;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void cacheArea(GeospatialDataAccessor primaryGDA,
|
||||
GeospatialDataAccessor gda, ExtensionAreaOptions options,
|
||||
Geometry area, Geometry vis) {
|
||||
synchronized (cache) {
|
||||
cache.put(primaryGDA.areaConfig.getAreaSource(),
|
||||
new ExtensionAreaRecord(primaryGDA, gda, options, area,
|
||||
vis));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IStatus run(IProgressMonitor monitor) {
|
||||
FutureTask<Geometry> future = geometryFuture;
|
||||
|
@ -949,7 +1011,9 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
}
|
||||
Geometry r = GeometryUtil.union(g);
|
||||
r = createExtensionAreaFromLocal(r);
|
||||
extensionAreaVis = extensionGDA.buildArea(r, false);
|
||||
Geometry vis = extensionGDA.buildArea(r, false);
|
||||
extensionAreaManager.cacheArea(primaryGDA, extensionGDA, options, r, vis);
|
||||
extensionAreaVis = vis;
|
||||
issueRefresh();
|
||||
return r;
|
||||
}
|
||||
|
@ -1281,6 +1345,9 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
if (coveredAreaFrame != null) {
|
||||
coveredAreaFrame.dispose();
|
||||
}
|
||||
if (extensionAreaShadedShape != null) {
|
||||
extensionAreaShadedShape.dispose();
|
||||
}
|
||||
|
||||
manager.dispose();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue