diff --git a/Code/UtilitiesAdapters/OssimAdapters/otbAeronetFileReader.cxx b/Code/UtilitiesAdapters/OssimAdapters/otbAeronetFileReader.cxx index e22deb5d5c8c2f84a50b3a7f0b1a1aa6dc35fb76..e27f545765cec77550bf66070d2cc41b34860644 100644 --- a/Code/UtilitiesAdapters/OssimAdapters/otbAeronetFileReader.cxx +++ b/Code/UtilitiesAdapters/OssimAdapters/otbAeronetFileReader.cxx @@ -23,44 +23,46 @@ #include "otbMath.h" #include "otbAeronetData.h" -#include "ossim/base/ossimDate.h" - namespace otb { namespace internal { -/** - * Generate date method - */ -ossimLocalTm -ParseDate(const std::string& date, const std::string& time) + +typedef struct +{ + int year; + int month; + int day; + int hour; + int minute; + int second; +} Date; + +double GetJulian(const Date& date) +{ + // From + // http://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_Day_Number + // the value is slightly different than the one provided by the ossim + // method, but this is now correct according to + // http://aa.usno.navy.mil/data/docs/JulianDate.php + int a = (14-date.month)/12.0; + int y = date.year + 4800 - a; + int m = date.month + 12 * a - 3; + int jdn = date.day + (153 * m +2)/5 + 365*y + y/4 - y/100 + y/400 - 32045; + return jdn + (date.hour-12)/24. + date.minute/1440. + date.second/86400.; +} + +Date ParseDate(const std::string& d, const std::string& t) { - ossimLocalTm currentDate; - ossimString word(""); - word = date[0]; - word += date[1]; - currentDate.setDay(word.toInt()); - word = date[3]; - word += date[4]; - currentDate.setMonth(word.toInt()); - word = date[6]; - word += date[7]; - word += date[8]; - word += date[9]; - currentDate.setYear(word.toInt()); - - word = time[0]; - word += time[1]; - currentDate.setHour(word.toInt()); - word = time[3]; - word += time[4]; - currentDate.setMin(word.toInt()); - word = time[6]; - word += time[7]; - currentDate.setSec(word.toInt()); - - return currentDate; + Date date; + date.day = atoi(d.substr(0,2).c_str()); + date.month = atoi(d.substr(3,2).c_str()); + date.year = atoi(d.substr(6,4).c_str()); + date.hour = atoi(t.substr(0,2).c_str()); + date.minute = atoi(t.substr(3,2).c_str()); + date.second = atoi(t.substr(6,2).c_str()); + return date; } } @@ -157,8 +159,8 @@ AeronetFileReader unsigned int col_vapor = 19; unsigned int col_solarZenithAngle = 44; - ossimLocalTm current_date = internal::ParseDate(line[col_date], line[col_time]); - double dcurrent_date = current_date.getJulian(); + internal::Date current_date = internal::ParseDate(line[col_date], line[col_time]); + double dcurrent_date = GetJulian(current_date); // Check hour +/- epsilon if (vcl_abs(dcurrent_date - ref_date) < epsilon) { @@ -271,14 +273,8 @@ AeronetFileReader } //Compute input date - ossimLocalTm inputDate; - inputDate.setDay(m_Day); - inputDate.setMonth(m_Month); - inputDate.setYear(m_Year); - inputDate.setHour(m_Hour); - inputDate.setMin(m_Minute); - inputDate.setSec(0); - double dinputDate = inputDate.getJulian(); + internal::Date date = {m_Year, m_Month, m_Day, m_Hour, m_Minute, 0}; + double dinputDate = internal::GetJulian(date); MatrixString tabStr; // if so, parse it and select only valid lines for the input date @@ -292,10 +288,10 @@ AeronetFileReader // Select only valid lines: good day if (listStr.size() > 0) { - ossimLocalTm currentDate = internal::ParseDate(listStr[col_date], listStr[col_time]); + internal::Date currentDate = internal::ParseDate(listStr[col_date], listStr[col_time]); if ((listStr[col_670] != "N/A") && (listStr[col_440] != "N/A") && - (static_cast<int>(currentDate.getJulian()) == static_cast<int>(dinputDate)) + (static_cast<int>(GetJulian(currentDate)) == static_cast<int>(dinputDate)) ) { tabStr.push_back(listStr); @@ -312,17 +308,10 @@ AeronetFileReader } //Compute time for one hour - ossimLocalTm temp; - temp.setDay(m_Day); - temp.setMonth(m_Month); - temp.setYear(m_Year); - temp.setMin(0); - temp.setSec(0); - - temp.setHour(10); - double dhour1 = temp.getJulian(); - temp.setHour(11); - double dhour2 = temp.getJulian(); + internal::Date temp = {m_Year, m_Month, m_Day, 10, 0, 0}; + double dhour1 = internal::GetJulian(temp); + temp.hour = 11; + double dhour2 = internal::GetJulian(temp); // Update epsilon for one hour double epsilon = m_Epsilon * (dhour2 - dhour1); @@ -333,7 +322,6 @@ AeronetFileReader for (unsigned int idCurrentLine = 0; idCurrentLine < tabStr.size(); idCurrentLine++) { VectorString current_line2 = tabStr[idCurrentLine]; - ossimLocalTm currentDate = internal::ParseDate(current_line2[col_date], current_line2[col_time]); ParseValidLine(dinputDate, current_line2, epsilon, water, angst, tau_day, solarZenithAngle); }