23#include "moc_qgsrasterlayertemporalproperties.cpp"
28 mTemporalRepresentationScale.setDays( 1.0 );
40 return range.
isInfinite() || mFixedRange.isInfinite() || mFixedRange.overlaps( range );
44 for (
auto it = mRangePerBand.constBegin(); it != mRangePerBand.constEnd(); ++it )
46 if ( it.value().overlaps( range ) )
62 QgsRasterLayer *rasterLayer = qobject_cast< QgsRasterLayer *>( layer );
79 bool includeBeginning =
true;
80 bool includeEnd =
true;
81 for (
auto it = mRangePerBand.constBegin(); it != mRangePerBand.constEnd(); ++it )
83 if ( it.value().begin() < begin || !begin.isValid() )
85 begin = it.value().begin();
86 includeBeginning = it.value().includeBeginning();
88 else if ( !includeBeginning && it.value().begin() == begin && it.value().includeBeginning() )
90 includeBeginning =
true;
92 if ( it.value().end() > end || !end.isValid() )
94 end = it.value().end();
95 includeEnd = it.value().includeEnd();
97 else if ( !includeEnd && it.value().end() == end && it.value().includeEnd() )
115 QgsRasterLayer *rasterLayer = qobject_cast< QgsRasterLayer *>( layer );
121 return { mFixedRange };
125 QList<QgsDateTimeRange> results;
126 results.reserve( mRangePerBand.size() );
127 for (
auto it = mRangePerBand.constBegin(); it != mRangePerBand.constEnd(); ++it )
129 results.append( it.value() );
182 return mIntervalHandlingMethod;
187 if ( mIntervalHandlingMethod == method )
189 mIntervalHandlingMethod = method;
204 return mRangePerBand;
209 if ( mRangePerBand == ranges )
212 mRangePerBand = ranges;
229 int currentMatchingBand = -1;
231 for (
auto it = mRangePerBand.constBegin(); it != mRangePerBand.constEnd(); ++it )
233 if ( it.value().overlaps( range ) )
236 || ( it.value().includeEnd() && it.value().end() >= currentMatchingRange.
end() )
237 || ( !currentMatchingRange.
includeEnd() && it.value().end() >= currentMatchingRange.
end() ) )
239 currentMatchingBand = it.key();
240 currentMatchingRange = it.value();
244 return currentMatchingBand;
262 const int bandCount = layer->
bandCount();
264 res.reserve( bandCount );
265 for (
int i = 1; i <= bandCount; ++i )
273 res.reserve( mRangePerBand.size() );
276 for (
auto it = mRangePerBand.constBegin(); it != mRangePerBand.constEnd(); ++it )
278 if ( it.value().overlaps( range ) )
280 res.append( it.key() );
287 return QList<int>() << mBandNumber;
299 if ( mBandNumber == number )
302 mBandNumber = number;
307 return mTemporalRepresentationOffset;
312 if ( mTemporalRepresentationOffset == offset )
315 mTemporalRepresentationOffset = offset;
320 return mAccumulatePixels;
325 mAccumulatePixels = accumulate;
330 return mTemporalRepresentationScale;
335 if ( mTemporalRepresentationScale == scale )
338 mTemporalRepresentationScale = scale;
346 const QDomElement temporalNode = element.firstChildElement( QStringLiteral(
"temporal" ) );
348 setIsActive( temporalNode.attribute( QStringLiteral(
"enabled" ), QStringLiteral(
"0" ) ).toInt() );
350 mMode =
static_cast< Qgis::RasterTemporalMode >( temporalNode.attribute( QStringLiteral(
"mode" ), QStringLiteral(
"0" ) ). toInt() );
351 mBandNumber = temporalNode.attribute( QStringLiteral(
"bandNumber" ), QStringLiteral(
"1" ) ).toInt();
352 mIntervalHandlingMethod =
static_cast< Qgis::TemporalIntervalMatchMethod >( temporalNode.attribute( QStringLiteral(
"fetchMode" ), QStringLiteral(
"0" ) ). toInt() );
358 const QDomNode instantElement = temporalNode.namedItem( QStringLiteral(
"fixedInstant" ) );
359 const QDateTime date = QDateTime::fromString( instantElement.toElement().text(), Qt::ISODate );
368 const QDomNode rangeElement = temporalNode.namedItem( QStringLiteral(
"fixedRange" ) );
370 const QDomNode begin = rangeElement.namedItem( QStringLiteral(
"start" ) );
371 const QDomNode end = rangeElement.namedItem( QStringLiteral(
"end" ) );
373 const QDateTime beginDate = QDateTime::fromString( begin.toElement().text(), Qt::ISODate );
374 const QDateTime endDate = QDateTime::fromString( end.toElement().text(), Qt::ISODate );
383 mRangePerBand.clear();
385 const QDomNodeList ranges = temporalNode.firstChildElement( QStringLiteral(
"ranges" ) ).childNodes();
386 for (
int i = 0; i < ranges.size(); ++i )
388 const QDomElement rangeElement = ranges.at( i ).toElement();
389 const int band = rangeElement.attribute( QStringLiteral(
"band" ) ).toInt();
390 const QDateTime begin = QDateTime::fromString( rangeElement.attribute( QStringLiteral(
"begin" ) ), Qt::ISODate );
391 const QDateTime end = QDateTime::fromString( rangeElement.attribute( QStringLiteral(
"end" ) ), Qt::ISODate );
392 const bool includeBeginning = rangeElement.attribute( QStringLiteral(
"includeBeginning" ) ).toInt();
393 const bool includeEnd = rangeElement.attribute( QStringLiteral(
"includeEnd" ) ).toInt();
394 mRangePerBand.insert( band,
QgsDateTimeRange( begin, end, includeBeginning, includeEnd ) );
401 mTemporalRepresentationOffset = QDateTime::fromString( temporalNode.attribute( QStringLiteral(
"temporalRepresentationOffset" ) ), Qt::ISODate );
402 mAccumulatePixels = temporalNode.attribute( QStringLiteral(
"accumulate" ), QStringLiteral(
"0" ) ).toInt();
403 mTemporalRepresentationScale =
QgsInterval( temporalNode.attribute( QStringLiteral(
"temporalRepresentationScale" ), QStringLiteral(
"1" ) ).toDouble(),
404 static_cast< Qgis::TemporalUnit >( temporalNode.attribute( QStringLiteral(
"temporalRepresentationScaleUnit" ), QStringLiteral(
"4" ) ).toInt() ) );
419 if ( element.isNull() )
420 return QDomElement();
422 QDomElement temporalElement = document.createElement( QStringLiteral(
"temporal" ) );
423 temporalElement.setAttribute( QStringLiteral(
"enabled" ),
isActive() ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
424 temporalElement.setAttribute( QStringLiteral(
"mode" ), QString::number(
static_cast< int >( mMode ) ) );
425 temporalElement.setAttribute( QStringLiteral(
"bandNumber" ), QString::number( mBandNumber ) );
426 temporalElement.setAttribute( QStringLiteral(
"fetchMode" ), QString::number(
static_cast< int >( mIntervalHandlingMethod ) ) );
432 QDomElement instantElement = document.createElement( QStringLiteral(
"fixedInstant" ) );
433 const QDomText instantText = document.createTextNode( mFixedRange.begin().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) );
434 instantElement.appendChild( instantText );
436 temporalElement.appendChild( instantElement );
443 QDomElement rangeElement = document.createElement( QStringLiteral(
"fixedRange" ) );
445 QDomElement startElement = document.createElement( QStringLiteral(
"start" ) );
446 QDomElement endElement = document.createElement( QStringLiteral(
"end" ) );
448 const QDomText startText = document.createTextNode( mFixedRange.begin().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) );
449 const QDomText endText = document.createTextNode( mFixedRange.end().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) );
450 startElement.appendChild( startText );
451 endElement.appendChild( endText );
452 rangeElement.appendChild( startElement );
453 rangeElement.appendChild( endElement );
455 temporalElement.appendChild( rangeElement );
461 QDomElement ranges = document.createElement( QStringLiteral(
"ranges" ) );
462 for (
auto it = mRangePerBand.constBegin(); it != mRangePerBand.constEnd(); ++it )
464 QDomElement range = document.createElement( QStringLiteral(
"range" ) );
465 range.setAttribute( QStringLiteral(
"band" ), it.key() );
466 range.setAttribute( QStringLiteral(
"begin" ), it.value().begin().toString( Qt::ISODate ) );
467 range.setAttribute( QStringLiteral(
"end" ), it.value().end().toString( Qt::ISODate ) );
468 range.setAttribute( QStringLiteral(
"includeBeginning" ), it.value().includeBeginning() ?
"1" :
"0" );
469 range.setAttribute( QStringLiteral(
"includeEnd" ), it.value().includeEnd() ?
"1" :
"0" );
470 ranges.appendChild( range );
472 temporalElement.appendChild( ranges );
478 temporalElement.setAttribute( QStringLiteral(
"temporalRepresentationOffset" ), mTemporalRepresentationOffset.toString( Qt::ISODate ) );
479 temporalElement.setAttribute( QStringLiteral(
"accumulate" ), mAccumulatePixels ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
480 temporalElement.setAttribute( QStringLiteral(
"temporalRepresentationScale" ), QString::number( mTemporalRepresentationScale.originalDuration() ) );
481 temporalElement.setAttribute( QStringLiteral(
"temporalRepresentationScaleUnit" ), QString::number(
static_cast< int >( mTemporalRepresentationScale.originalUnit() ) ) );
490 element.appendChild( temporalElement );
499 setIsActive( rasterCaps->hasTemporalCapabilities() );
502 if ( rasterCaps->hasTemporalCapabilities() )
507 mIntervalHandlingMethod = rasterCaps->intervalHandlingMethod();
TemporalIntervalMatchMethod
Method to use when resolving a temporal range to a data provider layer or band.
TemporalUnit
Temporal units.
RasterTemporalMode
Raster layer temporal modes.
@ RepresentsTemporalValues
Pixel values represent an datetime.
@ RedrawLayerOnly
Redraw the layer when temporal range changes, but don't apply any filtering. Useful when raster symbo...
@ FixedRangePerBand
Layer has a fixed temporal range per band.
@ TemporalRangeFromDataProvider
Mode when raster layer delegates temporal range handling to the dataprovider.
@ FixedTemporalRange
Mode when temporal properties have fixed start and end datetimes.
@ FixedDateTime
Layer has a fixed date time instant.
Base class for handling properties relating to a data provider's temporal capabilities.
A representation of the interval between two datetime values.
QgsMapLayerTemporalProperties(QObject *parent, bool enabled=false)
Constructor for QgsMapLayerTemporalProperties, with the specified parent object.
Base class for all map layer types.
Implementation of data provider temporal properties for QgsRasterDataProviders.
QList< QgsDateTimeRange > allAvailableTemporalRanges() const
Returns a list of all valid datetime ranges for which temporal data is available from the provider.
const QgsDateTimeRange & availableTemporalRange() const
Returns the overall datetime range extent from which temporal data is available from the provider.
QgsRasterDataProviderTemporalCapabilities * temporalCapabilities() override
Returns the provider's temporal capabilities.
QDomElement writeXml(QDomElement &element, QDomDocument &doc, const QgsReadWriteContext &context) override
Writes the properties to a DOM element, to be used later with readXml().
QDateTime temporalRepresentationOffset() const
Returns the temporal offset, which is a fixed datetime which should be added to individual pixel valu...
void setDefaultsFromDataProviderTemporalCapabilities(const QgsDataProviderTemporalCapabilities *capabilities) override
Sets the layers temporal settings to appropriate defaults based on a provider's temporal capabilities...
bool isVisibleInTemporalRange(const QgsDateTimeRange &range) const override
Returns true if the layer should be visible and rendered for the specified time range.
QgsTemporalProperty::Flags flags() const override
Returns flags associated to the temporal property.
QList< int > filteredBandsForTemporalRange(QgsRasterLayer *layer, const QgsDateTimeRange &range) const
Returns a filtered list of bands which match the specified range.
void setTemporalRepresentationOffset(const QDateTime &offset)
Sets the temporal offset, which is a fixed datetime which should be added to individual pixel values ...
Qgis::TemporalIntervalMatchMethod intervalHandlingMethod() const
Returns the desired method to use when resolving a temporal interval to matching layers or bands in t...
const QgsInterval & temporalRepresentationScale() const
Returns the scale, which is an interval factor which should be applied to individual pixel values fro...
void setIntervalHandlingMethod(Qgis::TemporalIntervalMatchMethod method)
Sets the desired method to use when resolving a temporal interval to matching layers or bands in the ...
Qgis::RasterTemporalMode mode() const
Returns the temporal properties mode.
void setAccumulatePixels(bool accumulate)
Sets whether pixels will be accumulated over time (i.e.
void setTemporalRepresentationScale(const QgsInterval &scale)
Sets the scale, which is an interval factor which should be applied to individual pixel values from t...
bool accumulatePixels() const
Returns true if pixels will be accumulated over time (i.e.
int bandForTemporalRange(QgsRasterLayer *layer, const QgsDateTimeRange &range) const
Returns the band corresponding to the specified range.
QList< QgsDateTimeRange > allTemporalRanges(QgsMapLayer *layer) const override
Attempts to calculate the overall list of all temporal extents which are contained in the specified l...
void setMode(Qgis::RasterTemporalMode mode)
Sets the temporal properties mode.
QgsRasterLayerTemporalProperties(QObject *parent=nullptr, bool enabled=false)
Constructor for QgsRasterLayerTemporalProperties, with the specified parent object.
void setFixedTemporalRange(const QgsDateTimeRange &range)
Sets a temporal range to apply to the whole layer.
void setFixedRangePerBand(const QMap< int, QgsDateTimeRange > &ranges)
Sets the fixed temporal range for each band.
bool readXml(const QDomElement &element, const QgsReadWriteContext &context) override
Reads temporal properties from a DOM element previously written by writeXml().
QMap< int, QgsDateTimeRange > fixedRangePerBand() const
Returns the fixed temporal range for each band.
int bandNumber() const
Returns the band number from which temporal values should be taken.
const QgsDateTimeRange & fixedTemporalRange() const
Returns the fixed temporal range for the layer.
QgsDateTimeRange calculateTemporalExtent(QgsMapLayer *layer) const override
Attempts to calculate the overall temporal extent for the specified layer, using the settings defined...
void setBandNumber(int number)
Sets the band number from which temporal values should be taken.
Represents a raster layer.
int bandCount() const
Returns the number of bands in this layer.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
A container for the context for various read/write operations on objects.
void changed()
Emitted when the temporal properties have changed.
bool isActive() const
Returns true if the temporal property is active.
void setIsActive(bool active)
Sets whether the temporal property is active.
@ FlagDontInvalidateCachedRendersWhenRangeChanges
Any cached rendering will not be invalidated when temporal range context is modified.
T end() const
Returns the upper bound of the range.
bool includeEnd() const
Returns true if the end is inclusive, or false if the end is exclusive.
bool isInfinite() const
Returns true if the range consists of all possible values.
#define BUILTIN_UNREACHABLE
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.