aboutsummaryrefslogtreecommitdiff
path: root/test/unit/test_crs.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-10-07 09:14:20 +0200
committerGitHub <noreply@github.com>2021-10-07 09:14:20 +0200
commit39ecfbec938a5135026a3f5116928b6c5bb47221 (patch)
tree9adde1d0f8936b3439bb2b42e5c075f9d8df6362 /test/unit/test_crs.cpp
parentf057ac086e36e33fd83656c283d18496355cea78 (diff)
parentf28d36cee9ec099ae5fea3873988204a7ebda520 (diff)
downloadPROJ-39ecfbec938a5135026a3f5116928b6c5bb47221.tar.gz
PROJ-39ecfbec938a5135026a3f5116928b6c5bb47221.zip
Merge pull request #2887 from rouault/fix_2886
Fix CRS Equality with PROJ parameter order
Diffstat (limited to 'test/unit/test_crs.cpp')
-rw-r--r--test/unit/test_crs.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp
index bc42d834..987ffe1b 100644
--- a/test/unit/test_crs.cpp
+++ b/test/unit/test_crs.cpp
@@ -6707,3 +6707,56 @@ TEST(crs, projected_alterParametersLinearUnit_do_not_mess_deriving_conversion) {
}
EXPECT_EQ(projCRS->derivingConversion()->targetCRS().get(), projCRS.get());
}
+
+// ---------------------------------------------------------------------------
+
+TEST(crs, projected_is_equivalent_to_with_proj4_extension) {
+ const auto obj1 = PROJStringParser().createFromPROJString(
+ "+proj=omerc +lat_0=50 +alpha=50.0 +no_rot +a=6378144.0 +b=6356759.0 "
+ "+lon_0=8.0 +type=crs");
+ const auto crs1 = nn_dynamic_pointer_cast<ProjectedCRS>(obj1);
+ ASSERT_TRUE(crs1 != nullptr);
+
+ const auto wkt = crs1->exportToWKT(
+ WKTFormatter::create(WKTFormatter::Convention::WKT2_2019).get());
+ const auto obj_from_wkt = WKTParser().createFromWKT(wkt);
+ const auto crs_from_wkt =
+ nn_dynamic_pointer_cast<ProjectedCRS>(obj_from_wkt);
+
+ // Check equivalence of the CRS from PROJ.4 and WKT
+ EXPECT_TRUE(crs1->isEquivalentTo(crs_from_wkt.get(),
+ IComparable::Criterion::EQUIVALENT));
+
+ ASSERT_TRUE(crs_from_wkt != nullptr);
+ // Same as above but with different option order
+ const auto obj2 = PROJStringParser().createFromPROJString(
+ "+proj=omerc +lat_0=50 +no_rot +alpha=50.0 +a=6378144.0 +b=6356759.0 "
+ "+lon_0=8.0 +type=crs");
+ const auto crs2 = nn_dynamic_pointer_cast<ProjectedCRS>(obj2);
+ ASSERT_TRUE(crs2 != nullptr);
+
+ // Check equivalence of the 2 PROJ.4 based CRS
+ EXPECT_TRUE(
+ crs1->isEquivalentTo(crs2.get(), IComparable::Criterion::EQUIVALENT));
+
+ // Without +no_rot --> no PROJ.4 extension
+ const auto objNoRot = PROJStringParser().createFromPROJString(
+ "+proj=omerc +lat_0=50 +alpha=50.0 +a=6378144.0 +b=6356759.0 "
+ "+lon_0=8.0 +type=crs");
+ const auto crsNoRot = nn_dynamic_pointer_cast<ProjectedCRS>(objNoRot);
+ ASSERT_TRUE(crsNoRot != nullptr);
+ EXPECT_FALSE(crs1->isEquivalentTo(crsNoRot.get(),
+ IComparable::Criterion::EQUIVALENT));
+ EXPECT_FALSE(crsNoRot->isEquivalentTo(crs1.get(),
+ IComparable::Criterion::EQUIVALENT));
+
+ // Change alpha value
+ const auto objDifferent = PROJStringParser().createFromPROJString(
+ "+proj=omerc +lat_0=50 +alpha=49.0 +no_rot +a=6378144.0 +b=6356759.0 "
+ "+lon_0=8.0 +type=crs");
+ const auto crsDifferent =
+ nn_dynamic_pointer_cast<ProjectedCRS>(objDifferent);
+ ASSERT_TRUE(crsDifferent != nullptr);
+ EXPECT_FALSE(crs1->isEquivalentTo(crsDifferent.get(),
+ IComparable::Criterion::EQUIVALENT));
+}