Skip to content

Commit 24c990f

Browse files
committed
[needs-docs] Don't restrict project ellipsoid choice when
canvas OTF reprojection is disabled These two settings aren't necessarily related - you may want to disable OTF canvas reprojection while still wanting accurate distance/area measurements using an ellipsoid. This change should make distance/area calculation in QGIS more reliable and predictable for users. Calculations are now based entirely on the ellipsoid choice in project properties, so it only takes checking a single setting to verify how measurements are calculated.
1 parent 7d2cd37 commit 24c990f

16 files changed

Lines changed: 53 additions & 92 deletions

‎src/app/qgisapp.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7513,7 +7513,7 @@ void QgisApp::selectByForm()
75137513
QgsDistanceArea myDa;
75147514

75157515
myDa.setSourceCrs( vlayer->crs().srsid() );
7516-
myDa.setEllipsoidalMode( mMapCanvas->mapSettings().hasCrsTransformEnabled() );
7516+
myDa.setEllipsoidalMode( true );
75177517
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
75187518

75197519
QgsAttributeEditorContext context;

‎src/app/qgisappinterface.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ QgsAttributeDialog* QgisAppInterface::getFeatureForm( QgsVectorLayer *l, QgsFeat
699699
QgsDistanceArea myDa;
700700

701701
myDa.setSourceCrs( l->crs().srsid() );
702-
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
702+
myDa.setEllipsoidalMode( true );
703703
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
704704

705705
QgsAttributeEditorContext context;

‎src/app/qgsattributeactionpropertiesdialog.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ void QgsAttributeActionPropertiesDialog::init( const QSet<QString>& actionScopes
200200

201201
QgsDistanceArea myDa;
202202
myDa.setSourceCrs( mLayer->crs().srsid() );
203-
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
203+
myDa.setEllipsoidalMode( true );
204204
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
205205

206206
mFieldExpression->setLayer( mLayer );

‎src/app/qgsattributetabledialog.cpp‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid
126126
myDa = new QgsDistanceArea();
127127

128128
myDa->setSourceCrs( mLayer->crs() );
129-
myDa->setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
129+
myDa->setEllipsoidalMode( true );
130130
myDa->setEllipsoid( QgsProject::instance()->ellipsoid() );
131131

132132
mEditorContext.setDistanceArea( *myDa );
@@ -587,7 +587,7 @@ void QgsAttributeTableDialog::filterExpressionBuilder()
587587

588588
QgsDistanceArea myDa;
589589
myDa.setSourceCrs( mLayer->crs().srsid() );
590-
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
590+
myDa.setEllipsoidalMode( true );
591591
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
592592
dlg.setGeomCalculator( myDa );
593593

@@ -948,7 +948,7 @@ void QgsAttributeTableDialog::setFilterExpression( const QString& filterString,
948948
QgsDistanceArea myDa;
949949

950950
myDa.setSourceCrs( mLayer->crs().srsid() );
951-
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
951+
myDa.setEllipsoidalMode( true );
952952
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
953953

954954
// parse search string and build parsed tree

‎src/app/qgsdiagramproperties.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare
177177
mSizeFieldExpressionWidget->setLayer( mLayer );
178178
QgsDistanceArea myDa;
179179
myDa.setSourceCrs( mLayer->crs().srsid() );
180-
myDa.setEllipsoidalMode( mMapCanvas->mapSettings().hasCrsTransformEnabled() );
180+
myDa.setEllipsoidalMode( true );
181181
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
182182
mSizeFieldExpressionWidget->setGeomCalculator( myDa );
183183

@@ -869,7 +869,7 @@ QString QgsDiagramProperties::showExpressionBuilder( const QString& initialExpre
869869

870870
QgsDistanceArea myDa;
871871
myDa.setSourceCrs( mLayer->crs().srsid() );
872-
myDa.setEllipsoidalMode( mMapCanvas->mapSettings().hasCrsTransformEnabled() );
872+
myDa.setEllipsoidalMode( true );
873873
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
874874
dlg.setGeomCalculator( myDa );
875875

‎src/app/qgsfeatureaction.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ QgsAttributeDialog *QgsFeatureAction::newDialog( bool cloneFeature )
5757
QgsDistanceArea myDa;
5858

5959
myDa.setSourceCrs( mLayer->crs() );
60-
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
60+
myDa.setEllipsoidalMode( true );
6161
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
6262

6363
context.setDistanceArea( myDa );

‎src/app/qgsfieldcalculator.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl, QWidget* parent )
5656

5757
QgsDistanceArea myDa;
5858
myDa.setSourceCrs( vl->crs().srsid() );
59-
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
59+
myDa.setEllipsoidalMode( true );
6060
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
6161
builder->setGeomCalculator( myDa );
6262

@@ -156,7 +156,7 @@ void QgsFieldCalculator::accept()
156156
QgsDistanceArea myDa;
157157

158158
myDa.setSourceCrs( mVectorLayer->crs().srsid() );
159-
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
159+
myDa.setEllipsoidalMode( true );
160160
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
161161

162162
QString calcString = builder->expressionText();

‎src/app/qgslabelinggui.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void QgsLabelingGui::setLayer( QgsMapLayer* mapLayer )
9494
mFieldExpressionWidget->setLayer( mLayer );
9595
QgsDistanceArea da;
9696
da.setSourceCrs( mLayer->crs().srsid() );
97-
da.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
97+
da.setEllipsoidalMode( true );
9898
da.setEllipsoid( QgsProject::instance()->ellipsoid() );
9999
mFieldExpressionWidget->setGeomCalculator( da );
100100

‎src/app/qgsmaptoolmeasureangle.cpp‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,5 @@ void QgsMapToolMeasureAngle::configureDistanceArea()
184184
QString ellipsoidId = QgsProject::instance()->ellipsoid();
185185
mDa.setSourceCrs( mCanvas->mapSettings().destinationCrs().srsid() );
186186
mDa.setEllipsoid( ellipsoidId );
187-
// Only use ellipsoidal calculation when project wide transformation is enabled.
188-
mDa.setEllipsoidalMode( mCanvas->mapSettings().hasCrsTransformEnabled() );
187+
mDa.setEllipsoidalMode( true );
189188
}

‎src/app/qgsmeasuredialog.cpp‎

Lines changed: 21 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,7 @@ void QgsMeasureDialog::updateSettings()
8080
mAreaUnits = QgsProject::instance()->areaUnits();
8181
mDa.setSourceCrs( mTool->canvas()->mapSettings().destinationCrs().srsid() );
8282
mDa.setEllipsoid( QgsProject::instance()->ellipsoid() );
83-
// Only use ellipsoidal calculation when project wide transformation is enabled.
84-
if ( mTool->canvas()->mapSettings().hasCrsTransformEnabled() )
85-
{
86-
mDa.setEllipsoidalMode( true );
87-
}
88-
else
89-
{
90-
mDa.setEllipsoidalMode( false );
91-
}
83+
mDa.setEllipsoidalMode( true );
9284

9385
QgsDebugMsg( "****************" );
9486
QgsDebugMsg( QString( "Ellipsoid ID : %1" ).arg( mDa.ellipsoid() ) );
@@ -301,33 +293,21 @@ void QgsMeasureDialog::updateUi()
301293
else
302294
{
303295
QgsUnitTypes::AreaUnit resultUnit = QgsUnitTypes::AreaUnknownUnit;
304-
if ( ! mTool->canvas()->hasCrsTransformEnabled() )
296+
if ( mDa.willUseEllipsoid() )
305297
{
306-
resultUnit = QgsUnitTypes::distanceToAreaUnit( mTool->canvas()->mapSettings().destinationCrs().mapUnits() );
307-
toolTip += "<br> * " + tr( "Project CRS transformation is turned off." ) + ' ';
308-
toolTip += tr( "Area is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ),
309-
mTool->canvas()->mapSettings().destinationCrs().description() );
310-
toolTip += "<br> * " + tr( "Ellipsoidal calculation is not possible with CRS transformation disabled." );
311-
setWindowTitle( tr( "Measure (OTF off)" ) );
298+
resultUnit = QgsUnitTypes::AreaSquareMeters;
299+
toolTip += "<br> * " + tr( "Project ellipsoidal calculation is selected." ) + ' ';
300+
toolTip += "<br> * " + tr( "The coordinates are transformed to the chosen ellipsoid (%1), and the area is calculated in %2." ).arg( mDa.ellipsoid(),
301+
QgsUnitTypes::toString( resultUnit ) );
312302
}
313303
else
314304
{
315-
if ( mDa.willUseEllipsoid() )
316-
{
317-
resultUnit = QgsUnitTypes::AreaSquareMeters;
318-
toolTip += "<br> * " + tr( "Project CRS transformation is turned on and ellipsoidal calculation is selected." ) + ' ';
319-
toolTip += "<br> * " + tr( "The coordinates are transformed to the chosen ellipsoid (%1), and the area is calculated in %2." ).arg( mDa.ellipsoid(),
320-
QgsUnitTypes::toString( resultUnit ) );
321-
}
322-
else
323-
{
324-
resultUnit = QgsUnitTypes::distanceToAreaUnit( mTool->canvas()->mapSettings().destinationCrs().mapUnits() );
325-
toolTip += "<br> * " + tr( "Project CRS transformation is turned on but ellipsoidal calculation is not selected." ) + ' ';
326-
toolTip += tr( "Area is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ),
327-
mTool->canvas()->mapSettings().destinationCrs().description() );
328-
}
329-
setWindowTitle( tr( "Measure (OTF on)" ) );
305+
resultUnit = QgsUnitTypes::distanceToAreaUnit( mTool->canvas()->mapSettings().destinationCrs().mapUnits() );
306+
toolTip += "<br> * " + tr( "Project ellipsoidal calculation is not selected." ) + ' ';
307+
toolTip += tr( "Area is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ),
308+
mTool->canvas()->mapSettings().destinationCrs().description() );
330309
}
310+
setWindowTitle( tr( "Measure (OTF on)" ) );
331311

332312
if ( QgsUnitTypes::unitType( resultUnit ) == QgsUnitTypes::Geographic &&
333313
QgsUnitTypes::unitType( mAreaUnits ) == QgsUnitTypes::Standard )
@@ -375,33 +355,21 @@ void QgsMeasureDialog::updateUi()
375355
else
376356
{
377357
QgsUnitTypes::DistanceUnit resultUnit = QgsUnitTypes::DistanceUnknownUnit;
378-
if ( ! mTool->canvas()->hasCrsTransformEnabled() )
358+
if ( mDa.willUseEllipsoid() )
379359
{
380-
resultUnit = mTool->canvas()->mapSettings().destinationCrs().mapUnits();
381-
toolTip += "<br> * " + tr( "Project CRS transformation is turned off." ) + ' ';
382-
toolTip += tr( "Distance is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ),
383-
mTool->canvas()->mapSettings().destinationCrs().description() );
384-
toolTip += "<br> * " + tr( "Ellipsoidal calculation is not possible with CRS transformation disabled." );
385-
setWindowTitle( tr( "Measure (OTF off)" ) );
360+
resultUnit = QgsUnitTypes::DistanceMeters;
361+
toolTip += "<br> * " + tr( "Project ellipsoidal calculation is selected." ) + ' ';
362+
toolTip += "<br> * " + tr( "The coordinates are transformed to the chosen ellipsoid (%1), and the distance is calculated in %2." ).arg( mDa.ellipsoid(),
363+
QgsUnitTypes::toString( resultUnit ) );
386364
}
387365
else
388366
{
389-
if ( mDa.willUseEllipsoid() )
390-
{
391-
resultUnit = QgsUnitTypes::DistanceMeters;
392-
toolTip += "<br> * " + tr( "Project CRS transformation is turned on and ellipsoidal calculation is selected." ) + ' ';
393-
toolTip += "<br> * " + tr( "The coordinates are transformed to the chosen ellipsoid (%1), and the distance is calculated in %2." ).arg( mDa.ellipsoid(),
394-
QgsUnitTypes::toString( resultUnit ) );
395-
}
396-
else
397-
{
398-
resultUnit = mTool->canvas()->mapSettings().destinationCrs().mapUnits();
399-
toolTip += "<br> * " + tr( "Project CRS transformation is turned on but ellipsoidal calculation is not selected." ) + ' ';
400-
toolTip += tr( "Distance is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ),
401-
mTool->canvas()->mapSettings().destinationCrs().description() );
402-
}
403-
setWindowTitle( tr( "Measure (OTF on)" ) );
367+
resultUnit = mTool->canvas()->mapSettings().destinationCrs().mapUnits();
368+
toolTip += "<br> * " + tr( "Project ellipsoidal calculation is not selected." ) + ' ';
369+
toolTip += tr( "Distance is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ),
370+
mTool->canvas()->mapSettings().destinationCrs().description() );
404371
}
372+
setWindowTitle( tr( "Measure (OTF on)" ) );
405373

406374
if ( QgsUnitTypes::unitType( resultUnit ) == QgsUnitTypes::Geographic &&
407375
QgsUnitTypes::unitType( mDistanceUnits ) == QgsUnitTypes::Standard )

0 commit comments

Comments
 (0)