QGIS API Documentation
3.26.3-Buenos Aires (65e4edfdad)
|
Go to the documentation of this file.
31 #include <QRegularExpression>
35 const QMap<QString, QgsMapLayer *> mapLayers = project->
mapLayers();
39 for (
auto it = mapLayers.constBegin(); it != mapLayers.constEnd(); ++it )
47 if ( layerRange.begin().isValid() && ( !minDate.isValid() || layerRange.begin() < minDate ) )
48 minDate = layerRange.begin();
49 if ( layerRange.end().isValid() && ( !maxDate.isValid() || layerRange.end() > maxDate ) )
50 maxDate = layerRange.end();
53 return QgsDateTimeRange( minDate, maxDate );
58 const QMap<QString, QgsMapLayer *> mapLayers = project->
mapLayers();
60 QList< QgsDateTimeRange > ranges;
61 for (
auto it = mapLayers.constBegin(); it != mapLayers.constEnd(); ++it )
71 return QgsDateTimeRange::mergeRanges( ranges );
78 error = QObject::tr(
"Filename template is empty" );
81 const int numberOfDigits = settings.
fileNameTemplate.count( QLatin1Char(
'#' ) );
82 if ( numberOfDigits < 0 )
84 error = QObject::tr(
"Wrong filename template format (must contain #)" );
87 const QString token( numberOfDigits, QLatin1Char(
'#' ) );
90 error = QObject::tr(
"Filename template must contain all # placeholders in one continuous group." );
95 error = QObject::tr(
"Output directory creation failure." );
107 long long currentFrame = 0;
109 while ( currentFrame < totalFrames )
115 error = QObject::tr(
"Export canceled" );
118 feedback->
setProgress( currentFrame /
static_cast<double>( totalFrames ) * 100 );
133 const QString frameNoPaddedLeft( QStringLiteral(
"%1" ).arg( currentFrame, numberOfDigits, 10, QChar(
'0' ) ) );
134 fileName.replace( token, frameNoPaddedLeft );
135 const QString path = QDir( settings.
outputDirectory ).filePath( fileName );
138 img.setDotsPerMeterX( 1000 * ms.
outputDpi() / 25.4 );
139 img.setDotsPerMeterY( 1000 * ms.
outputDpi() / 25.4 );
150 const auto constMDecorations = settings.
decorations;
153 decoration->render( ms, context );
173 if ( isFractional || interval.
originalUnit() == QgsUnitTypes::TemporalUnit::TemporalUnknownUnit )
175 const double duration = interval.
seconds();
176 return start.addMSecs( frame * duration * 1000 );
182 case QgsUnitTypes::TemporalUnit::TemporalMilliseconds:
184 case QgsUnitTypes::TemporalUnit::TemporalSeconds:
186 case QgsUnitTypes::TemporalUnit::TemporalMinutes:
188 case QgsUnitTypes::TemporalUnit::TemporalHours:
190 case QgsUnitTypes::TemporalUnit::TemporalDays:
192 case QgsUnitTypes::TemporalUnit::TemporalWeeks:
194 case QgsUnitTypes::TemporalUnit::TemporalMonths:
196 case QgsUnitTypes::TemporalUnit::TemporalYears:
198 case QgsUnitTypes::TemporalUnit::TemporalDecades:
200 case QgsUnitTypes::TemporalUnit::TemporalCenturies:
202 case QgsUnitTypes::TemporalUnit::TemporalUnknownUnit:
205 case QgsUnitTypes::TemporalUnit::TemporalIrregularStep:
220 if ( timeDuration.
years == 0 && timeDuration.
months == 0 && timeDuration.
weeks == 0 && timeDuration.
days == 0
231 QList<QDateTime> res;
232 QDateTime current = start;
233 maxValuesExceeded =
false;
234 while ( current <= end )
238 if ( maxValues >= 0 && res.size() > maxValues )
240 maxValuesExceeded =
true;
244 if ( timeDuration.
years )
245 current = current.addYears( timeDuration.
years );
246 if ( timeDuration.
months )
247 current = current.addMonths( timeDuration.
months );
248 if ( timeDuration.
weeks || timeDuration.
days )
249 current = current.addDays( timeDuration.
weeks * 7 + timeDuration.
days );
251 current = current.addSecs( timeDuration.
hours * 60LL * 60 + timeDuration.
minutes * 60 + timeDuration.
seconds );
259 maxValuesExceeded =
false;
260 const QStringList parts =
string.split(
'/' );
261 if ( parts.length() != 3 )
266 const QDateTime start = QDateTime::fromString( parts.at( 0 ), Qt::ISODate );
267 if ( !start.isValid() )
269 const QDateTime end = QDateTime::fromString( parts.at( 1 ), Qt::ISODate );
270 if ( !end.isValid() )
291 text.append( QString::number(
years ) );
296 text.append( QString::number(
months ) );
301 text.append( QString::number(
days ) );
307 if ( !text.contains(
'T' ) )
309 text.append( QString::number(
hours ) );
314 if ( !text.contains(
'T' ) )
316 text.append( QString::number(
minutes ) );
321 if ( !text.contains(
'T' ) )
323 text.append( QString::number(
seconds ) );
331 long long secs = 0.0;
351 QDateTime resultDateTime = dateTime;
354 resultDateTime = resultDateTime.addYears(
years );
356 resultDateTime = resultDateTime.addMonths(
months );
358 resultDateTime = resultDateTime.addDays(
weeks * 7 +
days );
362 return resultDateTime;
368 thread_local
const QRegularExpression sRx( QStringLiteral( R
"(P(?:([\d]+)Y)?(?:([\d]+)M)?(?:([\d]+)W)?(?:([\d]+)D)?(?:T(?:([\d]+)H)?(?:([\d]+)M)?(?:([\d\.]+)S)?)?$)" ) );
370 const QRegularExpressionMatch match = sRx.match(
string );
372 if ( match.hasMatch() )
375 duration.
years = match.captured( 1 ).toInt();
376 duration.
months = match.captured( 2 ).toInt();
377 duration.
weeks = match.captured( 3 ).toInt();
378 duration.
days = match.captured( 4 ).toInt();
379 duration.
hours = match.captured( 5 ).toInt();
380 duration.
minutes = match.captured( 6 ).toInt();
381 duration.
seconds = match.captured( 7 ).toDouble();
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setProgress(double progress)
Sets the current progress for the feedback object.
long long toSeconds() const
Returns the total duration in seconds.
double seconds() const
Returns the interval duration in seconds.
static bool exportAnimation(const QgsMapSettings &mapSettings, const AnimationExportSettings &settings, QString &error, QgsFeedback *feedback=nullptr)
Exports animation frames by rendering the map to multiple destination images.
long long totalFrameCount() const
Returns the total number of frames for the navigation.
virtual QList< QgsDateTimeRange > allTemporalRanges(QgsMapLayer *layer) const
Attempts to calculate the overall list of all temporal extents which are contained in the specified l...
void waitForFinished() override
Block until the job has finished.
QSize outputSize() const
Returns the size of the resulting map image, in pixels.
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
double originalDuration() const
Returns the original interval duration.
Contains settings relating to exporting animations.
static QList< QgsDateTimeRange > usedTemporalRangesForProject(QgsProject *project)
Calculates all temporal ranges which are in use for a project.
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
void setIsTemporal(bool enabled)
Sets whether the temporal range is enabled (i.e.
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
static QgsTimeDuration fromString(const QString &string, bool &ok)
Creates a QgsTimeDuration from a string value.
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
QString toString() const
Converts the duration to an ISO8601 duration string.
Contains information about the context of a rendering operation.
void setFrameRate(double rate)
Sets the frame rate of the map (in frames per second), for maps which are part of an animation.
QgsDateTimeRange dateTimeRangeForFrameNumber(long long frame) const
Calculates the temporal range associated with a particular animation frame.
virtual QgsDateTimeRange calculateTemporalExtent(QgsMapLayer *layer) const
Attempts to calculate the overall temporal extent for the specified layer, using the settings defined...
QImage::Format outputImageFormat() const
format of internal QImage, default QImage::Format_ARGB32_Premultiplied
QgsDateTimeRange animationRange
Dictates the overall temporal range of the animation.
void setCurrentFrame(long long frame)
Sets the current frame of the map, for maps which are part of an animation.
static const int MONTHS
Seconds per month, based on 30 day month.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
QString outputDirectory
Destination directory for created image files.
void start()
Start the rendering job and immediately return.
bool isActive() const
Returns true if the temporal property is active.
void setCurrentFrameNumber(long long frame)
Sets the current animation frame number.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Base class for feedback objects to be used for cancellation of something running in a worker thread.
void setTemporalExtents(const QgsDateTimeRange &extents)
Sets the navigation temporal extents, which dictate the earliest and latest date time possible in the...
static const int DAY
Seconds per day.
QString fileNameTemplate
The filename template for exporting the frames.
static const int HOUR
Seconds per hour.
QColor backgroundColor() const
Returns the background color of the map.
virtual QgsMapLayerTemporalProperties * temporalProperties()
Returns the layer's temporal properties.
static QList< QDateTime > calculateDateTimesUsingDuration(const QDateTime &start, const QDateTime &end, const QString &duration, bool &ok, bool &maxValuesExceeded, int maxValues=-1)
Calculates a complete list of datetimes between start and end, using the specified ISO8601 duration s...
QgsInterval toInterval() const
Converts the duration to an interval value.
QgsExpressionContextScope * createExpressionContextScope() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
static const int MINUTE
Seconds per minute.
void setFrameDuration(const QgsInterval &duration)
Sets the frame duration, which dictates the temporal length of each frame in the animation.
double frameRate
Target animation frame rate in frames per second.
const QgsExpressionContext & expressionContext() const
Gets the expression context.
Implements a temporal controller based on a frame by frame navigation and animation.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
Job implementation that renders everything sequentially using a custom painter.
QgsInterval frameDuration
Duration of individual export frames.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
static QList< QDateTime > calculateDateTimesFromISO8601(const QString &string, bool &ok, bool &maxValuesExceeded, int maxValues=-1)
Calculates a complete list of datetimes from a ISO8601 string containing a duration (eg "2021-03-23T0...
static QDateTime calculateFrameTime(const QDateTime &start, const long long frame, const QgsInterval &interval)
Calculates the frame time for an animation.
Contains utility methods for working with temporal layers and projects.
Base class for all map layer types. This is the base class for all map layer types (vector,...
A representation of the interval between two datetime values.
void setTemporalRange(const QgsDateTimeRange &range)
Sets the temporal range for the object.
Interface for map decorations.
double outputDpi() const
Returns the DPI (dots per inch) used for conversion between real world units (e.g.
The QgsMapSettings class contains configuration for rendering of the map. The rendering itself is don...
QList< QgsMapDecoration * > decorations
List of decorations to draw onto exported frames.
QgsUnitTypes::TemporalUnit originalUnit() const
Returns the original interval temporal unit.
static const int YEARS
Seconds per year (average)
static QgsDateTimeRange calculateTemporalRangeForProject(QgsProject *project)
Calculates the temporal range for a project.
QDateTime addToDateTime(const QDateTime &dateTime)
Adds this duration to a starting dateTime value.