void QgsExpression::initGeomCalculator( const QgsExpressionContext *context ) { // Set the geometry calculator from the context if it has not been set by setGeomCalculator() if ( context && ! d->mCalc ) { QString ellipsoid = context->variable( QStringLiteral( "project_ellipsoid" ) ).toString(); QgsCoordinateReferenceSystem crs = context->variable( QStringLiteral( "_layer_crs" ) ).value<QgsCoordinateReferenceSystem>(); QgsCoordinateTransformContext tContext = context->variable( QStringLiteral( "_project_transform_context" ) ).value<QgsCoordinateTransformContext>(); if ( crs.isValid() ) { d->mCalc = std::shared_ptr<QgsDistanceArea>( new QgsDistanceArea() ); d->mCalc->setEllipsoid( ellipsoid.isEmpty() ? GEO_NONE : ellipsoid ); d->mCalc->setSourceCrs( crs, tContext ); } } // Set the distance units from the context if it has not been set by setDistanceUnits() if ( context && distanceUnits() == QgsUnitTypes::DistanceUnknownUnit ) { QString distanceUnitsStr = context->variable( QStringLiteral( "project_distance_units" ) ).toString(); if ( ! distanceUnitsStr.isEmpty() ) setDistanceUnits( QgsUnitTypes::stringToDistanceUnit( distanceUnitsStr ) ); } // Set the area units from the context if it has not been set by setAreaUnits() if ( context && areaUnits() == QgsUnitTypes::AreaUnknownUnit ) { QString areaUnitsStr = context->variable( QStringLiteral( "project_area_units" ) ).toString(); if ( ! areaUnitsStr.isEmpty() ) setAreaUnits( QgsUnitTypes::stringToAreaUnit( areaUnitsStr ) ); } }
double QgsDistanceArea::convertAreaMeasurement( double area, QgsUnitTypes::AreaUnit toUnits ) const { // get the conversion factor between the specified units QgsUnitTypes::AreaUnit measureUnits = areaUnits(); double factorUnits = QgsUnitTypes::fromUnitToUnitFactor( measureUnits, toUnits ); double result = area * factorUnits; QgsDebugMsg( QString( "Converted area of %1 %2 to %3 %4" ).arg( area ) .arg( QgsUnitTypes::toString( measureUnits ) ) .arg( result ) .arg( QgsUnitTypes::toString( toUnits ) ) ); return result; }