You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
4.0 KiB
182 lines
4.0 KiB
1 year ago
|
#pragma once
|
||
|
#include "BFileR.h"
|
||
|
#include "actiondep.h"
|
||
|
|
||
|
//using michlib::message;
|
||
|
|
||
|
class InterpolateMethods
|
||
|
{
|
||
|
protected:
|
||
|
enum class Mode
|
||
|
{
|
||
|
INVALID,
|
||
|
VYLETSTART,
|
||
|
VYLETEND
|
||
|
};
|
||
|
struct DataPoint
|
||
|
{
|
||
|
real lon, lat;
|
||
|
MDateTime t;
|
||
|
};
|
||
|
|
||
|
class VyletFile
|
||
|
{
|
||
|
michlib::BFileR fr;
|
||
|
bool invtime;
|
||
|
bool usestart;
|
||
|
MDateTime beg, end, t0;
|
||
|
michlib::CompiledParser xy2lon, xy2lat;
|
||
|
real x, y;
|
||
|
|
||
|
public:
|
||
|
MString Open(const MString& name, Mode mode);
|
||
|
};
|
||
|
|
||
|
static Mode GetMode(const CLArgs& args);
|
||
|
};
|
||
|
|
||
|
ADD_ACTION(Interpolate, interpolate, CanInterpolate2D<Source>, InterpolateMethods);
|
||
|
|
||
|
template<class D> MString ActionInterpolate::DoAction(const CLArgs& args, D& ds)
|
||
|
{
|
||
|
Mode mode = GetMode(args);
|
||
|
if(mode == Mode::INVALID) return "Unknown mode";
|
||
|
|
||
|
if(!args.contains("in")) return "No vylet data file specified";
|
||
|
MString in = args.at("in");
|
||
|
|
||
|
if(!args.contains("out")) return "No output file specified";
|
||
|
MString out = args.at("out");
|
||
|
|
||
|
michlib::BFileR fr;
|
||
|
if(fr.Open(in) != ERR_NOERR) return "Can't open file " + in;
|
||
|
|
||
|
std::vector<struct DataPoint> datapoints;
|
||
|
{
|
||
|
bool invtime;
|
||
|
{
|
||
|
fr.UsePrefix("");
|
||
|
MString method = fr.ParameterSValue("Method", "");
|
||
|
if(method == "Bicubic" || method == "BicubicL")
|
||
|
invtime = false;
|
||
|
else if(method == "BicubicI" || method == "BicubicIL")
|
||
|
invtime = true;
|
||
|
else
|
||
|
return "Unknown method in the file " + in;
|
||
|
}
|
||
|
|
||
|
MDateTime beg, end;
|
||
|
{
|
||
|
fr.UsePrefix("Datafile_Info");
|
||
|
MString s;
|
||
|
s = fr.ParameterSValue("BeginDate", "");
|
||
|
beg.FromString(s);
|
||
|
s = fr.ParameterSValue("EndDate", "");
|
||
|
end.FromString(s);
|
||
|
}
|
||
|
|
||
|
MDateTime t0;
|
||
|
{
|
||
|
fr.UsePrefix("");
|
||
|
auto tbeg = static_cast<time_t>(fr.ParameterRValue("tbeg", 0.0) * 86400);
|
||
|
if(invtime)
|
||
|
{
|
||
|
t0 = end;
|
||
|
t0.AddSeconds(-tbeg);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
t0 = beg;
|
||
|
t0.AddSeconds(tbeg);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
michlib::CompiledParser xy2lon, xy2lat;
|
||
|
real x, y;
|
||
|
michlib::ParserVars pv;
|
||
|
|
||
|
pv["x"] = &x;
|
||
|
pv["y"] = &y;
|
||
|
|
||
|
fr.UsePrefix("Datafile_Info");
|
||
|
if(!ArifmeticCompiler(fr.ParameterSValue("xy2lon", ""), xy2lon, &pv)) return "Can't find xy2lon in the file " + in;
|
||
|
if(!ArifmeticCompiler(fr.ParameterSValue("xy2lat", ""), xy2lat, &pv)) return "Can't find xy2lat in the file " + in;
|
||
|
|
||
|
auto resop = ds.Open(args);
|
||
|
if(resop.Exist()) return "Can't open source: " + resop;
|
||
|
|
||
|
for(size_t i = 0; i < fr.Rows(); i++)
|
||
|
{
|
||
|
if(mode == Mode::VYLETSTART)
|
||
|
{
|
||
|
x = fr[0][i];
|
||
|
y = fr[1][i];
|
||
|
real lon, lat;
|
||
|
xy2lon.Run(lon);
|
||
|
xy2lat.Run(lat);
|
||
|
datapoints.emplace_back(lon, lat, t0);
|
||
|
}
|
||
|
if(mode == Mode::VYLETEND)
|
||
|
{
|
||
|
x = fr[2][i];
|
||
|
y = fr[3][i];
|
||
|
real lon, lat;
|
||
|
xy2lon.Run(lon);
|
||
|
xy2lat.Run(lat);
|
||
|
time_t t = static_cast<time_t>(fr[4][i] * 86400);
|
||
|
MDateTime time = invtime ? end : beg;
|
||
|
time.AddSeconds((invtime ? -1 : 1) * t);
|
||
|
datapoints.emplace_back(lon, lat, time);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(datapoints.size() == 0) return "No data readed from file " + in;
|
||
|
|
||
|
struct Region reg;
|
||
|
reg.lonb = datapoints[0].lon;
|
||
|
reg.lone = datapoints[0].lon;
|
||
|
reg.latb = datapoints[0].lat;
|
||
|
reg.late = datapoints[0].lat;
|
||
|
|
||
|
for(const auto& p: datapoints)
|
||
|
{
|
||
|
if(p.lon < reg.lonb) reg.lonb = p.lon;
|
||
|
if(p.lat < reg.latb) reg.latb = p.lat;
|
||
|
if(p.lon > reg.lone) reg.lone = p.lon;
|
||
|
if(p.lat > reg.late) reg.late = p.lat;
|
||
|
}
|
||
|
|
||
|
return "";
|
||
|
/*
|
||
|
|
||
|
if(!args.contains("var")) return "Variable not specified";
|
||
|
MString vname = args.at("var");
|
||
|
if(!ds.CheckVar(vname)) return "Variable " + vname + " not exists in this dataset";
|
||
|
pars.SetParameter("variable", vname);
|
||
|
|
||
|
std::unique_ptr<const BaseParameters> sourcepars;
|
||
|
if constexpr(ParametersSupported<D>)
|
||
|
{
|
||
|
if constexpr(ParametersRequiredRegion<D>)
|
||
|
{
|
||
|
auto [p, err] = ds.Parameters(pars, args, reg);
|
||
|
if(err.Exist()) return err;
|
||
|
sourcepars.reset(p);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
auto [p, err] = ds.Parameters(pars, args);
|
||
|
if(err.Exist()) return err;
|
||
|
sourcepars.reset(p);
|
||
|
}
|
||
|
}
|
||
|
auto p = sourcepars.get();
|
||
|
|
||
|
auto data = Read(ds, vname, p, tindexes);
|
||
|
if(!data) return "Can't read data";
|
||
|
|
||
|
return "";
|
||
|
*/
|
||
|
};
|