386 lines
12 KiB
JavaScript
386 lines
12 KiB
JavaScript
/* define a class to find winds and generate wind speed grid */
|
|
function GribWinds(plugin,speed) {
|
|
this.plugin = plugin;
|
|
this.speed = speed;
|
|
this.params = new Object();
|
|
this.count = 1;
|
|
this.sortby = "basetime";
|
|
this.query = new TermQuery(this.plugin);
|
|
this.geom = null;
|
|
this.crs = null;
|
|
this.dataURI = null;
|
|
}
|
|
function _executeGWS() {
|
|
var response;
|
|
/* get the U wind grib */
|
|
var query = new TermQuery(this.plugin);
|
|
for (name in this.params) {
|
|
query.addParameter(name,this.params[name]);
|
|
}
|
|
query.addParameter("paramid","U%wind","like");
|
|
query.setCount(this.count);
|
|
query.setSortBy(this.sortby);
|
|
var uResult = query.execute();
|
|
if (uResult.size() == 0) {
|
|
return this.makeError("Query for Wind-U returned 0 results.",this.query);
|
|
}
|
|
/* get the V wind grib */
|
|
var query = new TermQuery(this.plugin);
|
|
for (name in this.params) {
|
|
query.addParameter(name,this.params[name]);
|
|
}
|
|
query.addParameter("paramid","V%wind","like");
|
|
query.setCount(this.count);
|
|
query.setSortBy(this.sortby);
|
|
var vResult = query.execute();
|
|
if (vResult.size() == 0) {
|
|
return this.makeError("Query for Wind-V returned 0 results.",this.query);
|
|
}
|
|
/* read the data from the data store */
|
|
this.geom = uResult.get(0).getGrid().getGridGeom();
|
|
this.crs = uResult.get(0).getGrid().getCrs();
|
|
this.dataURI = uResult.get(0).getDataURI();
|
|
var uFile = new FileIn(this.plugin,uResult.get(0));
|
|
var vFile = new FileIn(this.plugin,vResult.get(0));
|
|
var uData = uFile.execute();
|
|
var vData = vFile.execute();
|
|
/* combine the data into wind speed data */
|
|
var windSpeed = new ConvertWindsData(uData,vData,this.speed);
|
|
return windSpeed.execute();
|
|
|
|
|
|
}
|
|
/* GWS accessors */
|
|
function _setGWSSortValue(sortValue) {
|
|
this.sortby = sortValue;
|
|
}
|
|
function _setGWSCount(count) {
|
|
this.count = count;
|
|
}
|
|
function _addGWSParameter(name,value) {
|
|
this.params[name] = value;
|
|
}
|
|
function _getGWSGeom() {
|
|
return this.geom;
|
|
}
|
|
function _getGWSCRS () {
|
|
return this.crs;
|
|
}
|
|
function _getGWSDataURI() {
|
|
return this.dataURI;
|
|
}
|
|
|
|
/* mapping functions to the GWS object */
|
|
GribWinds.prototype.execute = _executeGWS;
|
|
GribWinds.prototype.addParameter = _addGWSParameter;
|
|
GribWinds.prototype.getGeom = _getGWSGeom;
|
|
GribWinds.prototype.getCRS = _getGWSCRS;
|
|
GribWinds.prototype.getDataURI = _getGWSDataURI;
|
|
GribWinds.prototype.setCount = _setGWSCount;
|
|
GribWinds.prototype.setSortby = _setGWSSortValue;
|
|
GribWinds.prototype.makeError = _makeError;
|
|
|
|
/* define a query to get the temperature data */
|
|
function ObsSpatialQuery(plugin,obParam) {
|
|
this.icao = "icao";
|
|
this.geometry = "geometry";
|
|
this.plugin = plugin;
|
|
this.obParam = obParam;
|
|
this.oQuery = new TermQuery(this.plugin);
|
|
this.sQuery = new SpatialQuery();
|
|
}
|
|
function _executeOSQ() {
|
|
/* get the spatial results */
|
|
var sResult = this.sQuery.execute();
|
|
if(sResult == null || sResult.size() == 0) {
|
|
return this.makeError("Spatial query returned no results.",this.spatial);
|
|
}
|
|
/* get and geolocate the wind speed observations */
|
|
this.addList("stationid",MEUtils.changeArrayListToString(sResult.get(this.icao)));
|
|
var oResult = this.oQuery.execute();
|
|
if(oResult == null || oResult.size() == 0) {
|
|
return this.makeError("Ob query returned no results.",oQuery);
|
|
}
|
|
var oMap = new MapAsciiData(this.obParam,
|
|
oResult,
|
|
sResult.get(this.icao),
|
|
sResult.get(this.geometry));
|
|
|
|
return oMap.execute();
|
|
}
|
|
/* OSQ accessors */
|
|
function _setOSQSortValue(sortValue) {
|
|
this.oQuery.setSortBy(sortValue);
|
|
}
|
|
function _setOSQCount(count) {
|
|
this.oQuery.setCount(count);
|
|
}
|
|
function _addOSQParameter(name,value) {
|
|
this.oQuery.addParameter(name,value);
|
|
}
|
|
function _addOSQList(name,value) {
|
|
this.oQuery.addParameter(name,value,"in");
|
|
}
|
|
/* setter for the spatial bounds */
|
|
function _setOSQSpatialBounds(ulLat, ulLon, lrLat, lrLon, icao, geom) {
|
|
this.icao = icao;
|
|
this.geometry = geom;
|
|
this.sQuery.setUpperLeftLat(ulLat);
|
|
this.sQuery.setUpperLeftLon(ulLon);
|
|
this.sQuery.setLowerRightLat(lrLat);
|
|
this.sQuery.setLowerRightLon(lrLon);
|
|
/* preload fields of the query */
|
|
this.sQuery.addField(this.icao);
|
|
this.sQuery.addField(this.geometry);
|
|
}
|
|
|
|
/* mapping functions to the OSQ object */
|
|
ObsSpatialQuery.prototype.execute = _executeOSQ;
|
|
ObsSpatialQuery.prototype.addParameter = _addOSQParameter;
|
|
ObsSpatialQuery.prototype.setCount = _setOSQCount;
|
|
ObsSpatialQuery.prototype.setSortby = _setOSQSortValue;
|
|
ObsSpatialQuery.prototype.makeError = _makeError;
|
|
ObsSpatialQuery.prototype.setSpatialBounds = _setOSQSpatialBounds;
|
|
ObsSpatialQuery.prototype.addList = _addOSQList;
|
|
|
|
/* define a class to generate a image from a GRIB */
|
|
function GribImage(plugin) {
|
|
/* names of things */
|
|
this.plugin = plugin;
|
|
/* grid attributes */
|
|
this.grid = null;
|
|
this.geom = null;
|
|
this.crs = null;
|
|
/* image attributes */
|
|
this.colormap = "GribRGB";
|
|
this.format = "png";
|
|
this.scaleFactor = 3;
|
|
this.reproject = false;
|
|
}
|
|
function _executeGI() {
|
|
var gribMap = new GribMap(this.grib, this.colormap, this.grid, this.geom);
|
|
gribMap.setScaleFactor(this.scaleFactor);
|
|
var imageData = gribMap.execute();
|
|
this.geom = gribMap.getGridGeometry();
|
|
var colorMap = new ColorMapImage(this.colormap, imageData, this.geom);
|
|
var imageOut = null;
|
|
if(this.reproject){
|
|
var reproject = new ReprojectImage(colorMap.execute(), this.geom, this.crs);
|
|
var reprojectedImage = reproject.execute();
|
|
imageOut = new ImageOut(reprojectedImage, this.format, reproject.getGridGeometry());
|
|
}
|
|
else
|
|
{
|
|
imageOut = new ImageOut(colorMap.execute(), this.format,this.geom);
|
|
}
|
|
return imageOut.execute();
|
|
}
|
|
/* setters */
|
|
function _setGIGrid(grid) {
|
|
this.grid = grid;
|
|
}
|
|
function _setGIGeom(geom) {
|
|
this.geom = geom;
|
|
}
|
|
function _setGICrs(crs) {
|
|
this.crs = crs;
|
|
}
|
|
function _setGIColormap(colormap) {
|
|
this.colormap = colormap;
|
|
}
|
|
function _setGIFormat(format) {
|
|
this.format = format;
|
|
}
|
|
function _setGIScaleFactor(scale) {
|
|
this.scaleFactor = scale;
|
|
}
|
|
function _setGIReproject(reproject) {
|
|
this.reproject = reproject;
|
|
}
|
|
/* getters */
|
|
function _getGIGeom() {
|
|
return this.geom;
|
|
}
|
|
function _getGIFormat() {
|
|
return this.format;
|
|
}
|
|
|
|
/* map the functions to the class prototype */
|
|
GribImage.prototype.execute = _executeGI;
|
|
GribImage.prototype.setGrid = _setGIGrid;
|
|
GribImage.prototype.setGeom = _setGIGeom;
|
|
GribImage.prototype.getGeom = _getGIGeom;
|
|
GribImage.prototype.setCrs = _setGICrs;
|
|
GribImage.prototype.setColormap = _setGIColormap;
|
|
GribImage.prototype.setFormat = _setGIFormat;
|
|
GribImage.prototype.getFormat = _getGIFormat;
|
|
GribImage.prototype.setScaleFactor = _setGIScaleFactor;
|
|
GribImage.prototype.setReproject = _setGIReproject;
|
|
|
|
/* Define the class to perform the analysis */
|
|
function BarnesAnalysisWinds() {
|
|
/* names of things */
|
|
this.grib = "grib";
|
|
this.obs = "obs";
|
|
this.icao = "icao";
|
|
this.geometry = "geometry";
|
|
this.obParam = "windSpeed";
|
|
/* settings for Barnes Analysis */
|
|
this.radius = "50000.0";
|
|
this.weight = "0.50";
|
|
this.stations = "1";
|
|
this.passes = "1";
|
|
/* query objects */
|
|
this.gQuery = new GribWinds(this.grib,true);
|
|
this.oQuery = new ObsSpatialQuery(this.obs,this.obParam);
|
|
/* the image creator */
|
|
this.iMaker = new GribImage(this.grib);
|
|
/* the logger */
|
|
this.logger = new SystemLog();
|
|
}
|
|
|
|
function _execute() {
|
|
var response;
|
|
/* get the wind speed as a grib */
|
|
var wResult = this.gQuery.execute();
|
|
if (wResult.getClass().getSimpleName() != "FloatDataRecord") {
|
|
this.logger.log("warn","GRIB Winds creation failed.");
|
|
return wResult;
|
|
}
|
|
this.logger.log("info","GRIB Winds creation successful.");
|
|
var geom = this.gQuery.getGeom();
|
|
var crs = this.gQuery.getCRS();
|
|
|
|
/* get and geolocate the wind speed observations */
|
|
var oResult = this.oQuery.execute();
|
|
|
|
if(oResult.getClass().getSimpleName() != "ArrayList") {
|
|
this.logger.log("warn","Spatial ob query for " + this.obParam + " failed.");
|
|
return oResult;
|
|
}
|
|
this.logger.log("info","Spatial ob query for " + this.obParam + " successful.");
|
|
|
|
/* setup the analyzer and perform the analysis */
|
|
var analyzer = new ObjectiveAnalysis(wResult,
|
|
geom,
|
|
crs,
|
|
oResult);
|
|
analyzer.addParameter("searchRadius",this.radius);
|
|
analyzer.addParameter("weight",this.weight);
|
|
analyzer.addParameter("minNoStns",this.stations);
|
|
analyzer.addParameter("numPasses",this.passes);
|
|
analyzer.addParameter("extrapolate","true");
|
|
var analyzed = analyzer.execute();
|
|
|
|
/* create the derived image */
|
|
this.iMaker.setGrid(analyzed);
|
|
this.iMaker.setCrs(crs);
|
|
this.iMaker.setGeom(geom);
|
|
var imageOut = this.iMaker.execute();
|
|
geom = this.iMaker.getGeom();
|
|
var format = this.iMaker.getFormat();
|
|
|
|
/* write the image to the file and return the response */
|
|
var fileOut = new FileOut(imageOut, format);
|
|
var writeFile = fileOut.execute();
|
|
var makeResponse = new MakeResponseUri(writeFile,
|
|
null,
|
|
this.gQuery.getDataURI(),
|
|
this.format);
|
|
return makeResponse.execute();
|
|
}
|
|
|
|
/* helper methods */
|
|
function _makeError(message,query) {
|
|
var response = new MakeResponseNull(message,query);
|
|
return response.execute();
|
|
}
|
|
|
|
/* setters for query objects */
|
|
function _addParameter(grid,name,value) {
|
|
var query = (grid)?this.gQuery:this.oQuery;
|
|
query.addParameter(name,value);
|
|
}
|
|
function _addList(grid,name,value) {
|
|
var query = (grid)?this.gQuery:this.oQuery;
|
|
query.addParameter(name,value,"in");
|
|
}
|
|
function _setSortValue(grid,sortValue) {
|
|
var query = (grid)?this.gQuery:this.oQuery;
|
|
query.setSortby(sortValue);
|
|
}
|
|
function _setCount(grid,count) {
|
|
var query = (grid)?this.gQuery:this.oQuery;
|
|
query.setCount(count);
|
|
}
|
|
/* setters for image creation parameters */
|
|
function _setScaleFactor(scale) {
|
|
this.iMaker.setScaleFactor(scale);
|
|
}
|
|
|
|
function _reprojectImage(reproject) {
|
|
this.iMaker.setReproject(reproject);
|
|
}
|
|
|
|
function _setColorMap(colormap){
|
|
this.iMaker.setColormap(colormap);
|
|
}
|
|
|
|
function _setFormat(format){
|
|
this.iMaker.setFormat(format);
|
|
}
|
|
|
|
/* setters for the spatial query */
|
|
function _setSpatialBounds(ulLat, ulLon, lrLat, lrLon) {
|
|
this.oQuery.setSpatialBounds(ulLat,
|
|
ulLon,
|
|
lrLat,
|
|
lrLon,
|
|
this.icao,
|
|
this.geometry);
|
|
}
|
|
|
|
/* setters for Barnes Analysis */
|
|
function _setBarnesParameters(radius,weight,stations,passes) {
|
|
this.radius = radius;
|
|
this.weight = weight;
|
|
this.stations = stations;
|
|
this.passes = passes;
|
|
}
|
|
|
|
/* mapping functions to the object */
|
|
BarnesAnalysisWinds.prototype.execute = _execute;
|
|
BarnesAnalysisWinds.prototype.addParameter = _addParameter;
|
|
BarnesAnalysisWinds.prototype.addList = _addList;
|
|
BarnesAnalysisWinds.prototype.setSortValue = _setSortValue;
|
|
BarnesAnalysisWinds.prototype.setCount = _setCount;
|
|
BarnesAnalysisWinds.prototype.setScaleFactor = _setScaleFactor;
|
|
BarnesAnalysisWinds.prototype.reprojectImage = _reprojectImage;
|
|
BarnesAnalysisWinds.prototype.setColorMap = _setColorMap;
|
|
BarnesAnalysisWinds.prototype.setFormat = _setFormat;
|
|
BarnesAnalysisWinds.prototype.setSpatialBounds = _setSpatialBounds;
|
|
BarnesAnalysisWinds.prototype.setBarnesParameters = _setBarnesParameters;
|
|
BarnesAnalysisWinds.prototype.makeError = _makeError;
|
|
|
|
var runner = new BarnesAnalysisWinds();
|
|
/* setup the basic grib queries */
|
|
runner.addParameter(true,"levelinfo","10.0_m");
|
|
runner.addParameter(true,"forecasttime","0");
|
|
runner.addParameter(true,"gridid",212);
|
|
runner.setSortValue(true,"basetime");
|
|
runner.setCount(true,1);
|
|
/* setup the basic obs query */
|
|
runner.addParameter(false,"refhour","20070601190000");
|
|
runner.setSortValue(false,"timeobs");
|
|
runner.setCount(false,0);
|
|
/* setup the spatial search parameters */
|
|
runner.setSpatialBounds(43.00, -98.00, 37.00, -92.00);
|
|
/* setup the Barnes analysis paramters */
|
|
runner.setBarnesParameters("50000.0","0.50","1","1");
|
|
/* set image properties */
|
|
runner.setColorMap("GribRGB");
|
|
runner.setFormat("png");
|
|
runner.setScaleFactor(3.0);
|
|
/* execute the script */
|
|
runner.execute();
|
|
|