QGIS API Documentation  3.23.0-Master (dd0cd13a00)
qgselevationutils.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgselevationutils.cpp
3  ------------------
4  Date : November 2020
5  Copyright : (C) 2020 by Nyall Dawson
6  Email : nyall dot dawson at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgselevationutils.h"
17 #include "qgsproject.h"
19 
20 
22 {
23  const QMap<QString, QgsMapLayer *> &mapLayers = project->mapLayers();
24  QgsMapLayer *currentLayer = nullptr;
25 
26  double min = std::numeric_limits<double>::quiet_NaN();
27  double max = std::numeric_limits<double>::quiet_NaN();
28 
29  for ( QMap<QString, QgsMapLayer *>::const_iterator it = mapLayers.constBegin(); it != mapLayers.constEnd(); ++it )
30  {
31  currentLayer = it.value();
32 
33  if ( !currentLayer->elevationProperties() || !currentLayer->elevationProperties()->hasElevation() )
34  continue;
35 
36  const QgsDoubleRange layerRange = currentLayer->elevationProperties()->calculateZRange( currentLayer );
37  if ( layerRange.isInfinite() )
38  continue;
39 
40  if ( layerRange.lower() > std::numeric_limits< double >::lowest() )
41  {
42  if ( std::isnan( min ) || layerRange.lower() < min )
43  min = layerRange.lower();
44  }
45 
46  if ( layerRange.upper() < std::numeric_limits< double >::max() )
47  {
48  if ( std::isnan( max ) || layerRange.upper() > max )
49  max = layerRange.upper();
50  }
51  }
52 
53  return QgsDoubleRange( std::isnan( min ) ? std::numeric_limits< double >::lowest() : min,
54  std::isnan( max ) ? std::numeric_limits< double >::max() : max );
55 }
56 
QgsRange which stores a range of double values.
Definition: qgsrange.h:203
bool isInfinite() const
Returns true if the range consists of all possible values.
Definition: qgsrange.h:247
static QgsDoubleRange calculateZRangeForProject(QgsProject *project)
Calculates the elevation range for a project.
virtual QgsDoubleRange calculateZRange(QgsMapLayer *layer) const
Attempts to calculate the overall elevation or z range for the specified layer, using the settings de...
virtual bool hasElevation() const
Returns true if the layer has an elevation or z component.
Base class for all map layer types.
Definition: qgsmaplayer.h:73
virtual QgsMapLayerElevationProperties * elevationProperties()
Returns the layer's elevation properties.
Definition: qgsmaplayer.h:1496
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition: qgsproject.h:101
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
T lower() const
Returns the lower bound of the range.
Definition: qgsrange.h:66
T upper() const
Returns the upper bound of the range.
Definition: qgsrange.h:73