28  , mMapUnits( mapUnits )
 
 
   56    QgsDebugError( QStringLiteral( 
"Can't calculate scale from the input values" ) );
 
   60  double conversionFactor = 0;
 
   62  calculateMetrics( mapExtent, delta, conversionFactor );
 
   64  const double scale = ( delta * conversionFactor ) / ( 
static_cast< double >( canvasWidth ) / mDpi );
 
   65  QgsDebugMsgLevel( QStringLiteral( 
"scale = %1 conversionFactor = %2" ).arg( scale ).arg( conversionFactor ), 4 );
 
 
   73    QgsDebugError( QStringLiteral( 
"Can't calculate image size from the input values" ) );
 
   76  double conversionFactor = 0;
 
   79  calculateMetrics( mapExtent, delta, conversionFactor );
 
   80  const double imageWidth = ( delta * conversionFactor ) / ( 
static_cast< double >( scale ) ) * mDpi;
 
   82  const double imageHeight = ( deltaHeight * conversionFactor ) / ( 
static_cast< double >( scale ) ) * mDpi;
 
   84  QgsDebugMsgLevel( QStringLiteral( 
"imageWidth = %1 imageHeight = %2 conversionFactor = %3" )
 
   85                    .arg( imageWidth ).arg( imageHeight ).arg( conversionFactor ), 4 );
 
   87  return QSizeF( imageWidth, imageHeight );
 
 
   90void QgsScaleCalculator::calculateMetrics( 
const QgsRectangle &mapExtent, 
double &delta, 
double &conversionFactor )
 const 
  118      conversionFactor = 39.3700787;
 
  151  static const double RADS = ( 4.0 * std::atan( 1.0 ) ) / 180.0;
 
  152  const double a = std::pow( std::cos( lat * RADS ), 2 );
 
  153  const double c = 2.0 * std::atan2( std::sqrt( a ), std::sqrt( 1.0 - a ) );
 
  154  static const double RA = 6378000; 
 
  157  static const double E = 0.0810820288;
 
  158  const double radius = RA * ( 1.0 - E * E ) /
 
  159                        std::pow( 1.0 - E * E * std::sin( lat * RADS ) * std::sin( lat * RADS ), 1.5 );
 
  160  const double meters = ( mapExtent.
xMaximum() - mapExtent.
xMinimum() ) / 180.0 * radius * 
c;
 
  162  QgsDebugMsgLevel( 
"Distance across map extent (m): " + QString::number( meters ), 4 );
 
 
DistanceUnit
Units of distance.
@ Centimeters
Centimeters.
@ Millimeters
Millimeters.
@ Miles
Terrestrial miles.
@ Unknown
Unknown distance unit.
@ Degrees
Degrees, for planar geographic CRS distance measurements.
@ Inches
Inches (since QGIS 3.32)
@ NauticalMiles
Nautical miles.
A rectangle specified with double values.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
double xMaximum() const
Returns the x maximum value (right side of rectangle).
double yMaximum() const
Returns the y maximum value (top side of rectangle).
double calculate(const QgsRectangle &mapExtent, double canvasWidth) const
Calculate the scale denominator.
void setDpi(double dpi)
Sets the dpi (dots per inch) for the output resolution, to be used in scale calculations.
void setMapUnits(Qgis::DistanceUnit mapUnits)
Set the map units.
double calculateGeographicDistance(const QgsRectangle &mapExtent) const
Calculate the distance between two points in geographic coordinates.
QSizeF calculateImageSize(const QgsRectangle &mapExtent, double scale) const
Calculate the image size in pixel (physical) units.
double dpi() const
Returns the DPI (dots per inch) used in scale calculations.
Qgis::DistanceUnit mapUnits() const
Returns current map units.
QgsScaleCalculator(double dpi=0, Qgis::DistanceUnit mapUnits=Qgis::DistanceUnit::Meters)
Constructor.
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
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)
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)