32  setDefaultProfileLineSymbol( color );
 
   33  setDefaultProfileFillSymbol( color );
 
   45  QDomElement element = document.createElement( QStringLiteral( 
"elevation" ) );
 
   46  element.setAttribute( QStringLiteral( 
"enabled" ), mEnabled ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) );
 
   47  element.setAttribute( QStringLiteral( 
"symbology" ), 
qgsEnumValueToKey( mSymbology ) );
 
   48  if ( !std::isnan( mElevationLimit ) )
 
   49    element.setAttribute( QStringLiteral( 
"elevationLimit" ), 
qgsDoubleToString( mElevationLimit ) );
 
   52  element.setAttribute( QStringLiteral( 
"band" ), mBandNumber );
 
   54  QDomElement profileLineSymbolElement = document.createElement( QStringLiteral( 
"profileLineSymbol" ) );
 
   56  element.appendChild( profileLineSymbolElement );
 
   58  QDomElement profileFillSymbolElement = document.createElement( QStringLiteral( 
"profileFillSymbol" ) );
 
   60  element.appendChild( profileFillSymbolElement );
 
   62  parentElement.appendChild( element );
 
   68  const QDomElement elevationElement = element.firstChildElement( QStringLiteral( 
"elevation" ) ).toElement();
 
   69  mEnabled = elevationElement.attribute( QStringLiteral( 
"enabled" ), QStringLiteral( 
"0" ) ).toInt();
 
   71  if ( elevationElement.hasAttribute( QStringLiteral( 
"elevationLimit" ) ) )
 
   72    mElevationLimit = elevationElement.attribute( QStringLiteral( 
"elevationLimit" ) ).toDouble();
 
   74    mElevationLimit = std::numeric_limits< double >::quiet_NaN();
 
   77  mBandNumber = elevationElement.attribute( QStringLiteral( 
"band" ), QStringLiteral( 
"1" ) ).toInt();
 
   81  const QDomElement profileLineSymbolElement = elevationElement.firstChildElement( QStringLiteral( 
"profileLineSymbol" ) ).firstChildElement( QStringLiteral( 
"symbol" ) );
 
   82  mProfileLineSymbol.reset( QgsSymbolLayerUtils::loadSymbol< QgsLineSymbol >( profileLineSymbolElement, context ) );
 
   83  if ( !mProfileLineSymbol )
 
   84    setDefaultProfileLineSymbol( defaultColor );
 
   86  const QDomElement profileFillSymbolElement = elevationElement.firstChildElement( QStringLiteral( 
"profileFillSymbol" ) ).firstChildElement( QStringLiteral( 
"symbol" ) );
 
   87  mProfileFillSymbol.reset( QgsSymbolLayerUtils::loadSymbol< QgsFillSymbol >( profileFillSymbolElement, context ) );
 
   88  if ( !mProfileFillSymbol )
 
   89    setDefaultProfileFillSymbol( defaultColor );
 
   96  std::unique_ptr< QgsRasterLayerElevationProperties > res = std::make_unique< QgsRasterLayerElevationProperties >( 
nullptr );
 
   97  res->setEnabled( mEnabled );
 
   98  res->setProfileLineSymbol( mProfileLineSymbol->clone() );
 
   99  res->setProfileFillSymbol( mProfileFillSymbol->clone() );
 
  100  res->setProfileSymbology( mSymbology );
 
  101  res->setElevationLimit( mElevationLimit );
 
  102  res->setBandNumber( mBandNumber );
 
  103  res->copyCommonProperties( 
this );
 
  104  return res.release();
 
  109  QStringList properties;
 
  110  properties << tr( 
"Elevation band: %1" ).arg( mBandNumber );
 
  111  properties << tr( 
"Scale: %1" ).arg( 
mZScale );
 
  112  properties << tr( 
"Offset: %1" ).arg( 
mZOffset );
 
  113  return QStringLiteral( 
"<li>%1</li>" ).arg( properties.join( QLatin1String( 
"</li><li>" ) ) );
 
  135  if ( enabled == mEnabled )
 
  145  if ( mBandNumber == band )
 
  155  return mProfileLineSymbol.get();
 
  160  mProfileLineSymbol.reset( symbol );
 
  167  return mProfileFillSymbol.get();
 
  172  mProfileFillSymbol.reset( symbol );
 
  179  if ( mSymbology == symbology )
 
  182  mSymbology = symbology;
 
  189  return mElevationLimit;
 
  197  mElevationLimit = limit;
 
  215    switch ( dataProvider->dataType( 1 ) )
 
  241  static const QStringList sPartialCandidates{ QStringLiteral( 
"dem" ),
 
  242      QStringLiteral( 
"height" ),
 
  243      QStringLiteral( 
"elev" ),
 
  244      QStringLiteral( 
"srtm" ) };
 
  245  const QString layerName = layer->
