Skip to content

Commit

Permalink
fix time handling of mesh layer when gap of reference time (#45456)
Browse files Browse the repository at this point in the history
fix time handling of mesh layer when gap of reference time
  • Loading branch information
vcloarec committed Oct 11, 2021
1 parent 1d85b09 commit d16cced
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 20 deletions.
4 changes: 2 additions & 2 deletions python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in
Expand Up @@ -379,10 +379,10 @@ On success, the mesh's dataset group count is changed

QgsMeshDatasetIndex datasetIndexAtTime( const QDateTime &referenceTime,
int groupIndex,
quint64 time,
qint64 time,
QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod method ) const;
%Docstring
Returns the dataset index of the dataset in a specific dataet group at ``time`` from the ``reference`` time
Returns the dataset index of the dataset in a specific dataset group at ``time`` from the ``reference`` time

:param referenceTime: the reference time from where to find the dataset
:param groupIndex: the index of the dataset group
Expand Down
8 changes: 4 additions & 4 deletions src/core/mesh/qgsmeshdataprovider.cpp
Expand Up @@ -48,14 +48,14 @@ QgsMeshDriverMetadata QgsMeshDataProvider::driverMetadata() const { return QgsMe

QgsMeshDatasetIndex QgsMeshDatasetSourceInterface::datasetIndexAtTime(
const QDateTime &referenceTime,
int groupIndex, quint64 time,
int groupIndex, qint64 time,
QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod method ) const
{
const QDateTime requestDateTime = referenceTime.addMSecs( time );
quint64 providerTime;
qint64 providerTime;
const QDateTime providerReferenceTime = mTemporalCapabilities->referenceTime();
if ( mTemporalCapabilities->referenceTime().isValid() )
providerTime = referenceTime.msecsTo( requestDateTime );
if ( providerReferenceTime.isValid() )
providerTime = providerReferenceTime.msecsTo( requestDateTime );
else
providerTime = time;

Expand Down
4 changes: 2 additions & 2 deletions src/core/mesh/qgsmeshdataprovider.h
Expand Up @@ -387,7 +387,7 @@ class CORE_EXPORT QgsMeshDatasetSourceInterface SIP_ABSTRACT
) = 0;

/**
* Returns the dataset index of the dataset in a specific dataet group at \a time from the \a reference time
* Returns the dataset index of the dataset in a specific dataset group at \a time from the \a reference time
*
* \param referenceTime the reference time from where to find the dataset
* \param groupIndex the index of the dataset group
Expand All @@ -398,7 +398,7 @@ class CORE_EXPORT QgsMeshDatasetSourceInterface SIP_ABSTRACT
*/
QgsMeshDatasetIndex datasetIndexAtTime( const QDateTime &referenceTime,
int groupIndex,
quint64 time,
qint64 time,
QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod method ) const;

protected:
Expand Down
9 changes: 0 additions & 9 deletions src/core/mesh/qgsmeshlayer.cpp
Expand Up @@ -585,15 +585,6 @@ QgsMeshDatasetIndex QgsMeshLayer::datasetIndexAtTime( const QgsDateTimeRange &ti

QgsMeshDatasetIndex QgsMeshLayer::datasetIndexAtRelativeTime( const QgsInterval &relativeTime, int datasetGroupIndex ) const
{
qint64 usedRelativeTime = relativeTime.seconds() * 1000;

//adjust relative time if layer reference time is different from provider reference time
if ( mTemporalProperties->referenceTime().isValid() &&
mDataProvider &&
mDataProvider->isValid() &&
mTemporalProperties->referenceTime() != mDataProvider->temporalCapabilities()->referenceTime() )
usedRelativeTime = usedRelativeTime + mTemporalProperties->referenceTime().msecsTo( mDataProvider->temporalCapabilities()->referenceTime() );

return mDatasetGroupStore->datasetIndexAtTime( relativeTime.seconds() * 1000, datasetGroupIndex, mTemporalProperties->matchingMethod() );
}

Expand Down
23 changes: 20 additions & 3 deletions tests/src/core/testqgsmeshlayer.cpp
Expand Up @@ -1839,8 +1839,8 @@ void TestQgsMeshLayer::test_temporal()
const QDateTime end = QDateTime( QDate( 1990, 1, 1 ), QTime( 6, 0, 1, 938 ), Qt::UTC );
QCOMPARE( tempCap->timeExtent(), QgsDateTimeRange( begin, end ) );

const QDateTime time_1 = QDateTime( QDate( 1990, 1, 1 ), QTime( 3, 0, 0 ), Qt::UTC );
const QDateTime time_2 = time_1.addSecs( 300 );
QDateTime time_1 = QDateTime( QDate( 1990, 1, 1 ), QTime( 3, 0, 0 ), Qt::UTC );
QDateTime time_2 = time_1.addSecs( 300 );
QgsMeshRendererSettings settings = mMdal3DLayer->rendererSettings();
// Static dataset (bed elevation)
settings.setActiveScalarDatasetGroup( 0 ); //static dataset (bed elevation)
Expand All @@ -1856,12 +1856,29 @@ void TestQgsMeshLayer::test_temporal()
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1, time_2 ) ).dataset(), 17 );
mMdal3DLayer->setTemporalMatchingMethod( QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetFromStartRangeTime );
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1, time_2 ) ).dataset(), 18 );
QCOMPARE( mMdal3DLayer->datasetIndexAtRelativeTime( QgsInterval( 3, QgsUnitTypes::TemporalHours ), 1 ), QgsMeshDatasetIndex( 1, 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();

// change reference time
QgsMeshLayerTemporalProperties *tempProp = static_cast<QgsMeshLayerTemporalProperties *>( mMdal3DLayer->temporalProperties() );
tempProp->setReferenceTime( QDateTime( QDate( 1980, 1, 1 ), QTime( 0, 0, 0 ), Qt::UTC ), mMdal3DLayer->dataProvider()->temporalCapabilities() );
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1, time_2 ) ).dataset(), -1 );
QCOMPARE( mMdal3DLayer->datasetIndexAtRelativeTime( QgsInterval( 3, QgsUnitTypes::TemporalHours ), 1 ), QgsMeshDatasetIndex( 1, 18 ) );
time_1 = QDateTime( QDate( 1980, 1, 1 ), QTime( 3, 0, 0 ), Qt::UTC );
time_2 = time_1.addSecs( 300 );
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1, time_2 ) ).dataset(), 18 );
QCOMPARE( mMdal3DLayer->datasetIndexAtRelativeTime( QgsInterval( 3, QgsUnitTypes::TemporalHours ), 1 ), QgsMeshDatasetIndex( 1, 18 ) );

tempProp->setReferenceTime( QDateTime( QDate( 1995, 1, 1 ), QTime( 0, 0, 0 ), Qt::UTC ), mMdal3DLayer->dataProvider()->temporalCapabilities() );
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1, time_2 ) ).dataset(), -1 );
time_1 = QDateTime( QDate( 1995, 1, 1 ), QTime( 3, 0, 0 ), Qt::UTC );
time_2 = time_1.addSecs( 300 );
QCOMPARE( mMdal3DLayer->activeScalarDatasetAtTime( QgsDateTimeRange( time_1, time_2 ) ).dataset(), 18 );
QCOMPARE( mMdal3DLayer->datasetIndexAtRelativeTime( QgsInterval( 3, QgsUnitTypes::TemporalHours ), 1 ), QgsMeshDatasetIndex( 1, 18 ) );
}

QGSTEST_MAIN( TestQgsMeshLayer )
Expand Down

0 comments on commit d16cced

Please sign in to comment.