aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-06-03 14:09:01 +0200
committerEven Rouault <even.rouault@spatialys.com>2020-06-03 14:09:04 +0200
commit590449950057566d39e2997404422b00844343b6 (patch)
tree6e13b70d0db35ce5d9e398a39589ad0c64b26b9b
parentdf1b0828252bc1eac1126b6273f322365ecceb7a (diff)
downloadPROJ-590449950057566d39e2997404422b00844343b6.tar.gz
PROJ-590449950057566d39e2997404422b00844343b6.zip
normalizeForVisualization(): make it switch axis for EPSG:5482 (RSRGD2000 / RSPS2000)
Fixes #2254
-rw-r--r--src/iso19111/crs.cpp22
-rw-r--r--test/unit/test_crs.cpp32
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,