Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsrasterlayertemporalproperties.cpp 3 : : --------------- 4 : : begin : February 2020 5 : : copyright : (C) 2020 by Samweli Mwakisambwe 6 : : email : samweli at kartoza 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 : : 18 : : #include "qgsrasterlayertemporalproperties.h" 19 : : #include "qgsrasterdataprovidertemporalcapabilities.h" 20 : : #include "qgsrasterlayer.h" 21 : : 22 : 0 : QgsRasterLayerTemporalProperties::QgsRasterLayerTemporalProperties( QObject *parent, bool enabled ) 23 : 0 : : QgsMapLayerTemporalProperties( parent, enabled ) 24 : 0 : { 25 : 0 : } 26 : : 27 : 0 : bool QgsRasterLayerTemporalProperties::isVisibleInTemporalRange( const QgsDateTimeRange &range ) const 28 : : { 29 : 0 : if ( !isActive() ) 30 : 0 : return true; 31 : : 32 : 0 : switch ( mMode ) 33 : : { 34 : : case ModeFixedTemporalRange: 35 : 0 : return range.isInfinite() || mFixedRange.isInfinite() || mFixedRange.overlaps( range ); 36 : : 37 : : case ModeTemporalRangeFromDataProvider: 38 : 0 : return true; 39 : : } 40 : 0 : return true; 41 : 0 : } 42 : : 43 : 0 : QgsDateTimeRange QgsRasterLayerTemporalProperties::calculateTemporalExtent( QgsMapLayer *layer ) const 44 : : { 45 : 0 : QgsRasterLayer *rasterLayer = qobject_cast< QgsRasterLayer *>( layer ); 46 : 0 : if ( !rasterLayer ) 47 : 0 : return QgsDateTimeRange(); 48 : : 49 : 0 : switch ( mMode ) 50 : : { 51 : : case QgsRasterLayerTemporalProperties::ModeFixedTemporalRange: 52 : 0 : return mFixedRange; 53 : : 54 : : case QgsRasterLayerTemporalProperties::ModeTemporalRangeFromDataProvider: 55 : 0 : return rasterLayer->dataProvider()->temporalCapabilities()->availableTemporalRange(); 56 : : } 57 : : 58 : 0 : return QgsDateTimeRange(); 59 : 0 : } 60 : : 61 : 0 : QList<QgsDateTimeRange> QgsRasterLayerTemporalProperties::allTemporalRanges( QgsMapLayer *layer ) const 62 : : { 63 : 0 : QgsRasterLayer *rasterLayer = qobject_cast< QgsRasterLayer *>( layer ); 64 : 0 : if ( !rasterLayer ) 65 : 0 : return {}; 66 : : 67 : 0 : switch ( mMode ) 68 : : { 69 : : case QgsRasterLayerTemporalProperties::ModeFixedTemporalRange: 70 : 0 : return { mFixedRange }; 71 : : 72 : : case QgsRasterLayerTemporalProperties::ModeTemporalRangeFromDataProvider: 73 : : { 74 : 0 : QList< QgsDateTimeRange > ranges = rasterLayer->dataProvider()->temporalCapabilities()->allAvailableTemporalRanges(); 75 : 0 : return ranges.empty() ? QList< QgsDateTimeRange > { rasterLayer->dataProvider()->temporalCapabilities()->availableTemporalRange() } : ranges; 76 : 0 : } 77 : : } 78 : : 79 : 0 : return {}; 80 : 0 : } 81 : : 82 : 0 : QgsRasterLayerTemporalProperties::TemporalMode QgsRasterLayerTemporalProperties::mode() const 83 : : { 84 : 0 : return mMode; 85 : : } 86 : : 87 : 0 : void QgsRasterLayerTemporalProperties::setMode( QgsRasterLayerTemporalProperties::TemporalMode mode ) 88 : : { 89 : 0 : if ( mMode == mode ) 90 : 0 : return; 91 : 0 : mMode = mode; 92 : 0 : } 93 : : 94 : 0 : QgsTemporalProperty::Flags QgsRasterLayerTemporalProperties::flags() const 95 : : { 96 : 0 : return mode() == ModeFixedTemporalRange ? QgsTemporalProperty::FlagDontInvalidateCachedRendersWhenRangeChanges : QgsTemporalProperty::Flags(); 97 : : } 98 : : 99 : 0 : QgsRasterDataProviderTemporalCapabilities::IntervalHandlingMethod QgsRasterLayerTemporalProperties::intervalHandlingMethod() const 100 : : { 101 : 0 : return mIntervalHandlingMethod; 102 : : } 103 : : 104 : 0 : void QgsRasterLayerTemporalProperties::setIntervalHandlingMethod( QgsRasterDataProviderTemporalCapabilities::IntervalHandlingMethod method ) 105 : : { 106 : 0 : if ( mIntervalHandlingMethod == method ) 107 : 0 : return; 108 : 0 : mIntervalHandlingMethod = method; 109 : 0 : } 110 : : 111 : 0 : void QgsRasterLayerTemporalProperties::setFixedTemporalRange( const QgsDateTimeRange &range ) 112 : : { 113 : 0 : mFixedRange = range; 114 : 0 : } 115 : : 116 : 0 : const QgsDateTimeRange &QgsRasterLayerTemporalProperties::fixedTemporalRange() const 117 : : { 118 : 0 : return mFixedRange; 119 : : } 120 : : 121 : 0 : bool QgsRasterLayerTemporalProperties::readXml( const QDomElement &element, const QgsReadWriteContext &context ) 122 : : { 123 : 0 : Q_UNUSED( context ) 124 : : // TODO add support for raster layers with multi-temporal properties. 125 : : 126 : 0 : QDomElement temporalNode = element.firstChildElement( QStringLiteral( "temporal" ) ); 127 : 0 : 128 : 0 : setIsActive( temporalNode.attribute( QStringLiteral( "enabled" ), QStringLiteral( "0" ) ).toInt() ); 129 : : 130 : 0 : mMode = static_cast< TemporalMode >( temporalNode.attribute( QStringLiteral( "mode" ), QStringLiteral( "0" ) ). toInt() ); 131 : 0 : mIntervalHandlingMethod = static_cast< QgsRasterDataProviderTemporalCapabilities::IntervalHandlingMethod >( temporalNode.attribute( QStringLiteral( "fetchMode" ), QStringLiteral( "0" ) ). toInt() ); 132 : : 133 : 0 : QDomNode rangeElement = temporalNode.namedItem( QStringLiteral( "fixedRange" ) ); 134 : : 135 : 0 : QDomNode begin = rangeElement.namedItem( QStringLiteral( "start" ) ); 136 : 0 : QDomNode end = rangeElement.namedItem( QStringLiteral( "end" ) ); 137 : : 138 : 0 : QDateTime beginDate = QDateTime::fromString( begin.toElement().text(), Qt::ISODate ); 139 : 0 : QDateTime endDate = QDateTime::fromString( end.toElement().text(), Qt::ISODate ); 140 : : 141 : 0 : QgsDateTimeRange range = QgsDateTimeRange( beginDate, endDate ); 142 : 0 : setFixedTemporalRange( range ); 143 : : 144 : : return true; 145 : 0 : } 146 : : 147 : 0 : QDomElement QgsRasterLayerTemporalProperties::writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) 148 : : { 149 : 0 : Q_UNUSED( context ) 150 : 0 : if ( element.isNull() ) 151 : 0 : return QDomElement(); 152 : : 153 : 0 : QDomElement temporalElement = document.createElement( QStringLiteral( "temporal" ) ); 154 : 0 : temporalElement.setAttribute( QStringLiteral( "enabled" ), isActive() ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); 155 : 0 : temporalElement.setAttribute( QStringLiteral( "mode" ), QString::number( mMode ) ); 156 : 0 : temporalElement.setAttribute( QStringLiteral( "fetchMode" ), QString::number( mIntervalHandlingMethod ) ); 157 : : 158 : 0 : QDomElement rangeElement = document.createElement( QStringLiteral( "fixedRange" ) ); 159 : : 160 : 0 : QDomElement startElement = document.createElement( QStringLiteral( "start" ) ); 161 : 0 : QDomElement endElement = document.createElement( QStringLiteral( "end" ) ); 162 : : 163 : 0 : QDomText startText = document.createTextNode( mFixedRange.begin().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) ); 164 : 0 : QDomText endText = document.createTextNode( mFixedRange.end().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) ); 165 : 0 : startElement.appendChild( startText ); 166 : 0 : endElement.appendChild( endText ); 167 : 0 : rangeElement.appendChild( startElement ); 168 : 0 : rangeElement.appendChild( endElement ); 169 : : 170 : 0 : temporalElement.appendChild( rangeElement ); 171 : : 172 : 0 : element.appendChild( temporalElement ); 173 : : 174 : 0 : return element; 175 : 0 : } 176 : : 177 : 0 : void QgsRasterLayerTemporalProperties::setDefaultsFromDataProviderTemporalCapabilities( const QgsDataProviderTemporalCapabilities *capabilities ) 178 : : { 179 : 0 : if ( const QgsRasterDataProviderTemporalCapabilities *rasterCaps = dynamic_cast< const QgsRasterDataProviderTemporalCapabilities *>( capabilities ) ) 180 : : { 181 : 0 : setIsActive( rasterCaps->hasTemporalCapabilities() ); 182 : 0 : setFixedTemporalRange( rasterCaps->availableTemporalRange() ); 183 : : 184 : 0 : if ( rasterCaps->hasTemporalCapabilities() ) 185 : : { 186 : 0 : setMode( ModeTemporalRangeFromDataProvider ); 187 : 0 : } 188 : : 189 : 0 : mIntervalHandlingMethod = rasterCaps->intervalHandlingMethod(); 190 : 0 : } 191 : 0 : }