name();
 
  246  for ( 
const QString &candidate : sPartialCandidates )
 
  248    if ( layerName.contains( candidate, Qt::CaseInsensitive ) )
 
  253  static const QStringList sWordCandidates{ QStringLiteral( 
"aster" ) };
 
  254  for ( 
const QString &candidate : sWordCandidates )
 
  256    const thread_local QRegularExpression re( QStringLiteral( 
"\\b%1\\b" ).arg( candidate ) );
 
  257    if ( re.match( layerName, Qt::CaseInsensitive ).hasMatch() )
 
  264void QgsRasterLayerElevationProperties::setDefaultProfileLineSymbol( 
const QColor &color )
 
  266  std::unique_ptr< QgsSimpleLineSymbolLayer > profileLineLayer = std::make_unique< QgsSimpleLineSymbolLayer >( color, 0.6 );
 
  267  mProfileLineSymbol = std::make_unique< QgsLineSymbol>( 
QgsSymbolLayerList( { profileLineLayer.release() } ) );
 
  270void QgsRasterLayerElevationProperties::setDefaultProfileFillSymbol( 
const QColor &color )
 
  272  std::unique_ptr< QgsSimpleFillSymbolLayer > profileFillLayer = std::make_unique< QgsSimpleFillSymbolLayer >( color );
 
  273  profileFillLayer->setStrokeStyle( Qt::NoPen );
 
  274  mProfileFillSymbol = std::make_unique< QgsFillSymbol>( 
QgsSymbolLayerList( { profileFillLayer.release() } ) );
 
@ Float32
Thirty two bit floating point (float)
 
@ CFloat64
Complex Float64.
 
@ Int16
Sixteen bit signed integer (qint16)
 
@ ARGB32_Premultiplied
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
 
@ Int8
Eight bit signed integer (qint8) (added in QGIS 3.30)
 
@ UInt16
Sixteen bit unsigned integer (quint16)
 
@ Byte
Eight bit unsigned integer (quint8)
 
@ UnknownDataType
Unknown or unspecified type.
 
@ ARGB32
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32.
 
@ Int32
Thirty two bit signed integer (qint32)
 
@ Float64
Sixty four bit floating point (double)
 
@ CFloat32
Complex Float32.
 
@ UInt32
Thirty two bit unsigned integer (quint32)
 
ProfileSurfaceSymbology
Surface symbology type for elevation profile plots.
 
@ Line
The elevation surface will be rendered using a line symbol.
 
static QgsColorSchemeRegistry * colorSchemeRegistry()
Returns the application's color scheme registry, used for managing color schemes.
 
