diff --git a/agrolib/climate/climate.cpp b/agrolib/climate/climate.cpp index 6967d6846..11726a034 100644 --- a/agrolib/climate/climate.cpp +++ b/agrolib/climate/climate.cpp @@ -897,6 +897,7 @@ float loadHourlyVarSeries_SaveOutput(Crit3DMeteoPointsDbHandler *meteoPointsDbHa int nrValidValues = 0; // fills the missing initial output data + firstDateTimeDB.setTimeSpec(Qt::UTC); int nrMissingHours = firstTime.secsTo(firstDateTimeDB) / 3600; for (int i = 1; i <= nrMissingHours; i++) { @@ -919,7 +920,8 @@ float loadHourlyVarSeries_SaveOutput(Crit3DMeteoPointsDbHandler *meteoPointsDbHa } // fills the missing final output data - QDateTime lastDateTimeDB = firstDateTimeDB.addSecs(hourlyValues.size() * 3600); + int nrDataHours = int(hourlyValues.size()) -1; + QDateTime lastDateTimeDB = firstDateTimeDB.addSecs(nrDataHours * 3600); nrMissingHours = lastDateTimeDB.secsTo(lastTime) / 3600; for (int i = 1; i <= nrMissingHours; i++) { @@ -1074,6 +1076,7 @@ float loadHourlyVarSeries(Crit3DMeteoPointsDbHandler* meteoPointsDbHandler, } QDateTime currentDateTime = firstDateTimeDB; + currentDateTime.setTimeSpec(Qt::UTC); for (unsigned int i = 0; i < hourlyValues.size(); i++) { quality::qualityType qualityT = qualityCheck.syntacticQualitySingleValue(variable, hourlyValues[i]); @@ -2198,8 +2201,8 @@ bool preElaboration(Crit3DMeteoPointsDbHandler* meteoPointsDbHandler, Crit3DMete case dailyLeafWetness: { if (loadHourlyVarSeries(meteoPointsDbHandler, meteoGridDbHandler, meteoPoint, isMeteoGrid, leafWetness, - QDateTime(startDate,QTime(1,0,0),Qt::UTC), - QDateTime(endDate.addDays(1),QTime(0,0,0),Qt::UTC), myError) > 0) + QDateTime(startDate, QTime(1,0,0), Qt::UTC), + QDateTime(endDate.addDays(1), QTime(0,0,0), Qt::UTC), myError) > 0) { myResult = elaborateDailyAggregatedVar(dailyLeafWetness, *meteoPoint, outputValues, percValue, meteoSettings); } @@ -2208,8 +2211,8 @@ bool preElaboration(Crit3DMeteoPointsDbHandler* meteoPointsDbHandler, Crit3DMete case dailyTemperatureHoursAbove: { if (loadHourlyVarSeries(meteoPointsDbHandler, meteoGridDbHandler, meteoPoint, isMeteoGrid, airTemperature, - QDateTime(startDate,QTime(1,0,0),Qt::UTC), - QDateTime(endDate.addDays(1),QTime(0,0,0),Qt::UTC), myError) > 0) + QDateTime(startDate, QTime(1,0,0), Qt::UTC), + QDateTime(endDate.addDays(1), QTime(0,0,0), Qt::UTC), myError) > 0) { myResult = elaborateDailyAggregatedVar(dailyTemperatureHoursAbove, *meteoPoint, outputValues, percValue, meteoSettings); } diff --git a/agrolib/dbMeteoGrid/dbMeteoGrid.cpp b/agrolib/dbMeteoGrid/dbMeteoGrid.cpp index 932e1f77b..06b2d3d81 100644 --- a/agrolib/dbMeteoGrid/dbMeteoGrid.cpp +++ b/agrolib/dbMeteoGrid/dbMeteoGrid.cpp @@ -2445,7 +2445,7 @@ std::vector Crit3DMeteoGridDbHandler::loadGridDailyVar(const QString &met int varCode = getDailyVarCode(variable); if (varCode == NODATA) { - errorStr = "Variable not existing"; + errorStr = "The variable does not exist in this meteo grid"; return dailyVarList; } @@ -2529,7 +2529,7 @@ std::vector Crit3DMeteoGridDbHandler::exportAllDataVar(QString *errorStr, idVar = getDailyVarCode(variable); if (idVar == NODATA) { - *errorStr = "Variable not existing"; + *errorStr = "The variable does not exist in this meteo grid"; return allDataVarList; } tableName = _tableDaily.prefix + id + _tableDaily.postFix; @@ -2543,7 +2543,7 @@ std::vector Crit3DMeteoGridDbHandler::exportAllDataVar(QString *errorStr, idVar = getHourlyVarCode(variable); if (idVar == NODATA) { - *errorStr = "Variable not existing"; + *errorStr = "The variable does not exist in this meteo grid"; return allDataVarList; } tableName = _tableHourly.prefix + id + _tableHourly.postFix; @@ -2615,7 +2615,7 @@ std::vector Crit3DMeteoGridDbHandler::loadGridDailyVarFixedFields(const Q if (varCode == NODATA) { - errorStr = "Variable not existing"; + errorStr = "The variable does not exist in this meteo grid"; return dailyVarList; } @@ -2700,7 +2700,7 @@ std::vector Crit3DMeteoGridDbHandler::loadGridHourlyVar(meteoVariable var int varCode = getHourlyVarCode(variable); if (varCode == NODATA) { - errorStr = "Variable not existing"; + errorStr = "The variable does not exist in this meteo grid"; return hourlyVarList; } @@ -2711,54 +2711,53 @@ std::vector Crit3DMeteoGridDbHandler::loadGridHourlyVar(meteoVariable var } QString statement = QString("SELECT * FROM `%1` WHERE VariableCode = '%2' AND `%3` >= '%4' AND `%3` <= '%5' ORDER BY `%3`") - .arg(tableH).arg(varCode).arg(_tableHourly.fieldTime, - firstTime.toString("yyyy-MM-dd hh:mm"), lastTime.toString("yyyy-MM-dd hh:mm")); + .arg(tableH).arg(varCode) + .arg(_tableHourly.fieldTime, firstTime.toString("yyyy-MM-dd hh:mm"), lastTime.toString("yyyy-MM-dd hh:mm")); if(! qry.exec(statement) ) { errorStr = qry.lastError().text(); + return hourlyVarList; } - else + + while (qry.next()) { - while (qry.next()) + if (firstRow) { - if (firstRow) + if (! getValue(qry.value(_tableHourly.fieldTime), &firstDateTimeDB)) { - if (! getValue(qry.value(_tableHourly.fieldTime), &firstDateTimeDB)) - { - errorStr = "Missing fieldTime"; - return hourlyVarList; - } + errorStr = "Missing fieldTime"; + return hourlyVarList; + } - if (! getValue(qry.value("Value"), &value)) - { - errorStr = "Missing Value"; - } - hourlyVarList.push_back(value); - previousDateTime = firstDateTimeDB; - firstRow = false; + if (! getValue(qry.value("Value"), &value)) + { + errorStr = "Missing Value"; } - else + hourlyVarList.push_back(value); + previousDateTime = firstDateTimeDB; + firstRow = false; + } + else + { + if (! getValue(qry.value(_tableHourly.fieldTime), &dateTime)) { - if (! getValue(qry.value(_tableHourly.fieldTime), &dateTime)) - { - errorStr = "Missing fieldTime"; - return hourlyVarList; - } - - int missingHours = previousDateTime.secsTo(dateTime) / 3600 - 1; - for (int i = 1; i <= missingHours; i++) - { - hourlyVarList.push_back(NODATA); - } + errorStr = "Missing fieldTime"; + return hourlyVarList; + } - if (! getValue(qry.value("Value"), &value)) - { - errorStr = "Missing Value"; - } + int missingHours = previousDateTime.secsTo(dateTime) / 3600 - 1; + for (int i = 1; i <= missingHours; i++) + { + hourlyVarList.push_back(NODATA); + } - hourlyVarList.push_back(value); - previousDateTime = dateTime; + if (! getValue(qry.value("Value"), &value)) + { + errorStr = "Missing Value"; } + + hourlyVarList.push_back(value); + previousDateTime = dateTime; } } @@ -2784,7 +2783,7 @@ std::vector Crit3DMeteoGridDbHandler::loadGridHourlyVarFixedFields(meteoV if (varCode == NODATA) { - errorStr = "Variable not existing"; + errorStr = "The variable does not exist in this meteo grid"; return hourlyVarList; } diff --git a/agrolib/pragaProject/pragaProject.cpp b/agrolib/pragaProject/pragaProject.cpp index 2ee7307e9..8e68ec614 100644 --- a/agrolib/pragaProject/pragaProject.cpp +++ b/agrolib/pragaProject/pragaProject.cpp @@ -918,7 +918,7 @@ bool PragaProject::elaborationCyclePoints(bool isAnomaly, bool showInfo) // check dates - leap case if (climaUsed->genericPeriodDateStart().month() == 2 && climaUsed->genericPeriodDateStart().day() == 29) { - if (!isLeapYear(myYearStart)) + if (! isLeapYear(myYearStart)) { if (climaUsed->periodType() != dailyPeriod) { @@ -932,7 +932,7 @@ bool PragaProject::elaborationCyclePoints(bool isAnomaly, bool showInfo) } if (climaUsed->genericPeriodDateEnd().month() == 2 && climaUsed->genericPeriodDateEnd().day() == 29) { - if (!isLeapYear(myYearEnd)) + if (! isLeapYear(myYearEnd)) { if (climaUsed->periodType() != dailyPeriod) { @@ -946,13 +946,7 @@ bool PragaProject::elaborationCyclePoints(bool isAnomaly, bool showInfo) } } - -// if (clima->elab1() == "phenology") -// { -// Then currentPheno.setPhenoPoint i; // TODO -// } - - int validPoints = 0; + int nrValidPoints = 0; Crit3DMeteoPoint* meteoPointTemp = new Crit3DMeteoPoint; bool dataAlreadyLoaded = false; @@ -974,61 +968,102 @@ bool PragaProject::elaborationCyclePoints(bool isAnomaly, bool showInfo) meteoPointTemp->nrObsDataDaysD = 0; if (showInfo && (i % infoStep) == 0) - updateProgressBar(i); + updateProgressBar(i); if (isAnomaly && climaUsed->getIsClimateAnomalyFromDb()) { if ( passingClimateToAnomaly(&errorString, meteoPointTemp, climaUsed, meteoPoints, nrMeteoPoints, clima->getElabSettings()) ) - { - validPoints++; - } + nrValidPoints++; } else { bool isMeteoGrid = false; if ( elaborationOnPoint(&errorString, meteoPointsDbHandler, nullptr, meteoPointTemp, climaUsed, isMeteoGrid, startDate, endDate, isAnomaly, meteoSettings, dataAlreadyLoaded)) - { - validPoints++; - } + nrValidPoints++; } - // save result to MP meteoPoints[i].elaboration = meteoPointTemp->elaboration; meteoPoints[i].anomaly = meteoPointTemp->anomaly; meteoPoints[i].anomalyPercentage = meteoPointTemp->anomalyPercentage; } - - } // end for + } if (showInfo) closeProgressBar(); delete meteoPointTemp; delete climaUsed; - if (validPoints == 0) + if (nrValidPoints == 0) { if (errorString.isEmpty()) { errorString = "No valid points available:"; - errorString += "\ncheck Settings->Parameters->Meteo->minimum percentage of valid data [%]"; + errorString += "\nCheck Settings->Parameters->Meteo->minimum percentage of valid data [%]"; } return false; } - else return true; + return true; } bool PragaProject::elaborationCyclePointsHourly(bool showInfo) { - // initialize + Crit3DClimate* currentElaboration = new Crit3DClimate(); + currentElaboration->copyParam(clima); + Crit3DMeteoPoint* meteoPointTemp = new Crit3DMeteoPoint; + + int infoStep; + if (showInfo) + { + infoStep = setProgressBar("Elaboration - Meteo Points", nrMeteoPoints); + } + + int nrValidPoints = 0; + bool isMeteoGrid = false; + for (int i = 0; i < nrMeteoPoints; i++) { + if (showInfo && (i % infoStep) == 0) + updateProgressBar(i); + + // initialize meteoPoints[i].elaboration = NODATA; meteoPoints[i].anomaly = NODATA; meteoPoints[i].anomalyPercentage = NODATA; + + if (meteoPoints[i].active) + { + // copy data to meteoPointTemp + meteoPointTemp->id = meteoPoints[i].id; + meteoPointTemp->point.z = meteoPoints[i].point.z; + meteoPointTemp->latitude = meteoPoints[i].latitude; + + // meteoPointTemp should be init + meteoPointTemp->nrObsDataDaysH = 0; + meteoPointTemp->nrObsDataDaysD = 0; + + if (elaborationOnPointHourly(meteoPointsDbHandler, nullptr, meteoPointTemp, + isMeteoGrid, currentElaboration, meteoSettings, errorString)) + { + nrValidPoints++; + meteoPoints[i].elaboration = meteoPointTemp->elaboration; + } + } } + if (showInfo) closeProgressBar(); - // TODO + delete meteoPointTemp; + delete currentElaboration; + + if (nrValidPoints == 0) + { + if (errorString.isEmpty()) + { + errorString = "No valid points available:"; + errorString += "\nCheck Settings->Parameters->Meteo->minimum percentage of valid data [%]"; + } + return false; + } return true; } @@ -1043,6 +1078,7 @@ bool PragaProject::elaborationCycleGridHourly(bool showInfo) Crit3DClimate* currentElaboration = new Crit3DClimate(); currentElaboration->copyParam(clima); + Crit3DMeteoPoint* meteoPointTemp = new Crit3DMeteoPoint; int infoStep = 1; if (showInfo) @@ -1062,8 +1098,12 @@ bool PragaProject::elaborationCycleGridHourly(bool showInfo) { Crit3DMeteoPoint* meteoPoint = meteoGridDbHandler->meteoGrid()->meteoPointPointer(row,col); + // initialize + meteoPoint->elaboration = NODATA; + meteoPoint->anomaly = NODATA; + meteoPoint->anomalyPercentage = NODATA; + // copy data to meteoPointTemp - Crit3DMeteoPoint* meteoPointTemp = new Crit3DMeteoPoint; meteoPointTemp->id = meteoPoint->id; meteoPointTemp->point.z = meteoPoint->point.z; meteoPointTemp->latitude = meteoPoint->latitude; @@ -1077,26 +1117,21 @@ bool PragaProject::elaborationCycleGridHourly(bool showInfo) isMeteoGrid, currentElaboration, meteoSettings, errorString)) { nrValidCells++; + meteoPoint->elaboration = meteoPointTemp->elaboration; } - - // save result to MP - meteoPoint->elaboration = meteoPointTemp->elaboration; - meteoPoint->anomaly = NODATA; - meteoPoint->anomalyPercentage = NODATA; - - delete meteoPointTemp; } } } - if (showInfo) closeProgressBar(); + + delete meteoPointTemp; delete currentElaboration; if (nrValidCells == 0) { if (errorString.isEmpty()) { - errorString = "No valid cells available."; + errorString = "Not enough data."; } return false; } @@ -1306,7 +1341,7 @@ bool PragaProject::elaborationCycleGrid(bool isAnomaly, bool showInfo) { if (errorString.isEmpty()) { - errorString = "no valid cells available"; + errorString = "Not enough data."; } delete climaUsed; return false; @@ -1426,7 +1461,7 @@ bool PragaProject::climateCyclePoints(bool showInfo) { if (errorString.isEmpty()) { - errorString = "no valid cells available"; + errorString = "Not enough data."; } logError(errorString); delete meteoPointTemp; @@ -1555,7 +1590,7 @@ bool PragaProject::climateCycleGrid(bool showInfo) { if (errorString.isEmpty()) { - errorString = "no valid cells available"; + errorString = "Not enough data."; } logError(errorString); delete meteoPointTemp; @@ -5034,7 +5069,7 @@ bool PragaProject::computeClimatePointXML(QString xmlName) { if (errorString.isEmpty()) { - errorString = "no valid cells available"; + errorString = "Not enough data."; } logError(errorString); delete meteoPointTemp; diff --git a/agrolib/utilities/utilities.cpp b/agrolib/utilities/utilities.cpp index 74a2f6b6e..91fd79400 100644 --- a/agrolib/utilities/utilities.cpp +++ b/agrolib/utilities/utilities.cpp @@ -57,7 +57,7 @@ bool fieldExists(const QSqlQuery &query, const QString fieldName) // return boolean (false if recordset is not valid) -bool getValue(QVariant myRs) +bool getValue(const QVariant &myRs) { if (! myRs.isValid() || myRs.isNull()) return false; @@ -67,7 +67,7 @@ bool getValue(QVariant myRs) } -bool getValue(QVariant myRs, int* myValue) +bool getValue(const QVariant &myRs, int* myValue) { *myValue = NODATA; @@ -87,7 +87,7 @@ bool getValue(QVariant myRs, int* myValue) } -bool getValue(QVariant myRs, float* myValue) +bool getValue(const QVariant &myRs, float* myValue) { *myValue = NODATA; @@ -107,7 +107,7 @@ bool getValue(QVariant myRs, float* myValue) } -bool getValue(QVariant myRs, double* myValue) +bool getValue(const QVariant &myRs, double* myValue) { *myValue = NODATA; @@ -127,38 +127,27 @@ bool getValue(QVariant myRs, double* myValue) } -bool getValue(QVariant myRs, QDate* myValue) +bool getValue(const QVariant &myRs, QDate* myValue) { - if (myRs.isNull()) + if (myRs.isNull() || myRs == "") return false; - else - { - if (myRs == "") - return false; - else - *myValue = myRs.toDate(); - } + *myValue = myRs.toDate(); return true; } -bool getValue(QVariant myRs, QDateTime* myValue) + +bool getValue(const QVariant &myRs, QDateTime* myValue) { - if (myRs.isNull()) + if (myRs.isNull() || myRs == "") return false; - else - { - if (myRs == "") - return false; - else - *myValue = myRs.toDateTime(); - } + *myValue = myRs.toDateTime(); return true; } -bool getValue(QVariant myRs, QString* myValue) +bool getValue(const QVariant &myRs, QString* myValue) { *myValue = ""; if (! myRs.isValid() || myRs.isNull()) return false; diff --git a/agrolib/utilities/utilities.h b/agrolib/utilities/utilities.h index da95752c0..0460c3148 100644 --- a/agrolib/utilities/utilities.h +++ b/agrolib/utilities/utilities.h @@ -32,13 +32,13 @@ QList getFieldsUpperCase(const QSqlQuery &query); bool fieldExists(const QSqlQuery &query, const QString fieldName); - bool getValue(QVariant myRs); - bool getValue(QVariant myRs, int* myValue); - bool getValue(QVariant myRs, float* myValue); - bool getValue(QVariant myRs, double* myValue); - bool getValue(QVariant myRs, QDate* myValue); - bool getValue(QVariant myRs, QDateTime* myValue); - bool getValue(QVariant myRs, QString* myValue); + bool getValue(const QVariant &myRs); + bool getValue(const QVariant &myRs, int* myValue); + bool getValue(const QVariant &myRs, float* myValue); + bool getValue(const QVariant &myRs, double* myValue); + bool getValue(const QVariant &myRs, QDate* myValue); + bool getValue(const QVariant &myRs, QDateTime* myValue); + bool getValue(const QVariant &myRs, QString* myValue); QString getFilePath(const QString &fileNameComplete); QString getFileName(const QString &fileNameComplete); diff --git a/src/mainWindow.cpp b/src/mainWindow.cpp index 6d72993b0..aff60d9c4 100644 --- a/src/mainWindow.cpp +++ b/src/mainWindow.cpp @@ -2103,6 +2103,8 @@ void MainWindow::on_actionElaboration_Hourly_data_triggered() this->ui->actionShowPointsElab->setEnabled(true); redrawMeteoPoints(showElaboration, true); } + + on_actionElaboration_Hourly_data_triggered(); }