Don't permit user set vertical crs for project when crs is geographic 3d

or geocentric

Following https://docs.ogc.org/as/18-005r5/18-005r5.html#34 it is not
a valid combination to create a compound crs from these types
This commit is contained in:
Nyall Dawson 2024-04-16 11:24:59 +10:00
parent 87907a5448
commit 7107f85f13
3 changed files with 42 additions and 8 deletions

View File

@ -178,11 +178,23 @@ void QgsProjectElevationSettingsWidget::updateVerticalCrsOptions()
) );
break;
case Qgis::CrsType::Geographic3d:
mVerticalCrsStackedWidget->setCurrentWidget( mCrsPageDisabled );
mCrsDisabledLabel->setText( tr( "Project coordinate reference system is set to a geographic 3D CRS (%1), so the vertical CRS cannot be manually specified." ).arg(
QgsProject::instance()->crs().userFriendlyIdentifier()
) );
break;
case Qgis::CrsType::Geocentric:
mVerticalCrsStackedWidget->setCurrentWidget( mCrsPageDisabled );
mCrsDisabledLabel->setText( tr( "Project coordinate reference system is set to a geocentric CRS (%1), so the vertical CRS cannot be manually specified." ).arg(
QgsProject::instance()->crs().userFriendlyIdentifier()
) );
break;
case Qgis::CrsType::Unknown:
case Qgis::CrsType::Geodetic:
case Qgis::CrsType::Geocentric:
case Qgis::CrsType::Geographic2d:
case Qgis::CrsType::Geographic3d:
case Qgis::CrsType::Vertical:
case Qgis::CrsType::Projected:
case Qgis::CrsType::Temporal:

View File

@ -1079,11 +1079,27 @@ bool QgsProject::setVerticalCrs( const QgsCoordinateReferenceSystem &crs, QStrin
}
break;
case Qgis::CrsType::Geographic3d:
if ( crs != oldVerticalCrs )
{
if ( errorMessage )
*errorMessage = QObject::tr( "Project CRS is a Geographic 3D CRS, specified Vertical CRS will be ignored" );
return false;
}
break;
case Qgis::CrsType::Geocentric:
if ( crs != oldVerticalCrs )
{
if ( errorMessage )
*errorMessage = QObject::tr( "Project CRS is a Geocentric CRS, specified Vertical CRS will be ignored" );
return false;
}
break;
case Qgis::CrsType::Unknown:
case Qgis::CrsType::Geodetic:
case Qgis::CrsType::Geocentric:
case Qgis::CrsType::Geographic2d:
case Qgis::CrsType::Geographic3d:
case Qgis::CrsType::Projected:
case Qgis::CrsType::Temporal:
case Qgis::CrsType::Engineering:
@ -1597,6 +1613,8 @@ bool QgsProject::rebuildCrs3D( QString *error )
switch ( mCrs.type() )
{
case Qgis::CrsType::Compound:
case Qgis::CrsType::Geographic3d:
case Qgis::CrsType::Geocentric:
mCrs3D = mCrs;
break;
@ -1608,9 +1626,7 @@ bool QgsProject::rebuildCrs3D( QString *error )
case Qgis::CrsType::Unknown:
case Qgis::CrsType::Geodetic:
case Qgis::CrsType::Geocentric:
case Qgis::CrsType::Geographic2d:
case Qgis::CrsType::Geographic3d:
case Qgis::CrsType::Projected:
case Qgis::CrsType::Temporal:
case Qgis::CrsType::Engineering:

View File

@ -256,13 +256,19 @@ class TestQgsProject(QgisTestCase):
self.assertEqual(project.verticalCrs().authid(), 'EPSG:5703')
self.assertEqual(len(spy), 1)
# invalid combination
# invalid combinations
project.setCrs(QgsCoordinateReferenceSystem('EPSG:4979'))
ok, err = project.setVerticalCrs(QgsCoordinateReferenceSystem('EPSG:5711'))
self.assertFalse(ok)
self.assertEqual(err, 'components of the compound CRS do not belong to one of the allowed combinations of http://docs.opengeospatial.org/as/18-005r5/18-005r5.html#34')
self.assertEqual(err, 'Project CRS is a Geographic 3D CRS, specified Vertical CRS will be ignored')
self.assertEqual(project.crs3D().authid(), 'EPSG:4979')
project.setCrs(QgsCoordinateReferenceSystem('EPSG:4978'))
ok, err = project.setVerticalCrs(QgsCoordinateReferenceSystem('EPSG:5711'))
self.assertFalse(ok)
self.assertEqual(err, 'Project CRS is a Geocentric CRS, specified Vertical CRS will be ignored')
self.assertEqual(project.crs3D().authid(), 'EPSG:4978')
def test_crs_3d(self):
project = QgsProject()
self.assertFalse(project.crs3D().isValid())