34class QgsAlgorithmElevationProfilePlotItem:
public Qgs2DPlot
38 explicit QgsAlgorithmElevationProfilePlotItem(
int width,
int height,
int dpi )
43 setSize( QSizeF( width, height ) );
53 if ( !mPlotArea.isNull() )
74 rc.
painter()->translate( mPlotArea.left(), mPlotArea.top() );
75 const QStringList sourceIds = mRenderer->sourceIds();
76 for (
const QString &source : sourceIds )
78 mRenderer->render( rc, mPlotArea.width(), mPlotArea.height(), xMinimum(),
xMaximum(),
yMinimum(),
yMaximum(), source );
80 rc.
painter()->translate( -mPlotArea.left(), -mPlotArea.top() );
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() );
114 auto backgroundColorParam = std::make_unique< QgsProcessingParameterColor >( QStringLiteral(
"BACKGROUND_COLOR" ), QObject::tr(
"Chart background color" ), QColor( 255, 255, 255 ),
true,
true );
116 addParameter( backgroundColorParam.release() );
117 auto borderColorParam = std::make_unique< QgsProcessingParameterColor >( QStringLiteral(
"BORDER_COLOR" ), QObject::tr(
"Chart border color" ), QColor( 99, 99, 99 ),
true,
true );
119 addParameter( borderColorParam.release() );
123 addParameter( toleranceParam.release() );
127 addParameter( dpiParam.release() );
132QString QgsGenerateElevationProfileAlgorithm::name()
const
134 return QStringLiteral(
"generateelevationprofileimage" );
137QString QgsGenerateElevationProfileAlgorithm::displayName()
const
139 return QObject::tr(
"Generate elevation profile image" );
142QStringList QgsGenerateElevationProfileAlgorithm::tags()
const
144 return QObject::tr(
"altitude,elevation,terrain,dem" ).split(
',' );
147QString QgsGenerateElevationProfileAlgorithm::group()
const
149 return QObject::tr(
"Plots" );
152QString QgsGenerateElevationProfileAlgorithm::groupId()
const
154 return QStringLiteral(
"plots" );
157QString QgsGenerateElevationProfileAlgorithm::shortHelpString()
const
159 return QObject::tr(
"This algorithm creates an elevation profile image from a list of map layer and an optional terrain." );
162QgsGenerateElevationProfileAlgorithm *QgsGenerateElevationProfileAlgorithm::createInstance()
const
164 return new QgsGenerateElevationProfileAlgorithm();
169 const QgsGeometry curveGeom = parameterAsGeometry( parameters, QStringLiteral(
"CURVE" ), context );
172 QList<QgsMapLayer *> layers = parameterAsLayerList( parameters, QStringLiteral(
"MAP_LAYERS" ), context );
173 QgsMapLayer *terrainLayer = parameterAsLayer( parameters, QStringLiteral(
"TERRAIN_LAYER" ), context );
175 const double tolerance = parameterAsDouble( parameters, QStringLiteral(
"TOLERANCE" ), context );
177 QList<QgsAbstractProfileSource *> sources;
181 sources.append( source );
185 request.setCrs( curveCrs );
186 request.setTolerance( tolerance );
194 std::unique_ptr<QgsRasterDemTerrainProvider> terrainProvider = std::make_unique<QgsRasterDemTerrainProvider>();
195 terrainProvider->setLayer( rasterLayer );
196 request.setTerrainProvider( terrainProvider.release() );
200 std::unique_ptr<QgsMeshTerrainProvider> terrainProvider = std::make_unique<QgsMeshTerrainProvider>();
201 terrainProvider->setLayer( meshLayer );
202 request.setTerrainProvider( terrainProvider.release() );
207 mRenderer = std::make_unique<QgsProfilePlotRenderer>( sources, request );
214 const QgsGeometry curveGeom = parameterAsGeometry( parameters, QStringLiteral(
"CURVE" ), context );
216 const bool hasMinimumDistance = parameters.value( QStringLiteral(
"MINIMUM_DISTANCE" ) ).isValid();
217 const double minimumDistance = parameterAsDouble( parameters, QStringLiteral(
"MINIMUM_DISTANCE" ), context );
218 const bool hasMaximumDistance = parameters.value( QStringLiteral(
"MAXIMUM_DISTANCE" ) ).isValid();
219 const double maximumDistance = parameterAsDouble( parameters, QStringLiteral(
"MAXIMUM_DISTANCE" ), context );
220 const bool hasMinimumElevation = parameters.value( QStringLiteral(
"MINIMUM_ELEVATION" ) ).isValid();
221 const double minimumElevation = parameterAsDouble( parameters, QStringLiteral(
"MINIMUM_ELEVATION" ), context );
222 const bool hasMaximumElevation = parameters.value( QStringLiteral(
"MAXIMUM_ELEVATION" ) ).isValid();
223 const double maximumElevation = parameterAsDouble( parameters, QStringLiteral(
"MAXIMUM_ELEVATION" ), context );
225 const int width = parameterAsInt( parameters, QStringLiteral(
"WIDTH" ), context );
226 const int height = parameterAsInt( parameters, QStringLiteral(
"HEIGHT" ), context );
227 const int dpi = parameterAsInt( parameters, QStringLiteral(
"DPI" ), context );
229 const QString outputImage = parameterAsString( parameters, QStringLiteral(
"OUTPUT" ), context );
231 const QColor textColor = parameterAsColor( parameters, QStringLiteral(
"TEXT_COLOR" ), context );
232 const QColor backgroundColor = parameterAsColor( parameters, QStringLiteral(
"BACKGROUND_COLOR" ), context );
233 const QColor borderColor = parameterAsColor( parameters, QStringLiteral(
"BORDER_COLOR" ), context );
235 QgsAlgorithmElevationProfilePlotItem plotItem( width, height, dpi );
237 if ( textColor.isValid() )
241 plotItem.xAxis().setTextFormat( textFormat );
242 textFormat = plotItem.yAxis().textFormat();
244 plotItem.yAxis().setTextFormat( textFormat );
247 if ( borderColor.isValid() )
249 std::unique_ptr<QgsSimpleLineSymbolLayer> lineSymbolLayer = std::make_unique<QgsSimpleLineSymbolLayer>( borderColor, 0.1 );
250 lineSymbolLayer->setPenCapStyle( Qt::FlatCap );
258 if ( backgroundColor.isValid() )
260 std::unique_ptr<QgsSimpleFillSymbolLayer> fillSymbolLayer = std::make_unique<QgsSimpleFillSymbolLayer>( backgroundColor, Qt::SolidPattern, backgroundColor );
265 generationContext.
setDpi( dpi );
269 mRenderer->setContext( generationContext );
271 mRenderer->startGeneration();
272 mRenderer->waitForFinished();
286 zMinimum = zRange.
lower() - 5;
287 zMaximum = zRange.
lower() + 5;
292 const double margin = ( zRange.
upper() - zRange.
lower() ) * 0.05;
293 zMinimum = zRange.
lower() - margin;
294 zMaximum = zRange.
upper() + margin;
297 plotItem.setYMinimum( hasMinimumElevation ? minimumElevation : zMinimum );
298 plotItem.setYMaximum( hasMaximumElevation ? maximumElevation : zMaximum );
299 plotItem.setXMinimum( hasMinimumDistance ? minimumDistance : 0 );
300 plotItem.setXMaximum( hasMaximumDistance ? maximumDistance : curveGeom.constGet()->length() );
302 plotItem.setRenderer( mRenderer.get() );
304 QImage image(
static_cast<int>( plotItem.size().width() ),
static_cast<int>( plotItem.size().height() ), QImage::Format_ARGB32_Premultiplied );
305 image.fill( Qt::transparent );
307 QPainter painter( &image );
308 painter.setRenderHint( QPainter::Antialiasing,
true );
312 plotItem.calculateOptimisedIntervals( renderContext );
313 plotItem.render( renderContext );
315 image.save( outputImage );
318 outputs.insert( QStringLiteral(
"OUTPUT" ), outputImage );
@ MapLayer
Any map layer type (raster, vector, mesh, point cloud, annotation or plugin layer)
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
Base class for 2-dimensional plot/chart/graphs.
void calculateOptimisedIntervals(QgsRenderContext &context)
Automatically sets the grid and label intervals to optimal values for display in the given render con...
double yMaximum() const
Returns the maximum value of the y axis.
void setSize(QSizeF size)
Sets the overall size of the plot (including titles and over components which sit outside the plot ar...
double xMaximum() const
Returns the maximum value of the x axis.
void setYMaximum(double maximum)
Sets the maximum value of the y axis.
double yMinimum() const
Returns the minimum value of the y axis.
QRectF interiorPlotArea(QgsRenderContext &context) const
Returns the area of the plot which corresponds to the actual plot content (excluding all titles and o...
void setYMinimum(double minimum)
Sets the minimum value of the y axis.
virtual void renderContent(QgsRenderContext &context, const QRectF &plotArea)
Renders the plot content.
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.
This class 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.
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 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.
Generates and renders elevation profile plots.
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.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QList< QgsSymbolLayer * > QgsSymbolLayerList