35using namespace Qt::StringLiterals;
39class QgsAlgorithmElevationProfilePlotItem :
public Qgs2DXyPlot
42 explicit QgsAlgorithmElevationProfilePlotItem(
int width,
int height,
int dpi )
47 setSize( QSizeF( width, height ) );
50 void setRenderer( QgsProfilePlotRenderer *renderer ) { mRenderer = renderer; }
54 if ( !mPlotArea.isNull() )
60 QgsRenderContext context;
63 QgsPlotRenderContext plotContext;
69 void renderContent( QgsRenderContext &rc, QgsPlotRenderContext &,
const QRectF &plotArea,
const QgsPlotData & )
override
76 rc.
painter()->translate( mPlotArea.left(), mPlotArea.top() );
77 const QStringList sourceIds = mRenderer->sourceIds();
78 for (
const QString &source : sourceIds )
80 mRenderer->render( rc, mPlotArea.width(), mPlotArea.height(), xMinimum(),
xMaximum(),
yMinimum(),
yMaximum(), source );
82 rc.
painter()->translate( -mPlotArea.left(), -mPlotArea.top() );
88 QgsProfilePlotRenderer *mRenderer =
nullptr;
91void QgsGenerateElevationProfileAlgorithm::initAlgorithm(
const QVariantMap & )
101 auto minimumDistanceParam
104 addParameter( minimumDistanceParam.release() );
105 auto maximumDistanceParam
108 addParameter( maximumDistanceParam.release() );
109 auto minimumElevationParam
112 addParameter( minimumElevationParam.release() );
113 auto maximumElevationParam
116 addParameter( maximumElevationParam.release() );
118 auto textColorParam = std::make_unique<QgsProcessingParameterColor>( u
"TEXT_COLOR"_s, QObject::tr(
"Chart text color" ), QColor( 0, 0, 0 ),
true,
true );
120 addParameter( textColorParam.release() );
122 auto textFontFamilyParam = std::make_unique<QgsProcessingParameterString>( u
"TEXT_FONT_FAMILY"_s, QObject::tr(
"Chart text font family" ), QVariant(),
false,
true );
124 addParameter( textFontFamilyParam.release() );
126 auto textFontStyleParam = std::make_unique<QgsProcessingParameterString>( u
"TEXT_FONT_STYLE"_s, QObject::tr(
"Chart text font style" ), QVariant(),
false,
true );
128 addParameter( textFontStyleParam.release() );
132 addParameter( textFontSizeParam.release() );
134 auto backgroundColorParam = std::make_unique<QgsProcessingParameterColor>( u
"BACKGROUND_COLOR"_s, QObject::tr(
"Chart background color" ), QColor( 255, 255, 255 ),
true,
true );
136 addParameter( backgroundColorParam.release() );
137 auto borderColorParam = std::make_unique<QgsProcessingParameterColor>( u
"BORDER_COLOR"_s, QObject::tr(
"Chart border color" ), QColor( 99, 99, 99 ),
true,
true );
139 addParameter( borderColorParam.release() );
143 addParameter( toleranceParam.release() );
147 addParameter( dpiParam.release() );
152QString QgsGenerateElevationProfileAlgorithm::name()
const
154 return u
"generateelevationprofileimage"_s;
157QString QgsGenerateElevationProfileAlgorithm::displayName()
const
159 return QObject::tr(
"Generate elevation profile image" );
162QStringList QgsGenerateElevationProfileAlgorithm::tags()
const
164 return QObject::tr(
"altitude,elevation,terrain,dem" ).split(
',' );
167QString QgsGenerateElevationProfileAlgorithm::group()
const
169 return QObject::tr(
"Plots" );
172QString QgsGenerateElevationProfileAlgorithm::groupId()
const
177QString QgsGenerateElevationProfileAlgorithm::shortHelpString()
const
179 return QObject::tr(
"This algorithm creates an elevation profile image from a list of map layer and an optional terrain." );
182QString QgsGenerateElevationProfileAlgorithm::shortDescription()
const
184 return QObject::tr(
"Creates an elevation profile image from a list of map layer and an optional terrain." );
187QgsGenerateElevationProfileAlgorithm *QgsGenerateElevationProfileAlgorithm::createInstance()
const
189 return new QgsGenerateElevationProfileAlgorithm();
194 const QgsGeometry curveGeom = parameterAsGeometry( parameters, u
"CURVE"_s, context );
197 QList<QgsMapLayer *> layers = parameterAsLayerList( parameters, u
"MAP_LAYERS"_s, context );
198 QgsMapLayer *terrainLayer = parameterAsLayer( parameters, u
"TERRAIN_LAYER"_s, context );
200 const double tolerance = parameterAsDouble( parameters, u
"TOLERANCE"_s, context );
202 QList<QgsAbstractProfileSource *> sources;
206 sources.append( source );
210 request.setCrs( curveCrs );
211 request.setTolerance( tolerance );
219 auto terrainProvider = std::make_unique<QgsRasterDemTerrainProvider>();
220 terrainProvider->setLayer( rasterLayer );
221 request.setTerrainProvider( terrainProvider.release() );
225 auto terrainProvider = std::make_unique<QgsMeshTerrainProvider>();
226 terrainProvider->setLayer( meshLayer );
227 request.setTerrainProvider( terrainProvider.release() );
232 mRenderer = std::make_unique<QgsProfilePlotRenderer>( sources, request );
239 const QgsGeometry curveGeom = parameterAsGeometry( parameters, u
"CURVE"_s, context );
241 const bool hasMinimumDistance = parameters.value( u
"MINIMUM_DISTANCE"_s ).isValid();
242 const double minimumDistance = parameterAsDouble( parameters, u
"MINIMUM_DISTANCE"_s, context );
243 const bool hasMaximumDistance = parameters.value( u
"MAXIMUM_DISTANCE"_s ).isValid();
244 const double maximumDistance = parameterAsDouble( parameters, u
"MAXIMUM_DISTANCE"_s, context );
245 const bool hasMinimumElevation = parameters.value( u
"MINIMUM_ELEVATION"_s ).isValid();
246 const double minimumElevation = parameterAsDouble( parameters, u
"MINIMUM_ELEVATION"_s, context );
247 const bool hasMaximumElevation = parameters.value( u
"MAXIMUM_ELEVATION"_s ).isValid();
248 const double maximumElevation = parameterAsDouble( parameters, u
"MAXIMUM_ELEVATION"_s, context );
250 const int width = parameterAsInt( parameters, u
"WIDTH"_s, context );
251 const int height = parameterAsInt( parameters, u
"HEIGHT"_s, context );
252 const int dpi = parameterAsInt( parameters, u
"DPI"_s, context );
254 const QString outputImage = parameterAsString( parameters, u
"OUTPUT"_s, context );
256 const QColor textColor = parameterAsColor( parameters, u
"TEXT_COLOR"_s, context );
257 const QColor backgroundColor = parameterAsColor( parameters, u
"BACKGROUND_COLOR"_s, context );
258 const QColor borderColor = parameterAsColor( parameters, u
"BORDER_COLOR"_s, context );
260 QgsAlgorithmElevationProfilePlotItem plotItem( width, height, dpi );
262 const QString textFontFamily = parameterAsString( parameters, u
"TEXT_FONT_FAMILY"_s, context );
263 const QString textFontStyle = parameterAsString( parameters, u
"TEXT_FONT_STYLE"_s, context );
264 const double textFontSize = parameterAsDouble( parameters, u
"TEXT_FONT_SIZE"_s, context );
266 if ( !textFontFamily.isEmpty() || !textFontStyle.isEmpty() || textFontSize > 0 )
269 QFont font = textFormat.
font();
270 if ( !textFontFamily.isEmpty() )
274 if ( !textFontStyle.isEmpty() )
279 if ( textFontSize > 0 )
281 textFormat.
setSize( textFontSize );
285 plotItem.xAxis().setTextFormat( textFormat );
286 plotItem.yAxis().setTextFormat( textFormat );
289 if ( textColor.isValid() )
293 plotItem.xAxis().setTextFormat( textFormat );
294 textFormat = plotItem.yAxis().textFormat();
296 plotItem.yAxis().setTextFormat( textFormat );
299 if ( borderColor.isValid() )
301 auto lineSymbolLayer = std::make_unique<QgsSimpleLineSymbolLayer>( borderColor, 0.1 );
302 lineSymbolLayer->setPenCapStyle( Qt::FlatCap );
310 if ( backgroundColor.isValid() )
312 auto fillSymbolLayer = std::make_unique<QgsSimpleFillSymbolLayer>( backgroundColor, Qt::SolidPattern, backgroundColor );
317 generationContext.
setDpi( dpi );
321 mRenderer->setContext( generationContext );
323 mRenderer->startGeneration();
324 mRenderer->waitForFinished();
338 zMinimum = zRange.
lower() - 5;
339 zMaximum = zRange.
lower() + 5;
344 const double margin = ( zRange.
upper() - zRange.
lower() ) * 0.05;
345 zMinimum = zRange.
lower() - margin;
346 zMaximum = zRange.
upper() + margin;
349 plotItem.setYMinimum( hasMinimumElevation ? minimumElevation : zMinimum );
350 plotItem.setYMaximum( hasMaximumElevation ? maximumElevation : zMaximum );
351 plotItem.setXMinimum( hasMinimumDistance ? minimumDistance : 0 );
352 plotItem.setXMaximum( hasMaximumDistance ? maximumDistance : curveGeom.
constGet()->
length() );
354 plotItem.setRenderer( mRenderer.get() );
356 QImage image(
static_cast<int>( plotItem.size().width() ),
static_cast<int>( plotItem.size().height() ), QImage::Format_ARGB32_Premultiplied );
357 image.fill( Qt::transparent );
359 QPainter painter( &image );
360 painter.setRenderHint( QPainter::Antialiasing,
true );
365 plotItem.calculateOptimisedIntervals( renderContext, plotContext );
366 plotItem.render( renderContext, plotContext );
368 image.save( outputImage );
371 outputs.insert( u
"OUTPUT"_s, 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 QgsPlotData &plotData=QgsPlotData()) 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