49 const double longitudeRad = latLonPoint.
x() * M_PI / 180.0;
50 const double latitudeRad = latLonPoint.
y() * M_PI / 180.0;
52 const QDateTime utcTime = dateTime.toUTC();
54 memset( &ut_tm, 0,
sizeof(
struct tm ) );
55 ut_tm.tm_year = utcTime.date().year() - 1900;
56 ut_tm.tm_mon = utcTime.date().month() - 1;
57 ut_tm.tm_mday = utcTime.date().day();
58 ut_tm.tm_hour = utcTime.time().hour();
59 ut_tm.tm_min = utcTime.time().minute();
60 ut_tm.tm_sec = utcTime.time().second();
63 const sol_pos realPos = SPA( &ut_tm,
nullptr, 0.0, longitudeRad, latitudeRad, elevationMeters );
70 const sol_pos apparentPos = ApSolposBennet( realPos,
nullptr, elevationMeters, pressure, temperature );
71 if ( apparentPos.E != 0 )
77 result.
azimuth = apparentPos.a * 180.0 / M_PI;
78 const double zenithDegrees = apparentPos.z * 180.0 / M_PI;
82 const solar_day dayEvents = SolarDay( &ut_tm,
nullptr, 0.0, longitudeRad, latitudeRad, elevationMeters,
nullptr, pressure, temperature, ApSolposBennet );
84 auto extractEvent = [](
const solar_day &sd,
int index ) -> QDateTime {
85 if ( sd.status[index] == _FREESPA_EV_ERR )
89 else if ( sd.status[index] == _FREESPA_EV_OK )
91 return QDateTime( QDate( sd.ev[index].tm_year + 1900, sd.ev[index].tm_mon + 1, sd.ev[index].tm_mday ), QTime( sd.ev[index].tm_hour, sd.ev[index].tm_min, sd.ev[index].tm_sec ), Qt::UTC );
101 result.
sunrise = extractEvent( dayEvents, 3 );
102 result.
sunset = extractEvent( dayEvents, 4 );
104 result.
civilDawn = extractEvent( dayEvents, 5 );
105 result.
civilDusk = extractEvent( dayEvents, 6 );
static QgsSunPositionResult calculate(const QgsPointXY &point, const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context, const QDateTime &dateTime, double elevationMeters=0.0, double pressure=1013.25, double temperature=15.0)
Calculates the solar position and events for a given point and time.