QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
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
25
27{
28 // No time --> non temporal dataset, so return the dataset that has to be the only one
29 const QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group];
30 if ( datasetTimes.isEmpty() )
31 return QgsMeshDatasetIndex( group, 0 );
32 const QDateTime groupReference = mGroupsReferenceDateTime[group];
33 const qint64 timeSinceGroupReference = 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 = timeSinceGlobalReference - mGlobalReferenceDateTime.msecsTo( groupReference );
63
64 if ( timeSinceGroupReference > datasetTimes.last() // after last time
65 || timeSinceGroupReference < datasetTimes.first() ) // before first time
66 return QgsMeshDatasetIndex();
67
68 for ( int i = 1; i < datasetTimes.count(); ++i )
69 {
70 const qint64 time = datasetTimes.at( i );
71 if ( timeSinceGroupReference < time )
72 return QgsMeshDatasetIndex( group, i - 1 );
73 }
74
75 return QgsMeshDatasetIndex( QgsMeshDatasetIndex( group, datasetTimes.count() - 1 ) );
76}
77
78void QgsMeshDataProviderTemporalCapabilities::addGroupReferenceDateTime( int group, const QDateTime &reference )
79{
80 if ( ( !mGlobalReferenceDateTime.isValid() && reference.isValid() ) || ( reference.isValid() && mGlobalReferenceDateTime.isValid() && reference < mGlobalReferenceDateTime ) )
81 mGlobalReferenceDateTime = reference;
82
83 mGroupsReferenceDateTime[group] = reference;
84}
85
87{
88 QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group];
89 datasetTimes.append( time );
90}
91
93{
94 const qint64 unitTimeFactor = QgsUnitTypes::fromUnitToUnitFactor( mTemporalUnit, Qgis::TemporalUnit::Milliseconds );
95 addDatasetTimeInMilliseconds( group, time * unitTimeFactor );
96}
97
99{
100 return mGlobalReferenceDateTime.isValid();
101}
102
104{
105 return mGlobalReferenceDateTime;
106}
107
109{
110 return timeExtent( mGlobalReferenceDateTime );
111}
112
114{
115 QDateTime end;
116 QDateTime begin;
117 for ( QHash<int, QDateTime>::const_iterator it = mGroupsReferenceDateTime.constBegin(); it != mGroupsReferenceDateTime.constEnd(); ++it )
118 {
119 QDateTime groupReference = it.value();
120 if ( !groupReference.isValid() ) //the dataset group has not a valid reference time -->take global reference
121 groupReference = mGlobalReferenceDateTime;
122
123 if ( !groupReference.isValid() )
124 groupReference = reference;
125
126 const QList<qint64> times = mDatasetTimeSinceGroupReference[it.key()];
127 qint64 durationSinceFirst = groupReference.msecsTo( reference );
128 qint64 durationSinceLast = groupReference.msecsTo( reference );
129 if ( !times.isEmpty() )
130 {
131 durationSinceFirst += times.first();
132 durationSinceLast += times.last();
133 }
134
135 if ( !end.isValid() || groupReference.addMSecs( durationSinceLast ) > end )
136 end = groupReference.addMSecs( durationSinceLast );
137
138 if ( !begin.isValid() || groupReference.addMSecs( durationSinceFirst ) > begin )
139 begin = groupReference.addMSecs( durationSinceFirst );
140 }
141
142 return QgsDateTimeRange( begin, end );
143}
144
146{
147 mTemporalUnit = timeUnit;
148}
149
154
156{
157 if ( !index.isValid() )
159
160 const QList<qint64> &timesList = mDatasetTimeSinceGroupReference[index.group()];
161 if ( index.dataset() < timesList.count() )
162 return timesList.at( index.dataset() );
163 else
165}
166
168{
169 mGlobalReferenceDateTime = QDateTime();
170 mGroupsReferenceDateTime.clear();
171 mDatasetTimeSinceGroupReference.clear();
172}
173
175{
176 qint64 ret = -1;
177 if ( mDatasetTimeSinceGroupReference.contains( group ) )
178 {
179 const QList<qint64> times = mDatasetTimeSinceGroupReference[group];
180 if ( times.count() > 1 )
181 ret = times.at( 1 ) - times.at( 0 );
182 }
183 return ret;
184}
TemporalUnit
Temporal units.
Definition qgis.h:5316
@ Milliseconds
Milliseconds.
Definition qgis.h:5317
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:705