temporal match methods

This commit is contained in:
vcloarec 2020-05-18 23:14:44 -04:00 committed by Nyall Dawson
parent daab0eace4
commit 267af1e7fb
13 changed files with 298 additions and 130 deletions

View File

@ -23,22 +23,37 @@ Class for handling properties relating to a mesh data provider's temporal capabi
%End
public:
enum MatchingTemporalDatasetMethod
{
FindClosestDatasetBeforeStartRangeTime,
FindClosestDatasetFromStartRangeTime
};
QgsMeshDataProviderTemporalCapabilities();
%Docstring
Constructor for QgsMeshDataProviderTemporalCapabilities
%End
QgsMeshDatasetIndex datasetIndexFromRelativeTimeRange( int group, qint64 startTimeSinceGlobalReference, qint64 endTimeSinceGlobalReference ) const;
QgsMeshDatasetIndex datasetIndexClosestBeforeRelativeTime( int group, qint64 timeSinceGlobalReference ) const;
%Docstring
Returns the first dataset that are include in the range [``startTimeSinceGlobalReference``,``endTimeSinceGlobalReference``[ (in milliseconds)
from the dataset ``group``. If no dataset is present in this range return the last dataset before this range if it not the last one
of whole the dataset group
Returns the last dataset whith time less than or equal to ``timeSinceGlobalReference``
Returns invalid dataset index if there is no data set in the range
Returns invalid dataset index if ``timeSinceGlobalReference`` is outside the time extent of the dataset group
.. note::
for non temporal dataset group, the range is not used and the unique dataset is returned
for non temporal dataset group, ``timeSinceGlobalReference`` is not used and the unique dataset is returned
%End
QgsMeshDatasetIndex datasetIndexClosestFromRelativeTime( int group, qint64 timeSinceGlobalReference ) const;
%Docstring
Returns the closest dataset index from the ``timeSinceGlobalReference``
Returns invalid dataset index if ``timeSinceGlobalReference`` is outside the time extent of the dataset group
.. note::
for non temporal dataset group, ``timeSinceGlobalReference`` is not used and the unique dataset is returned
%End

View File

@ -292,6 +292,11 @@ If the temporal properties is not active, return the static dataset
:return: dataset index
.. note::
the returned dataset index depends on the matching method, see setTemporalMatchingMethod()
.. versionadded:: 3.14
%End
@ -304,6 +309,11 @@ If the temporal properties is not active, return the static dataset
:return: dataset index
.. note::
the returned dataset index depends on the matching method, see setTemporalMatchingMethod()
.. versionadded:: 3.14
%End
@ -329,6 +339,15 @@ Sets the reference time of the layer
:param referenceTime: the reference time
.. versionadded:: 3.14
%End
void setTemporalMatchingMethod( const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod );
%Docstring
Sets the method used to match the temporal dataset from a requested time, see activeVectorDatasetAtTime()
:param matchingMethod: the matching method
.. versionadded:: 3.14
%End

View File

@ -74,6 +74,18 @@ if the temporal capabilities is null, set a void time extent (reference time to
:param referenceTime: the reference time
:param capabilities: the temporal capabilities of the data provider
%End
QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod matchingMethod() const;
%Docstring
Returns the method used to match dataset from temporal capabilities
%End
void setMatchingMethod( const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod );
%Docstring
Sets the method used to match dataset from temporal capabilities
:param matchingMethod: the matching method
%End
};

View File

@ -0,0 +1,2 @@
# The following has been generated automatically from src/gui/qgssublayersdialog.h
QgsSublayersDialog.PromptMode.baseClass = QgsSublayersDialog

View File

@ -95,6 +95,11 @@ QgsMeshLayerProperties::QgsMeshLayerProperties( QgsMapLayer *lyr, QgsMapCanvas *
delete mOptsPage_3DView; // removes both the "3d view" list item and its page
#endif
mComboBoxTemporalDatasetMatchingMethod->addItem( tr( "Find closest dataset before requested time" ),
QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetBeforeStartRangeTime );
mComboBoxTemporalDatasetMatchingMethod->addItem( tr( "Find closest dataset from requested time (after or before)" ),
QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetFromStartRangeTime );
// update based on lyr's current state
syncToLayer();
@ -209,6 +214,8 @@ void QgsMeshLayerProperties::syncToLayer()
mTemporalProviderTimeUnitComboBox->setCurrentIndex(
mTemporalProviderTimeUnitComboBox->findData( mMeshLayer->dataProvider()->temporalCapabilities()->temporalUnit() ) );
}
mComboBoxTemporalDatasetMatchingMethod->setCurrentIndex(
mComboBoxTemporalDatasetMatchingMethod->findData( temporalProperties->matchingMethod() ) );
mStaticScalarWidget->syncToLayer();
mStaticScalarWidget->setVisible( !mMeshLayer->temporalProperties()->isActive() );
@ -371,6 +378,8 @@ void QgsMeshLayerProperties::apply()
mStaticScalarWidget->apply();
bool needEmitRendererChanged = mMeshLayer->temporalProperties()->isActive() == mTemporalStaticDatasetCheckBox->isChecked();
mMeshLayer->temporalProperties()->setIsActive( !mTemporalStaticDatasetCheckBox->isChecked() );
mMeshLayer->setTemporalMatchingMethod( static_cast<QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod>(
mComboBoxTemporalDatasetMatchingMethod->currentData().toInt() ) );
if ( needMeshUpdating )
mMeshLayer->reload();

View File

@ -21,38 +21,58 @@
QgsMeshDataProviderTemporalCapabilities::QgsMeshDataProviderTemporalCapabilities(): QgsDataProviderTemporalCapabilities()
{}
QgsMeshDatasetIndex QgsMeshDataProviderTemporalCapabilities::datasetIndexFromRelativeTimeRange( int group, qint64 startTimeSinceGlobalReference, qint64 endTimeSinceGlobalReference ) const
QgsMeshDatasetIndex QgsMeshDataProviderTemporalCapabilities::datasetIndexClosestFromRelativeTime( int group, qint64 timeSinceGlobalReference ) const
{
// No time --> non temporal dataset, so return the dataset that has to be the only one
const QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group];
if ( datasetTimes.isEmpty() )
return QgsMeshDatasetIndex( group, 0 );
const QDateTime groupReference = mGroupsReferenceDateTime[group];
const qint64 startTimeSinceGroupReference =
startTimeSinceGlobalReference - mGlobalReferenceDateTime.msecsTo( groupReference );
const qint64 endTimeSinceGroupReference =
endTimeSinceGlobalReference - mGlobalReferenceDateTime.msecsTo( groupReference );
const qint64 timeSinceGroupReference =
timeSinceGlobalReference - mGlobalReferenceDateTime.msecsTo( groupReference );
if ( startTimeSinceGroupReference > datasetTimes.last() )
if ( timeSinceGroupReference > datasetTimes.last() // after last time
|| timeSinceGroupReference < datasetTimes.first() ) // before first time
return QgsMeshDatasetIndex();
if ( endTimeSinceGroupReference < datasetTimes.first() )
return QgsMeshDatasetIndex();
for ( int i = 0; i < datasetTimes.count(); ++i )
for ( int i = 1 ; i < datasetTimes.count(); ++i )
{
qint64 time = datasetTimes.at( i );
if ( startTimeSinceGroupReference <= time )
qint64 time1 = datasetTimes.at( i - 1 );
qint64 time2 = datasetTimes.at( i );
if ( time1 <= timeSinceGroupReference && timeSinceGroupReference <= time2 )
{
if ( endTimeSinceGroupReference < time ) // Start and end of range are before the current time step
return QgsMeshDatasetIndex( group, i - 1 ); // --> return the previous time step, invalid if i=0
if ( abs( timeSinceGroupReference - time2 ) < abs( timeSinceGroupReference - time1 ) )
return QgsMeshDatasetIndex( group, i );
else
return QgsMeshDatasetIndex( group, i ); // current time step are included in [start,end] --> return current
return QgsMeshDatasetIndex( group, i - 1 );
}
}
// if we are here (normally, this could no happen), return invalid dataset index
return QgsMeshDatasetIndex();
return QgsMeshDatasetIndex( QgsMeshDatasetIndex( group, datasetTimes.count() - 1 ) );
}
QgsMeshDatasetIndex QgsMeshDataProviderTemporalCapabilities::datasetIndexClosestBeforeRelativeTime( int group, qint64 timeSinceGlobalReference ) const
{
// No time --> non temporal dataset, so return the dataset that has to be the only one
const QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group];
if ( datasetTimes.isEmpty() )
return QgsMeshDatasetIndex( group, 0 );
const QDateTime groupReference = mGroupsReferenceDateTime[group];
const qint64 timeSinceGroupReference =
timeSinceGlobalReference - mGlobalReferenceDateTime.msecsTo( groupReference );
if ( timeSinceGroupReference > datasetTimes.last() // after last time
|| timeSinceGroupReference < datasetTimes.first() ) // before first time
return QgsMeshDatasetIndex();
for ( int i = 1; i < datasetTimes.count(); ++i )
{
qint64 time = datasetTimes.at( i );
if ( timeSinceGroupReference < time )
return QgsMeshDatasetIndex( group, i - 1 );
}
return QgsMeshDatasetIndex( QgsMeshDatasetIndex( group, datasetTimes.count() - 1 ) );
}
void QgsMeshDataProviderTemporalCapabilities::addGroupReferenceDateTime( int group, const QDateTime &reference )

