35class QgsAlgorithmElevationProfilePlotItem :
public Qgs2DXyPlot
38 explicit QgsAlgorithmElevationProfilePlotItem(
int width,
int height,
int dpi )
43 setSize( QSizeF( width, height ) );
46 void setRenderer( QgsProfilePlotRenderer *renderer )
53 if ( !mPlotArea.isNull() )
59 QgsRenderContext context;
62 QgsPlotRenderContext plotContext;
68 void renderContent( QgsRenderContext &rc, QgsPlotRenderContext &,
const QRectF &plotArea,
const QgsPlotData & )
override
75 rc.
painter()->translate( mPlotArea.left(), mPlotArea.top() );
76 const QStringList sourceIds = mRenderer->sourceIds();
77 for (
const QString &source : sourceIds )
79 mRenderer->render( rc, mPlotArea.width(), mPlotArea.height(), xMinimum(),
xMaximum(),
yMinimum(),
yMaximum(), source );
81 rc.
painter()->translate( -mPlotArea.left(), -mPlotArea.top() );
87 QgsProfilePlotRenderer *mRenderer =
nullptr;
90void QgsGenerateElevationProfileAlgorithm::initAlgorithm(
const QVariantMap & )
98 auto minimumDistanceParam = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral(
"MINIMUM_DISTANCE" ), QObject::tr(
"Chart minimum distance (X axis)" ),
Qgis::ProcessingNumberParameterType::Double, QVariant(),
true );
100 addParameter( minimumDistanceParam.release() );
101 auto maximumDistanceParam = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral(
"MAXIMUM_DISTANCE" ), QObject::tr(
"Chart maximum distance (X axis)" ),
Qgis::ProcessingNumberParameterType::Double, QVariant(),
true );
103 addParameter( maximumDistanceParam.release() );
104 auto minimumElevationParam = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral(
"MINIMUM_ELEVATION" ), QObject::tr(
"Chart minimum elevation (Y axis)" ),
Qgis::ProcessingNumberParameterType::Double, QVariant(),
true );
106 addParameter( minimumElevationParam.release() );
107 auto maximumElevationParam = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral(
"MAXIMUM_ELEVATION" ), QObject::tr(
"Chart maximum elevation (Y axis)" ),
Qgis::ProcessingNumberParameterType::Double, QVariant(),
true );
109 addParameter( maximumElevationParam.release() );
111 auto textColorParam = std::make_unique<QgsProcessingParameterColor>( QStringLiteral(
"TEXT_COLOR" ), QObject::tr(
"Chart text color" ), QColor( 0, 0, 0 ),
true,
true );
113 addParameter( textColorParam.release() );
115 auto textFontFamilyParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"TEXT_FONT_FAMILY" ), QObject::tr(
"Chart text font family" ), QVariant(),
false,
true );
117 addParameter( textFontFamilyParam.release() );
119 auto textFontStyleParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"TEXT_FONT_STYLE" ), QObject::tr(
"Chart text font style" ), QVariant(),
false,
true );
121 addParameter( textFontStyleParam.release() );
125 addParameter( textFontSizeParam.release() );
127 auto backgroundColorParam = std::make_unique<QgsProcessingParameterColor>( QStringLiteral(
"BACKGROUND_COLOR" ), QObject::tr(
"Chart background color" ), QColor( 255, 255, 255 ),
true,
true );
129 addParameter( backgroundColorParam.release() );
130 auto borderColorParam = std::make_unique<QgsProcessingParameterColor>( QStringLiteral(
"BORDER_COLOR" ), QObject::tr(
"Chart border color" ), QColor( 99, 99, 99 ),
true,
true );
132 addParameter( borderColorParam.release() );
136 addParameter( toleranceParam.release() );
140 addParameter( dpiParam.release() );
145QString QgsGenerateElevationProfileAlgorithm::name()
const
147 return QStringLiteral(
"generateelevationprofileimage" );
150QString QgsGenerateElevationProfileAlgorithm::displayName()
const
152 return QObject::tr(
"Generate elevation profile image" );
155QStringList QgsGenerateElevationProfileAlgorithm::tags()
const
157 return QObject::tr(
"altitude,elevation,terrain,dem" ).split(
',' );
160QString QgsGenerateElevationProfileAlgorithm::group()
const
162 return QObject::tr(
"Plots" );
165QString QgsGenerateElevationProfileAlgorithm::groupId()
const
167 return QStringLiteral(
"plots" );
170QString QgsGenerateElevationProfileAlgorithm::shortHelpString()
const
172 return QObject::tr(
"This algorithm creates an elevation profile image from a list of map layer and an optional terrain." );
175QString QgsGenerateElevationProfileAlgorithm::shortDescription()
const
177 return QObject::tr(
"Creates an elevation profile image from a list of map layer and an optional terrain." );
180QgsGenerateElevationProfileAlgorithm *QgsGenerateElevationProfileAlgorithm::createInstance()
const
182 return new QgsGenerateElevationProfileAlgorithm();
187 const QgsGeometry curveGeom = parameterAsGeometry( parameters, QStringLiteral(
"CURVE" ), context );
190 QList<QgsMapLayer *> layers = parameterAsLayerList( parameters, QStringLiteral(
"MAP_LAYERS" ), context );
191 QgsMapLayer *terrainLayer = parameterAsLayer( parameters, QStringLiteral(
"TERRAIN_LAYER" ), context );
193 const double tolerance = parameterAsDouble( parameters, QStringLiteral(
"TOLERANCE" ), context );
195 QList<QgsAbstractProfileSource *> sources;
199 sources.append( source );
203 request.setCrs( curveCrs );
204 request.setTolerance( tolerance );
212 auto terrainProvider = std::make_unique<QgsRasterDemTerrainProvider>();
213 terrainProvider->setLayer( rasterLayer );
214 request.setTerrainProvider( terrainProvider.release() );
218 auto terrainProvider = std::make_unique<QgsMeshTerrainProvider>();
219 terrainProvider->setLayer( meshLayer );
220 request.setTerrainProvider( terrainProvider.release() );
225 mRenderer = std::make_unique<QgsProfilePlotRenderer>( sources, request );
232 const QgsGeometry curveGeom = parameterAsGeometry( parameters, QStringLiteral(
"CURVE" ), context );
234 const bool hasMinimumDistance = parameters.value( QStringLiteral(
"MINIMUM_DISTANCE" ) ).isValid();
235 const double minimumDistance = parameterAsDouble( parameters, QStringLiteral(
"MINIMUM_DISTANCE" ), context );
236 const bool hasMaximumDistance = parameters.value( QStringLiteral(
"MAXIMUM_DISTANCE" ) ).isValid();
237 const double maximumDistance = parameterAsDouble( parameters, QStringLiteral(
"MAXIMUM_DISTANCE" ), context );
238 const bool hasMinimumElevation = parameters.value( QStringLiteral(
"MINIMUM_ELEVATION" ) ).isValid();
239 const double minimumElevation = parameterAsDouble( parameters, QStringLiteral(
"MINIMUM_ELEVATION" ), context );
240 const bool hasMaximumElevation = parameters.value( QStringLiteral(
"MAXIMUM_ELEVATION" ) ).isValid();
241 const double maximumElevation = parameterAsDouble( parameters, QStringLiteral(
"MAXIMUM_ELEVATION" ), context );
243 const int width = parameterAsInt( parameters, QStringLiteral(
"WIDTH" ), context );
244 const int height = parameterAsInt( parameters, QStringLiteral(
"HEIGHT" ), context );
245 const int dpi = parameterAsInt( parameters, QStringLiteral(
"DPI" ), context );
247 const QString outputImage = parameterAsString( parameters, QStringLiteral(
"OUTPUT" ), context );
249 const QColor textColor = parameterAsColor( parameters, QStringLiteral(
"TEXT_COLOR" ), context );
250 const QColor backgroundColor = parameterAsColor( parameters, QStringLiteral(
"BACKGROUND_COLOR" ), context );
251 const QColor borderColor = parameterAsColor( parameters, QStringLiteral(
"BORDER_COLOR" ), context );
253 QgsAlgorithmElevationProfilePlotItem plotItem( width, height, dpi );
255 const QString textFontFamily = parameterAsString( parameters, QStringLiteral(
"TEXT_FONT_FAMILY" ), context );
256 const QString textFontStyle = parameterAsString( parameters, QStringLiteral(
"TEXT_FONT_STYLE" ), context );
257 const double textFontSize = parameterAsDouble( parameters, QStringLiteral(
"TEXT_FONT_SIZE" ), context );
259 if ( !textFontFamily.isEmpty() || !textFontStyle.isEmpty() || textFontSize > 0 )
262 QFont font = textFormat.
font();
263 if ( !textFontFamily.isEmpty() )
267 if ( !textFontStyle.isEmpty() )
272 if ( textFontSize > 0 )
274 textFormat.
setSize( textFontSize );
278 plotItem.xAxis().setTextFormat( textFormat );
279 plotItem.yAxis().setTextFormat( textFormat );
282 if ( textColor.isValid() )
286 plotItem.xAxis().setTextFormat( textFormat );
287 textFormat = plotItem.yAxis().textFormat();
289 plotItem.yAxis().setTextFormat( textFormat );
292 if ( borderColor.isValid() )
294 auto lineSymbolLayer = std::make_unique<QgsSimpleLineSymbolLayer>( borderColor, 0.1 );
295 lineSymbolLayer->setPenCapStyle( Qt::FlatCap );
303 if ( backgroundColor.isValid() )
305 auto fillSymbolLayer = std::make_unique<QgsSimpleFillSymbolLayer>( backgroundColor, Qt::SolidPattern, backgroundColor );
310 generationContext.
setDpi( dpi );
314 mRenderer->setContext( generationContext );
316 mRenderer->startGeneration();
317 mRenderer->waitForFinished();
331 zMinimum = zRange.
lower() - 5;
332 zMaximum = zRange.
lower() + 5;
337 const double margin = ( zRange.
upper() - zRange.
lower() ) * 0.05;
338 zMinimum = zRange.
lower() - margin;
339 zMaximum = zRange.
upper() + margin;
342 plotItem.setYMinimum( hasMinimumElevation ? minimumElevation : zMinimum );
343 plotItem.setYMaximum( hasMaximumElevation ? maximumElevation : zMaximum );
344 plotItem.setXMinimum( hasMinimumDistance ? minimumDistance : 0 );
345 plotItem.setXMaximum( hasMaximumDistance ? maximumDistance : curveGeom.
constGet()->
length() );
347 plotItem.setRenderer( mRenderer.get() );
349 QImage image(
static_cast<int>( plotItem.size().width() ),
static_cast<int>( plotItem.size().height() ), QImage::Format_ARGB32_Premultiplied );
350 image.fill( Qt::transparent );
352 QPainter painter( &image );
353 painter.setRenderHint( QPainter::Antialiasing,
true );
358 plotItem.calculateOptimisedIntervals( renderContext, plotContext );
359 plotItem.render( renderContext, plotContext );
361 image.save( outputImage );
364 outputs.insert( QStringLiteral(
"OUTPUT" ), outputImage );
@ MapLayer
Any map layer type (raster, vector, mesh, point cloud, annotation or plugin layer).
@ Points
Points (e.g., for font sizes).
@ Hidden
Parameter is hidden and should not be shown to users.
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
virtual void renderContent(QgsRenderContext &context, QgsPlotRenderContext &plotContext, const QRectF &plotArea, const QgsPlotData &plotData=QgsPlotData())
Renders the plot content.
void setSize(QSizeF size)
Sets the overall size of the plot (including titles and over components which sit outside the plot ar...
Base class for 2-dimensional plot/chart/graphs with an X and Y axes.
double yMaximum() const
Returns the maximum value of the y axis.
void setYMinimum(double minimum)
Sets the minimum value of the y axis.
void calculateOptimisedIntervals(QgsRenderContext &context, QgsPlotRenderContext &plotContext)
Automatically sets the grid and label intervals to optimal values for display in the given render con...
double yMinimum() const
Returns the minimum value of the y axis.
QRectF interiorPlotArea(QgsRenderContext &context, QgsPlotRenderContext &plotContext) const override
Returns the area of the plot which corresponds to the actual plot content (excluding all titles and o...
void setYMaximum(double maximum)
Sets the maximum value of the y axis.
double xMaximum() const
Returns the maximum value of the x axis.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
Interface for classes which can generate elevation profiles.
Represents a coordinate reference system (CRS).
Abstract base class for curved geometry type.
QgsRange which stores a range of double values.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
static bool updateFontViaStyle(QFont &f, const QString &fontstyle, bool fallback=false)
Updates font with named style and retain all font properties.
static void setFontFamily(QFont &font, const QString &family)
Sets the family for a font object.
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
A line symbol type, for rendering LineString and MultiLineString geometries.
Base class for all map layer types.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Contains information about the context of a plot rendering operation.
Contains information about the context in which a processing algorithm is executed.
QgsExpressionContext & expressionContext()
Returns the expression context.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Base class for providing feedback from a processing algorithm.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
A geometry parameter for processing algorithms.
A map layer parameter for processing algorithms.
A parameter for processing algorithms which accepts multiple map layers.
A numeric parameter for processing algorithms.
Encapsulates the context in which an elevation profile is to be generated.
void setDpi(double dpi)
Sets the dpi (dots per inch) for the profie, to be used in size conversions.
void setMaximumErrorMapUnits(double error)
Sets the maximum allowed error in the generated result, in profile curve map units.
void setMapUnitsPerDistancePixel(double units)
Sets the number of map units per pixel in the distance dimension.
Encapsulates properties and constraints relating to fetching elevation profiles from different source...
T lower() const
Returns the lower bound of the range.
T upper() const
Returns the upper bound of the range.
Represents a raster layer.
Contains information about the context of a rendering operation.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
QPainter * painter()
Returns the destination QPainter for the render operation.
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
Container for all settings relating to text rendering.
void setColor(const QColor &color)
Sets the color that text will be rendered in.
void setSize(double size)
Sets the size for rendered text.
void setFont(const QFont &font)
Sets the font used for rendering text.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the size of rendered text.
QFont font() const
Returns the font used for rendering text.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QList< QgsSymbolLayer * > QgsSymbolLayerList