Skip to content

Commit

Permalink
Fix compound CRSs axis order and orientation info
Browse files Browse the repository at this point in the history
  • Loading branch information
Djedouas authored and nyalldawson committed Jul 31, 2024
1 parent b117fb9 commit ea64be6
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 1 deletion.
3 changes: 3 additions & 0 deletions src/core/proj/qgscoordinatereferencesystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,9 @@ bool QgsCoordinateReferenceSystem::hasAxisInverted() const

QList<Qgis::CrsAxisDirection> QgsCoordinateReferenceSystem::axisOrdering() const
{
if ( type() == Qgis::CrsType::Compound )
return horizontalCrs().axisOrdering() + verticalCrs().axisOrdering();

const PJ *projObject = d->threadLocalProjObject();
if ( !projObject )
return {};
Expand Down
7 changes: 6 additions & 1 deletion src/core/proj/qgsprojutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,12 @@ bool QgsProjUtils::axisOrderIsSwapped( const PJ *crs )
return false;

PJ_CONTEXT *context = QgsProjContext::get();
QgsProjUtils::proj_pj_unique_ptr pjCs( proj_crs_get_coordinate_system( context, crs ) );

QgsProjUtils::proj_pj_unique_ptr horizCrs = crsToHorizontalCrs( crs );
if ( !horizCrs )
return false;

QgsProjUtils::proj_pj_unique_ptr pjCs( proj_crs_get_coordinate_system( context, horizCrs.get() ) );
if ( !pjCs )
return false;

Expand Down
18 changes: 18 additions & 0 deletions tests/src/core/testqgscoordinatereferencesystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,24 @@ void TestQgsCoordinateReferenceSystem::compoundCrs()
QCOMPARE( crs.type(), Qgis::CrsType::Compound );
QVERIFY( !crs.isGeographic() );
QCOMPARE( crs.mapUnits(), Qgis::DistanceUnit::Meters );
QVERIFY( !crs.hasAxisInverted() );
QCOMPARE( crs.axisOrdering(),
QList<Qgis::CrsAxisDirection>()
<< Qgis::CrsAxisDirection::East
<< Qgis::CrsAxisDirection::North
<< Qgis::CrsAxisDirection::Up );

crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3903" ) );
QVERIFY( crs.isValid() );
QCOMPARE( crs.type(), Qgis::CrsType::Compound );
QVERIFY( !crs.isGeographic() );
QCOMPARE( crs.mapUnits(), Qgis::DistanceUnit::Meters );
QVERIFY( crs.hasAxisInverted() );
QCOMPARE( crs.axisOrdering(),
QList<Qgis::CrsAxisDirection>()
<< Qgis::CrsAxisDirection::North
<< Qgis::CrsAxisDirection::East
<< Qgis::CrsAxisDirection::Up );
}

void TestQgsCoordinateReferenceSystem::verticalCrs()
Expand Down
2 changes: 2 additions & 0 deletions tests/src/core/testqgsprojutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ void TestQgsProjUtils::axisOrderIsSwapped()
QVERIFY( !QgsProjUtils::axisOrderIsSwapped( crs.get() ) );
crs.reset( proj_create( context, "urn:ogc:def:crs:EPSG::4326" ) );
QVERIFY( QgsProjUtils::axisOrderIsSwapped( crs.get() ) );
crs.reset( proj_create( context, "urn:ogc:def:crs:EPSG::3903" ) );
QVERIFY( QgsProjUtils::axisOrderIsSwapped( crs.get() ) );
}

void TestQgsProjUtils::searchPath()
Expand Down

0 comments on commit ea64be6

Please sign in to comment.