View File

@ -34,21 +34,37 @@ class CORE_EXPORT QgsMeshDataProviderTemporalCapabilities: public QgsDataProvide
{
public:
/**
* Method to use when requesting a tempral dataset from a time
**/
enum MatchingTemporalDatasetMethod
{
FindClosestDatasetBeforeStartRangeTime, //! Find the closest dataset which have its time before the requested start range time
FindClosestDatasetFromStartRangeTime //! Find the closest dataset before or after the requested start range time
};
/**
* Constructor for QgsMeshDataProviderTemporalCapabilities
*/
QgsMeshDataProviderTemporalCapabilities();
/**
* Returns the first dataset that are include in the range [\a startTimeSinceGlobalReference,\a endTimeSinceGlobalReference[ (in milliseconds)
* from the dataset \a group. If no dataset is present in this range return the last dataset before this range if it not the last one
* of whole the dataset group
* Returns the last dataset whith time less than or equal to \a timeSinceGlobalReference
*
* Returns invalid dataset index if there is no data set in the range
* Returns invalid dataset index if \a timeSinceGlobalReference is outside the time extent of the dataset group
*
* \note for non temporal dataset group, the range is not used and the unique dataset is returned
* \note for non temporal dataset group, \a timeSinceGlobalReference is not used and the unique dataset is returned
*/
QgsMeshDatasetIndex datasetIndexFromRelativeTimeRange( int group, qint64 startTimeSinceGlobalReference, qint64 endTimeSinceGlobalReference ) const;
QgsMeshDatasetIndex datasetIndexClosestBeforeRelativeTime( int group, qint64 timeSinceGlobalReference ) const;
/**
* Returns the closest dataset index from the \a timeSinceGlobalReference
*
*Returns invalid dataset index if \a timeSinceGlobalReference is outside the time extent of the dataset group
*
* \note for non temporal dataset group, \a timeSinceGlobalReference is not used and the unique dataset is returned
*/
QgsMeshDatasetIndex datasetIndexClosestFromRelativeTime( int group, qint64 timeSinceGlobalReference ) const;
/**
* Adds a \a reference date/time from a dataset \a group

View File

@ -82,9 +82,7 @@ void QgsMeshLayer::setDefaultRendererSettings()
meta.minimum() == std::numeric_limits<double>::quiet_NaN() )
meshSettings.setEnabled( true );
// If the mesh is non temporal, set the static scalar dataset
if ( !mDataProvider->temporalCapabilities()->hasTemporalCapabilities() )
setStaticScalarDatasetIndex( QgsMeshDatasetIndex( 0, 0 ) );
setStaticScalarDatasetIndex( QgsMeshDatasetIndex( 0, 0 ) );
}
else
{
@ -435,12 +433,17 @@ QgsMeshDatasetIndex QgsMeshLayer::datasetIndexAtTime( const QgsDateTimeRange &ti
{
const QDateTime layerReferenceTime = mTemporalProperties->referenceTime();
qint64 startTime = layerReferenceTime.msecsTo( timeRange.begin() );
qint64 endTime = layerReferenceTime.msecsTo( timeRange.end() );
if ( dataProvider() )
return dataProvider()->temporalCapabilities()->datasetIndexFromRelativeTimeRange( datasetGroupIndex, startTime, endTime );
else
return QgsMeshDatasetIndex();
switch ( mTemporalProperties->matchingMethod() )
{
case QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetBeforeStartRangeTime:
return dataProvider()->temporalCapabilities()->datasetIndexClosestBeforeRelativeTime( datasetGroupIndex, startTime );
case QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetFromStartRangeTime:
return dataProvider()->temporalCapabilities()->datasetIndexClosestFromRelativeTime( datasetGroupIndex, startTime );
}
return QgsMeshDatasetIndex();
}
void QgsMeshLayer::applyClassificationOnScalarSettings( const QgsMeshDatasetGroupMetadata &meta, QgsMeshRendererScalarSettings &scalarSettings ) const
@ -637,6 +640,11 @@ void QgsMeshLayer::setReferenceTime( const QDateTime &referenceTime )
mTemporalProperties->setReferenceTime( referenceTime, nullptr );
}
void QgsMeshLayer::setTemporalMatchingMethod( const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod )
{
mTemporalProperties->setMatchingMethod( matchingMethod );
}
QgsPointXY QgsMeshLayer::snapOnVertex( const QgsPointXY &point, double searchRadius )
{
const QgsTriangularMesh *mesh = triangularMesh();

View File

@ -332,6 +332,8 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer
* \param timeRange the time range
* \returns dataset index
*
* \note the returned dataset index depends on the matching method, see setTemporalMatchingMethod()
*
* \since QGIS 3.14
*/
QgsMeshDatasetIndex activeScalarDatasetAtTime( const QgsDateTimeRange &timeRange ) const;
@ -343,6 +345,8 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer
* \param timeRange the time range
* \returns dataset index
*
* \note the returned dataset index depends on the matching method, see setTemporalMatchingMethod()
*
* \since QGIS 3.14
*/
QgsMeshDatasetIndex activeVectorDatasetAtTime( const QgsDateTimeRange &timeRange ) const;
@ -388,6 +392,15 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer
*/
void setReferenceTime( const QDateTime &referenceTime );
/**
* Sets the method used to match the temporal dataset from a requested time, see activeVectorDatasetAtTime()
*
* \param matchingMethod the matching method
*
* \since QGIS 3.14
*/
void setTemporalMatchingMethod( const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod );
/**
* Returns the position of the snapped point on the mesh element closest to \a point intersecting with
* the searching area defined by \a point and \a searchRadius

View File

@ -33,6 +33,7 @@ QDomElement QgsMeshLayerTemporalProperties::writeXml( QDomElement &element, QDom
temporalElement.setAttribute( QStringLiteral( "reference-time" ), mReferenceTime.toTimeSpec( Qt::UTC ).toString( Qt::ISODate ) );
temporalElement.setAttribute( QStringLiteral( "start-time-extent" ), mTimeExtent.begin().toTimeSpec( Qt::UTC ).toString( Qt::ISODate ) );
temporalElement.setAttribute( QStringLiteral( "end-time-extent" ), mTimeExtent.end().toTimeSpec( Qt::UTC ).toString( Qt::ISODate ) );
temporalElement.setAttribute( QStringLiteral( "matching-method" ), mMatchingMethod );
element.appendChild( temporalElement );
@ -57,6 +58,9 @@ bool QgsMeshLayerTemporalProperties::readXml( const QDomElement &element, const
mTimeExtent = QgsDateTimeRange( start, end );
}
mMatchingMethod = static_cast<QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod>(
temporalElement.attribute( QStringLiteral( "matching-method" ) ).toInt() );
return true;
}
@ -98,3 +102,13 @@ void QgsMeshLayerTemporalProperties::setReferenceTime( const QDateTime &referenc
else
mTimeExtent = QgsDateTimeRange( referenceTime, referenceTime );
}
QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod QgsMeshLayerTemporalProperties::matchingMethod() const
{
return mMatchingMethod;
}
void QgsMeshLayerTemporalProperties::setMatchingMethod( const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod )
{
mMatchingMethod = matchingMethod;
}

View File

@ -19,6 +19,7 @@
#define QGSMESHLAYERTEMPORALPROPERTIES_H
#include "qgsmaplayertemporalproperties.h"
#include "qgsmeshdataprovidertemporalcapabilities.h"
/**
@ -86,9 +87,23 @@ class CORE_EXPORT QgsMeshLayerTemporalProperties : public QgsMapLayerTemporalPro
*/
void setReferenceTime( const QDateTime &referenceTime, const QgsDataProviderTemporalCapabilities *capabilities );
/**
* Returns the method used to match dataset from temporal capabilities
*/
QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod matchingMethod() const;
/**
* Sets the method used to match dataset from temporal capabilities
*
* \param matchingMethod the matching method
*/
void setMatchingMethod( const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod );
private:
QDateTime mReferenceTime;
QgsDateTimeRange mTimeExtent;
QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod mMatchingMethod =
QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetBeforeStartRangeTime;
};
#endif // QGSMESHLAYERTEMPORALPROPERTIES_H