QColor fetchRandomStyleColor() const
Returns a random color for use with a new symbol style (e.g.
 
QgsRange which stores a range of double values.
 
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
 
A line symbol type, for rendering LineString and MultiLineString geometries.
 
Base class for storage of map layer elevation properties.
 
void writeCommonProperties(QDomElement &element, QDomDocument &doc, const QgsReadWriteContext &context)
Writes common class properties to a DOM element, to be used later with readXml().
 
void profileGenerationPropertyChanged()
Emitted when any of the elevation properties which relate solely to generation of elevation profiles ...
 
void readCommonProperties(const QDomElement &element, const QgsReadWriteContext &context)
Reads common class properties from a DOM element previously written by writeXml().
 
void changed()
Emitted when any of the elevation properties have changed.
 
void profileRenderingPropertyChanged()
Emitted when any of the elevation properties which relate solely to presentation of elevation results...
 
Base class for all map layer types.
 
Base class for raster data providers.
 
Raster layer specific subclass of QgsMapLayerElevationProperties.
 
void setProfileFillSymbol(QgsFillSymbol *symbol)
Sets the fill symbol used to render the raster profile in elevation profile plots.
 
~QgsRasterLayerElevationProperties() override
 
QgsLineSymbol * profileLineSymbol() const
Returns the line symbol used to render the raster profile in elevation profile plots.
 
bool hasElevation() const override
Returns true if the layer has an elevation or z component.
 
QgsRasterLayerElevationProperties * clone() const override
Creates a clone of the properties.
 
bool isVisibleInZRange(const QgsDoubleRange &range) const override
Returns true if the layer should be visible and rendered for the specified z range.
 
QgsDoubleRange calculateZRange(QgsMapLayer *layer) const override
Attempts to calculate the overall elevation or z range for the specified layer, using the settings de...
 
void setBandNumber(int band)
Sets the band number from which the elevation should be taken.
 
QString htmlSummary() const override
Returns a HTML formatted summary of the properties.
 
void setElevationLimit(double limit)
Sets the elevation limit, which is used when profileSymbology() is Qgis::ProfileSurfaceSymbology::Fil...
 
void setProfileSymbology(Qgis::ProfileSurfaceSymbology symbology)
Sets the symbology option used to render the raster profile in elevation profile plots.
 
static bool layerLooksLikeDem(QgsRasterLayer *layer)
Returns true if a raster layer looks like a DEM.
 
QDomElement writeXml(QDomElement &element, QDomDocument &doc, const QgsReadWriteContext &context) override
Writes the properties to a DOM element, to be used later with readXml().
 
QgsFillSymbol * profileFillSymbol() const
Returns the fill symbol used to render the raster profile in elevation profile plots.
 
double elevationLimit() const
Returns the elevation limit, which is used when profileSymbology() is Qgis::ProfileSurfaceSymbology::...
 
void setProfileLineSymbol(QgsLineSymbol *symbol)
Sets the line symbol used to render the raster profile in elevation profile plots.
 
void setEnabled(bool enabled)
Sets whether the elevation properties are enabled, i.e.
 
QgsRasterLayerElevationProperties(QObject *parent)
Constructor for QgsRasterLayerElevationProperties, with the specified parent object.
 
bool readXml(const QDomElement &element, const QgsReadWriteContext &context) override
Reads the elevation properties from a DOM element previously written by writeXml().
 
bool showByDefaultInElevationProfilePlots() const override
Returns true if the layer should be visible by default in newly created elevation profile plots.
 
Represents a raster layer.
 
QgsRasterAttributeTable * attributeTable(int bandNumber) const
Returns the (possibly NULL) raster attribute table for the given band bandNumber.
 
int bandCount() const
Returns the number of bands in this layer.
 
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
 
The class is used as a container of context for various read/write operations on other objects.
 
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
 
T qgsEnumKeyToValue(const QString &key, const T &defaultValue, bool tryValueAsKey=true, bool *returnOk=nullptr)
Returns the value corresponding to the given key of an enum.
 
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
 
QString qgsEnumValueToKey(const T &value, bool *returnOk=nullptr)
Returns the value for the given key of an enum.
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
QList< QgsSymbolLayer * > QgsSymbolLayerList