diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2020-06-03 14:09:01 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2020-06-03 14:09:04 +0200 |
| commit | 590449950057566d39e2997404422b00844343b6 (patch) | |
| tree | 6e13b70d0db35ce5d9e398a39589ad0c64b26b9b | |
| parent | df1b0828252bc1eac1126b6273f322365ecceb7a (diff) | |
| download | PROJ-590449950057566d39e2997404422b00844343b6.tar.gz PROJ-590449950057566d39e2997404422b00844343b6.zip | |
normalizeForVisualization(): make it switch axis for EPSG:5482 (RSRGD2000 / RSPS2000)
Fixes #2254
| -rw-r--r-- | src/iso19111/crs.cpp | 22 | ||||
| -rw-r--r-- | test/unit/test_crs.cpp | 32 |
2 files changed, 47 insertions, 7 deletions
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp index b0ec35b9..88420c8a 100644 --- a/src/iso19111/crs.cpp +++ b/src/iso19111/crs.cpp @@ -662,18 +662,26 @@ static bool mustAxisOrderBeSwitchedForVisualizationInternal( 90.0) < 1e-10; } - // Address EPSG:32761 "WGS 84 / UPS South (N,E)" if (&dir0 == &cs::AxisDirection::NORTH && &dir1 == &cs::AxisDirection::NORTH) { const auto &meridian0 = axisList[0]->meridian(); const auto &meridian1 = axisList[1]->meridian(); return meridian0 != nullptr && meridian1 != nullptr && - std::abs(meridian0->longitude().convertToUnit( - common::UnitOfMeasure::DEGREE) - - 0.0) < 1e-10 && - std::abs(meridian1->longitude().convertToUnit( - common::UnitOfMeasure::DEGREE) - - 90.0) < 1e-10; + (( + // Address EPSG:32761 "WGS 84 / UPS South (N,E)" + std::abs(meridian0->longitude().convertToUnit( + common::UnitOfMeasure::DEGREE) - + 0.0) < 1e-10 && + std::abs(meridian1->longitude().convertToUnit( + common::UnitOfMeasure::DEGREE) - + 90.0) < 1e-10) || + // Address EPSG:5482 "RSRGD2000 / RSPS2000" + (std::abs(meridian0->longitude().convertToUnit( + common::UnitOfMeasure::DEGREE) - + 180) < 1e-10 && + std::abs(meridian1->longitude().convertToUnit( + common::UnitOfMeasure::DEGREE) - + -90.0) < 1e-10)); } return false; diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp index 8fdd8a01..c3530a53 100644 --- a/test/unit/test_crs.cpp +++ b/test/unit/test_crs.cpp @@ -1057,6 +1057,38 @@ TEST(crs, EPSG_5042_projected_south_pole_east_north) { // --------------------------------------------------------------------------- +TEST(crs, EPSG_5482_projected_south_pole_south_west) { + auto dbContext = DatabaseContext::create(); + auto factory = AuthorityFactory::create(dbContext, "EPSG"); + auto crs = factory->createCoordinateReferenceSystem("5482"); + auto proj_crs = nn_dynamic_pointer_cast<ProjectedCRS>(crs); + ASSERT_TRUE(proj_crs != nullptr); + auto op = CoordinateOperationFactory::create()->createOperation( + factory->createCoordinateReferenceSystem("4764"), + NN_NO_CHECK(proj_crs)); + ASSERT_TRUE(op != nullptr); + auto proj_string = "+proj=pipeline " + "+step +proj=axisswap +order=2,1 " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +proj=stere +lat_0=-90 +lon_0=180 +k=0.994 " + "+x_0=5000000 +y_0=1000000 +ellps=GRS80 " + "+step +proj=axisswap +order=2,1"; + EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), + proj_string); + + auto opNormalized = op->normalizeForVisualization(); + auto proj_string_normalized = + "+proj=pipeline " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +proj=stere +lat_0=-90 +lon_0=180 +k=0.994 " + "+x_0=5000000 +y_0=1000000 +ellps=GRS80"; + EXPECT_EQ( + opNormalized->exportToPROJString(PROJStringFormatter::create().get()), + proj_string_normalized); +} + +// --------------------------------------------------------------------------- + TEST(crs, geodetic_crs_both_datum_datum_ensemble_null) { EXPECT_THROW(GeodeticCRS::create( PropertyMap(), nullptr, nullptr, |