View File

@ -532,21 +532,18 @@ border-radius: 2px;</string>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="1" column="3">
<widget class="QDateTimeEdit" name="mTemporalDateTimeStart">
<property name="enabled">
<bool>false</bool>
<item row="4" column="2">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
</spacer>
</item>
<item row="0" column="4">
<widget class="QPushButton" name="mTemporalReloadButton">
@ -568,45 +565,6 @@ border-radius: 2px;</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Layer Time Reference</string>
</property>
</widget>
</item>
<item row="2" column="2" colspan="7">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Provider Time Settings</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="2">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Time unit</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="mTemporalProviderTimeUnitComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="0" column="3">
<widget class="QDateTimeEdit" name="mTemporalDateTimeReference">
<property name="alignment">
@ -620,6 +578,22 @@ border-radius: 2px;</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QDateTimeEdit" name="mTemporalDateTimeStart">
<property name="enabled">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
</item>
<item row="0" column="7" colspan="2">
<spacer name="horizontalSpacer">
<property name="orientation">
@ -633,13 +607,45 @@ border-radius: 2px;</string>
</property>
</spacer>
</item>
<item row="1" column="4" colspan="2">
<widget class="QLabel" name="label_4">
<item row="1" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Layer End Time</string>
<string>Layer Start Time</string>
</property>
</widget>
</item>
<item row="3" column="2" colspan="7">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Provider Time Settings</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="1" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Time unit</string>
</property>
</widget>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="mTemporalProviderTimeUnitComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="1" column="6">
<widget class="QDateTimeEdit" name="mTemporalDateTimeEnd">
<property name="enabled">
@ -671,26 +677,30 @@ border-radius: 2px;</string>
</property>
</widget>
</item>
<item row="3" column="2">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_6">
<item row="0" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Layer Start Time</string>
<string>Layer Time Reference</string>
</property>
</widget>
</item>
<item row="1" column="4" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Layer End Time</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Matching dataset Method</string>
</property>
</widget>
</item>
<item row="2" column="3" colspan="3">
<widget class="QComboBox" name="mComboBoxTemporalDatasetMatchingMethod"/>
</item>
</layout>
</widget>
</widget>

