Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvectorlayertemporalproperties.h 3 : : --------------- 4 : : begin : May 2020 5 : : copyright : (C) 2020 by Nyall Dawson 6 : : email : nyall dot dawson 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 : : 18 : : 19 : : #ifndef QGSVECTORLAYERTEMPORALPROPERTIES_H 20 : : #define QGSVECTORLAYERTEMPORALPROPERTIES_H 21 : : 22 : : #include "qgis_core.h" 23 : : #include "qgis_sip.h" 24 : : #include "qgsrange.h" 25 : : #include "qgsmaplayertemporalproperties.h" 26 : : #include "qgsrasterdataprovidertemporalcapabilities.h" 27 : : #include "qgsunittypes.h" 28 : : 29 : : class QgsVectorLayer; 30 : : class QgsFields; 31 : : 32 : : /** 33 : : * \class QgsVectorLayerTemporalContext 34 : : * \ingroup core 35 : : * \brief Encapsulates the context in which a QgsVectorLayer's temporal capabilities 36 : : * will be applied 37 : : * 38 : : * \since QGIS 3.14 39 : : */ 40 : 0 : class CORE_EXPORT QgsVectorLayerTemporalContext 41 : : { 42 : : public: 43 : : 44 : : /** 45 : : * Returns the associated layer. 46 : : * 47 : : * \see setLayer() 48 : : */ 49 : : QgsVectorLayer *layer() const; 50 : : 51 : : /** 52 : : * Sets the associated \a layer. 53 : : * 54 : : * \see layer() 55 : : */ 56 : : void setLayer( QgsVectorLayer *layer ); 57 : : 58 : : private: 59 : : 60 : 0 : QgsVectorLayer *mLayer = nullptr; 61 : : }; 62 : : 63 : : /** 64 : : * \class QgsVectorLayerTemporalProperties 65 : : * \ingroup core 66 : : * \brief Implementation of map layer temporal properties for vector layers. 67 : : * 68 : : * \since QGIS 3.14 69 : : */ 70 : : class CORE_EXPORT QgsVectorLayerTemporalProperties : public QgsMapLayerTemporalProperties 71 : : { 72 : : Q_OBJECT 73 : : 74 : : public: 75 : : 76 : : /** 77 : : * Constructor for QgsVectorLayerTemporalProperties, with the specified \a parent object. 78 : : * 79 : : * The \a enabled argument specifies whether the temporal properties are initially enabled or not (see isActive()). 80 : : */ 81 : : QgsVectorLayerTemporalProperties( QObject *parent SIP_TRANSFERTHIS = nullptr, bool enabled = false ); 82 : : 83 : : bool isVisibleInTemporalRange( const QgsDateTimeRange &range ) const override; 84 : : QgsDateTimeRange calculateTemporalExtent( QgsMapLayer *layer ) const override SIP_SKIP; 85 : : 86 : : /** 87 : : * Mode of the vector temporal properties 88 : : **/ 89 : : enum TemporalMode 90 : : { 91 : : ModeFixedTemporalRange = 0, //!< Mode when temporal properties have fixed start and end datetimes. 92 : : ModeFeatureDateTimeInstantFromField, //!< Mode when features have a datetime instant taken from a single field 93 : : ModeFeatureDateTimeStartAndEndFromFields, //!< Mode when features have separate fields for start and end times 94 : : ModeFeatureDateTimeStartAndDurationFromFields, //!< Mode when features have a field for start time and a field for event duration 95 : : ModeFeatureDateTimeStartAndEndFromExpressions, //!< Mode when features use expressions for start and end times 96 : : ModeRedrawLayerOnly, //!< Redraw the layer when temporal range changes, but don't apply any filtering. Useful when symbology or rule based renderer expressions depend on the time range. 97 : : }; 98 : : 99 : : /** 100 : : * Returns the temporal properties mode. 101 : : * 102 : : *\see setMode() 103 : : **/ 104 : : TemporalMode mode() const; 105 : : 106 : : /** 107 : : * Sets the temporal properties \a mode. 108 : : * 109 : : *\see mode() 110 : : **/ 111 : : void setMode( TemporalMode mode ); 112 : : 113 : : /** 114 : : * Returns flags associated to the temporal property. 115 : : */ 116 : : QgsTemporalProperty::Flags flags() const override; 117 : : 118 : : /** 119 : : * Sets a temporal \a range to apply to the whole layer. All features from 120 : : * the layer will be rendered whenever the current datetime range of 121 : : * a render context intersects the specified \a range. 122 : : * 123 : : * \warning This setting is only effective when mode() is 124 : : * QgsVectorLayerTemporalProperties::ModeFixedTemporalRange 125 : : * 126 : : * \see fixedTemporalRange() 127 : : */ 128 : : void setFixedTemporalRange( const QgsDateTimeRange &range ); 129 : : 130 : : /** 131 : : * Returns the fixed temporal range for the layer. 132 : : * 133 : : * \warning To be used only when mode() is 134 : : * QgsVectorLayerTemporalProperties::ModeFixedTemporalRange 135 : : * 136 : : * \see setFixedTemporalRange() 137 : : **/ 138 : : const QgsDateTimeRange &fixedTemporalRange() const; 139 : : 140 : : /** 141 : : * Returns the name of the start datetime field, which 142 : : * contains the start time for the feature's time spans. 143 : : * 144 : : * If mode() is ModeFeatureDateTimeInstantFromField, then this field 145 : : * represents both the start AND end times. 146 : : * 147 : : * \see setStartField() 148 : : * \see endField() 149 : : */ 150 : : QString startField() const; 151 : : 152 : : /** 153 : : * Sets the name of the start datetime \a field, which 154 : : * contains the start time for the feature's time spans. 155 : : * 156 : : * If mode() is ModeFeatureDateTimeInstantFromField, then this field 157 : : * represents both the start AND end times. 158 : : * 159 : : * \see startField() 160 : : * \see setEndField() 161 : : */ 162 : : void setStartField( const QString &field ); 163 : : 164 : : /** 165 : : * Returns the name of the end datetime field, which 166 : : * contains the end time for the feature's time spans. 167 : : * 168 : : * \see setEndField() 169 : : * \see startField() 170 : : */ 171 : : QString endField() const; 172 : : 173 : : /** 174 : : * Sets the name of the end datetime \a field, which 175 : : * contains the end time for the feature's time spans. 176 : : * 177 : : * \see endField() 178 : : * \see setStartField() 179 : : */ 180 : : void setEndField( const QString &field ); 181 : : 182 : : /** 183 : : * Returns the expression for the start time for the feature's time spans. 184 : : * 185 : : * \warning This setting is only effective when mode() is 186 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeStartAndEndFromExpressions 187 : : * 188 : : * \see setStartExpression() 189 : : * \see endExpression() 190 : : */ 191 : : QString startExpression() const; 192 : : 193 : : /** 194 : : * Sets the \a expression to use for the start time for the feature's time spans. 195 : : * 196 : : * \warning This setting is only effective when mode() is 197 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeStartAndEndFromExpressions 198 : : * 199 : : * \see startExpression() 200 : : * \see setEndExpression() 201 : : */ 202 : : void setStartExpression( const QString &expression ); 203 : : 204 : : /** 205 : : * Returns the expression for the end time for the feature's time spans. 206 : : * 207 : : * \warning This setting is only effective when mode() is 208 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeStartAndEndFromExpressions 209 : : * 210 : : * \see setEndExpression() 211 : : * \see startExpression() 212 : : */ 213 : : QString endExpression() const; 214 : : 215 : : /** 216 : : * Sets the \a expression to use for the end time for the feature's time spans. 217 : : * 218 : : * \warning This setting is only effective when mode() is 219 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeStartAndEndFromExpressions 220 : : * 221 : : * \see endExpression() 222 : : * \see setStartExpression() 223 : : */ 224 : : void setEndExpression( const QString &endExpression ); 225 : : 226 : : /** 227 : : * Returns the name of the duration field, which 228 : : * contains the duration of the event. 229 : : * 230 : : * Units are specified by durationUnits() 231 : : * 232 : : * \warning This setting is only effective when mode() is 233 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeStartAndDurationFromFields 234 : : * 235 : : * \see setDurationField() 236 : : * \see durationUnits() 237 : : */ 238 : : QString durationField() const; 239 : : 240 : : /** 241 : : * Sets the name of the duration \a field, which 242 : : * contains the duration of the event. 243 : : * 244 : : * Units are specified by setDurationUnits() 245 : : * 246 : : * \warning This setting is only effective when mode() is 247 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeStartAndDurationFromFields 248 : : * 249 : : * \see durationField() 250 : : * \see setDurationUnits() 251 : : */ 252 : : void setDurationField( const QString &field ); 253 : : 254 : : /** 255 : : * Returns the units of the event's duration. 256 : : * 257 : : * \see setDurationUnits() 258 : : */ 259 : : QgsUnitTypes::TemporalUnit durationUnits() const; 260 : : 261 : : /** 262 : : * Sets the \a units of the event's duration. 263 : : * 264 : : * \see durationUnits() 265 : : */ 266 : : void setDurationUnits( QgsUnitTypes::TemporalUnit units ); 267 : : 268 : : /** 269 : : * Returns the fixed duration length, which contains the duration of the event. 270 : : * 271 : : * Units are specified by durationUnits() 272 : : * 273 : : * \warning This setting is only effective when mode() is 274 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeInstantFromField 275 : : * 276 : : * \see setFixedDuration() 277 : : * \see durationUnits() 278 : : */ 279 : : double fixedDuration() const; 280 : : 281 : : /** 282 : : * Sets the fixed event \a duration, which contains the duration of the event. 283 : : * 284 : : * Units are specified by setDurationUnits() 285 : : * 286 : : * \warning This setting is only effective when mode() is 287 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeInstantFromField 288 : : * 289 : : * \see fixedDuration() 290 : : * \see setDurationUnits() 291 : : */ 292 : : void setFixedDuration( double duration ); 293 : : 294 : : /** 295 : : * Returns TRUE if features will be accumulated over time (i.e. all features which 296 : : * occur before or within the map's temporal range should be rendered). 297 : : * 298 : : * \warning This setting is only effective when mode() is 299 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeInstantFromField 300 : : * 301 : : * \see setAccumulateFeatures() 302 : : */ 303 : : bool accumulateFeatures() const; 304 : : 305 : : /** 306 : : * Sets whether features will be accumulated over time (i.e. all features which 307 : : * occur before or within the map's temporal range should be rendered). 308 : : * 309 : : * \warning This setting is only effective when mode() is 310 : : * QgsVectorLayerTemporalProperties::ModeFeatureDateTimeInstantFromField 311 : : * 312 : : * \see accumulateFeatures() 313 : : */ 314 : : void setAccumulateFeatures( bool accumulate ); 315 : : 316 : : /** 317 : : * Creates a QGIS expression filter string for filtering features within 318 : : * the specified \a context to those within the specified time \a range. 319 : : * 320 : : * The returned expression string considers the mode() and other related 321 : : * settings (such as startField()) when building the filter string. 322 : : * 323 : : * \warning Note that ModeFixedTemporalRange is intentional NOT handled by this method 324 : : * and if mode() is ModeFixedTemporalRange then an empty string will be returned. Use 325 : : * isVisibleInTemporalRange() when testing whether features from a layer set to the 326 : : * ModeFixedTemporalRange should ALL be filtered out. 327 : : */ 328 : : QString createFilterString( const QgsVectorLayerTemporalContext &context, const QgsDateTimeRange &range ) const; 329 : : 330 : : /** 331 : : * Attempts to setup the temporal properties by scanning a set of \a fields 332 : : * and looking for standard naming conventions (e.g. "begin_date"). 333 : : */ 334 : : void guessDefaultsFromFields( const QgsFields &fields ); 335 : : 336 : : QDomElement writeXml( QDomElement &element, QDomDocument &doc, const QgsReadWriteContext &context ) override; 337 : : bool readXml( const QDomElement &element, const QgsReadWriteContext &context ) override; 338 : : void setDefaultsFromDataProviderTemporalCapabilities( const QgsDataProviderTemporalCapabilities *capabilities ) override; 339 : : 340 : : private: 341 : : 342 : : //! Temporal layer mode. 343 : : TemporalMode mMode = ModeFixedTemporalRange; 344 : : 345 : : //! Represents fixed temporal range. 346 : : QgsDateTimeRange mFixedRange; 347 : : 348 : : QString mStartFieldName; 349 : : QString mEndFieldName; 350 : : QString mDurationFieldName; 351 : : QgsUnitTypes::TemporalUnit mDurationUnit = QgsUnitTypes::TemporalMinutes; 352 : : 353 : : double mFixedDuration = 0; 354 : : 355 : : bool mAccumulateFeatures = false; 356 : : 357 : : QString mStartExpression; 358 : : QString mEndExpression; 359 : : 360 : : }; 361 : : 362 : : #endif // QGSVECTORLAYERTEMPORALPROPERTIES_H