QGIS API Documentation 3.99.0-Master (21b3aa880ba)
Loading...
Searching...
No Matches
qgsmeshdataprovidertemporalcapabilities.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmeshdataprovidertemporalcapabilities.cpp
3 -----------------------
4 begin : March 2020
5 copyright : (C) 2020 by Vincent Cloarec
6 email : vcloarec at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include "qgsunittypes.h"
21
24
26{
27 // No time --> non temporal dataset, so return the dataset that has to be the only one
28 const QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group];
29 if ( datasetTimes.isEmpty() )
30 return QgsMeshDatasetIndex( group, 0 );
31 const QDateTime groupReference = mGroupsReferenceDateTime[group];
32 const qint64 timeSinceGroupReference =
33 timeSinceGlobalReference - mGlobalReferenceDateTime.msecsTo( groupReference );
34
35 if ( timeSinceGroupReference > datasetTimes.last() // after last time
36 || timeSinceGroupReference < datasetTimes.first() ) // before first time
37 return QgsMeshDatasetIndex();
38
39 for ( int i = 1 ; i < datasetTimes.count(); ++i )
40 {
41 const qint64 time1 = datasetTimes.at( i - 1 );
42 const qint64 time2 = datasetTimes.at( i );
43 if ( time1 <= timeSinceGroupReference && timeSinceGroupReference <= time2 )
44 {
45 if ( abs( timeSinceGroupReference - time2 ) < abs( timeSinceGroupReference - time1 ) )
46 return QgsMeshDatasetIndex( group, i );
47 else
48 return QgsMeshDatasetIndex( group, i - 1 );
49 }
50 }
51
52 return QgsMeshDatasetIndex( QgsMeshDatasetIndex( group, datasetTimes.count() - 1 ) );
53}
54
56{
57 // No time --> non temporal dataset, so return the dataset that has to be the only one
58 const QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group];
59 if ( datasetTimes.isEmpty() )
60 return QgsMeshDatasetIndex( group, 0 );
61 const QDateTime groupReference = mGroupsReferenceDateTime[group];
62 const qint64 timeSinceGroupReference =
63 timeSinceGlobalReference - mGlobalReferenceDateTime.msecsTo( groupReference );
64
65 if ( timeSinceGroupReference > datasetTimes.last() // after last time
66 || timeSinceGroupReference < datasetTimes.first() ) // before first time
67 return QgsMeshDatasetIndex();
68
69 for ( int i = 1; i < datasetTimes.count(); ++i )
70 {
71 const qint64 time = datasetTimes.at( i );
72 if ( timeSinceGroupReference < time )
73 return QgsMeshDatasetIndex( group, i - 1 );
74 }
75
76 return QgsMeshDatasetIndex( QgsMeshDatasetIndex( group, datasetTimes.count() - 1 ) );
77}
78
79void QgsMeshDataProviderTemporalCapabilities::addGroupReferenceDateTime( int group, const QDateTime &reference )
80{
81 if ( ( !mGlobalReferenceDateTime.isValid() && reference.isValid() ) ||
82 ( reference.isValid() && mGlobalReferenceDateTime.isValid() && reference < mGlobalReferenceDateTime ) )
83 mGlobalReferenceDateTime = reference;
84
85 mGroupsReferenceDateTime[group] = reference;
86}
87
89{
90 QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group];
91 datasetTimes.append( time );
92}
93
95{
96 const qint64 unitTimeFactor = QgsUnitTypes::fromUnitToUnitFactor( mTemporalUnit, Qgis::TemporalUnit::Milliseconds );
97 addDatasetTimeInMilliseconds( group, time * unitTimeFactor );
98}
99
101{
102 return mGlobalReferenceDateTime.isValid();
103}
104
106{
107 return mGlobalReferenceDateTime;
108}
109
111{
112
113 return timeExtent( mGlobalReferenceDateTime );
114}
115
117{
118 QDateTime end;
119 QDateTime begin;
120 for ( QHash<int, QDateTime>::const_iterator it = mGroupsReferenceDateTime.constBegin() ;
121 it != mGroupsReferenceDateTime.constEnd(); ++it )
122 {
123 QDateTime groupReference = it.value();
124 if ( !groupReference.isValid() ) //the dataset group has not a valid reference time -->take global reference
125 groupReference = mGlobalReferenceDateTime;
126
127 if ( !groupReference.isValid() )
128 groupReference = reference;
129
130 const QList<qint64> times = mDatasetTimeSinceGroupReference[it.key()];
131 qint64 durationSinceFirst = groupReference.msecsTo( reference );
132 qint64 durationSinceLast = groupReference.msecsTo( reference );
133 if ( !times.isEmpty() )
134 {
135 durationSinceFirst += times.first();
136 durationSinceLast += times.last();
137 }
138
139 if ( !end.isValid() || groupReference.addMSecs( durationSinceLast ) > end )
140 end = groupReference.addMSecs( durationSinceLast );
141
142 if ( !begin.isValid() || groupReference.addMSecs( durationSinceFirst ) > begin )
143 begin = groupReference.addMSecs( durationSinceFirst );
144 }
145
146 return QgsDateTimeRange( begin, end );
147}
148
150{
151 mTemporalUnit = timeUnit;
152}
153
158
160{
161 if ( !index.isValid() )
163
164 const QList<qint64> &timesList = mDatasetTimeSinceGroupReference[index.group()];
165 if ( index.dataset() < timesList.count() )
166 return timesList.at( index.dataset() );
167 else
169}
170
172{
173 mGlobalReferenceDateTime = QDateTime();
174 mGroupsReferenceDateTime.clear();
175 mDatasetTimeSinceGroupReference.clear();
176}
177
179{
180 qint64 ret = -1;
181 if ( mDatasetTimeSinceGroupReference.contains( group ) )
182 {
183 const QList<qint64> times = mDatasetTimeSinceGroupReference[group];
184 if ( times.count() > 1 )
185 ret = times.at( 1 ) - times.at( 0 );
186 }
187 return ret;
188}
TemporalUnit
Temporal units.
Definition qgis.h:5159
@ Milliseconds
Milliseconds.
Definition qgis.h:5160
QgsDataProviderTemporalCapabilities(bool available=false)
Constructor for QgsDataProviderTemporalCapabilities.
void setTemporalUnit(Qgis::TemporalUnit temporalUnit)
Sets the temporal unit (temporalUnit) used to read data by the data provider.
void addDatasetTime(int group, double time)
Adds a time (in provider unit) from a dataset contained in group.
QDateTime referenceTime() const
Returns the reference time.
QgsMeshDatasetIndex datasetIndexClosestFromRelativeTime(int group, qint64 timeSinceGlobalReference) const
Returns the closest dataset index from the timeSinceGlobalReference.
bool hasReferenceTime() const
Returns whether the reference time is set.
QgsMeshDataProviderTemporalCapabilities()
Constructor for QgsMeshDataProviderTemporalCapabilities.
QgsDateTimeRange timeExtent() const
Returns the time extent using the internal reference time and the first and last times available from...
Qgis::TemporalUnit temporalUnit() const
Returns the temporal unit used to read data by the data provider.
QgsMeshDatasetIndex datasetIndexClosestBeforeRelativeTime(int group, qint64 timeSinceGlobalReference) const
Returns the last dataset with time less than or equal to timeSinceGlobalReference.
void addDatasetTimeInMilliseconds(int group, qint64 time)
Adds a time (in milliseconds) from a dataset contained in group.
void clear()
Clears all stored reference times and dataset times.
qint64 datasetTime(const QgsMeshDatasetIndex &index) const
Returns the relative time in milliseconds of the dataset.
void addGroupReferenceDateTime(int group, const QDateTime &reference)
Adds a reference date/time from a dataset group.
qint64 firstTimeStepDuration(int group) const
Returns the duration of the first time step of the dataset group with index group.
An index that identifies the dataset group (e.g.
bool isValid() const
Returns whether index is valid, ie at least groups is set.
int group() const
Returns a group index.
int dataset() const
Returns a dataset index within group().
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.
Definition qgsrange.h:761