View File

@ -1123,40 +1123,50 @@ void TestQgsMeshLayer::test_temporal()
{
qint64 relativeTime_0 = -1000;
qint64 relativeTime_1 = 0;
qint64 relativeTime_2 = 1000 * 60 * 60 * 0.3;
qint64 relativeTime_3 = 1000 * 60 * 60 * 0.5;
qint64 relativeTime_4 = 1000 * 60 * 60 * 1.5;
qint64 relativeTime_5 = 1000 * 60 * 60 * 2;
qint64 relativeTime_2 = 1000 * 60 * 60 * 0.6;
qint64 relativeTime_3 = 1000 * 60 * 60 * 1;
qint64 relativeTime_4 = 1000 * 60 * 60 * 2;
// Mesh memory provider
QgsMeshDataProviderTemporalCapabilities *tempCap = mMemoryLayer->dataProvider()->temporalCapabilities();
// Static dataset
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 0, relativeTime_0, relativeTime_1 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 0, relativeTime_1, relativeTime_2 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 0, relativeTime_2, relativeTime_3 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 0, relativeTime_3, relativeTime_4 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 0, relativeTime_0 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 0, relativeTime_1 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 0, relativeTime_2 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 0, relativeTime_3 ).dataset(), 0 );
// Temporal dataset
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_0, relativeTime_1 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_1, relativeTime_2 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_2, relativeTime_3 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_3, relativeTime_4 ).dataset(), 1 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_4, relativeTime_5 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_0 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_1 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_2 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_3 ).dataset(), 1 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_4 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_0 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_1 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_2 ).dataset(), 1 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_3 ).dataset(), 1 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_4 ).dataset(), -1 );
// Mesh MDAL provider with internal dataset
tempCap = mMdalLayer->dataProvider()->temporalCapabilities();
// Static dataset
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 0, relativeTime_0, relativeTime_1 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 0, relativeTime_1, relativeTime_2 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 0, relativeTime_2, relativeTime_3 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 0, relativeTime_0 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 0, relativeTime_1 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 0, relativeTime_2 ).dataset(), 0 );
// Temporal dataset
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_0, relativeTime_1 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_1, relativeTime_2 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_2, relativeTime_3 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_3, relativeTime_4 ).dataset(), 1 );
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 1, relativeTime_4, relativeTime_5 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_0 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_1 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_2 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_3 ).dataset(), 1 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 1, relativeTime_4 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_0 ).dataset(), -1 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_1 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_2 ).dataset(), 1 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_3 ).dataset(), 1 );
QCOMPARE( tempCap->datasetIndexClosestFromRelativeTime( 1, relativeTime_4 ).dataset(), -1 );
//Mesh MDAL provider with reference time
tempCap = mMdal3DLayer->dataProvider()->temporalCapabilities();
QCOMPARE( tempCap->datasetIndexFromRelativeTimeRange( 0, relativeTime_0, relativeTime_1 ).dataset(), 0 );
QCOMPARE( tempCap->datasetIndexClosestBeforeRelativeTime( 0, relativeTime_0 ).dataset(), 0 );
QDateTime begin = QDateTime( QDate( 1990, 1, 1 ), QTime( 0, 0, 0 ), Qt::UTC );
QDateTime end = QDateTime( QDate( 1990, 1, 1 ), QTime( 6, 0, 1, 938 ), Qt::UTC );
QCOMPARE( tempCap->timeExtent(), QgsDateTimeRange( begin, end ) );
@ -1174,10 +1184,15 @@ void TestQgsMeshLayer::test_temporal()
// Temporal dataset
settings.setActiveScalarDatasetGroup( 1 );
mMdal3DLayer->setRendererSettings( settings );
mMdal3DLayer->setTemporalMatchingMethod( QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetBeforeStartRangeTime );
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1, time_2 ) ).dataset(), 17 );
mMdal3DLayer->setTemporalMatchingMethod( QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetFromStartRangeTime );
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1, time_2 ) ).dataset(), 18 );
// Next dataset
mMdal3DLayer->setTemporalMatchingMethod( QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetBeforeStartRangeTime );
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1.addSecs( 400 ), time_2.addSecs( 400 ) ) ).dataset(), 18 );
mMdal3DLayer->setTemporalMatchingMethod( QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetFromStartRangeTime );
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1.addSecs( 400 ), time_2.addSecs( 400 ) ) ).dataset(), 19 );
mMdal3DLayer->temporalProperties();
}