aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-08-20 16:58:14 +0200
committerEven Rouault <even.rouault@spatialys.com>2021-08-20 17:25:15 +0200
commitfa3163365869b15e14715378a826338e942bbfe4 (patch)
tree53c200362db2f11f599b958b235b074805d19675 /test
parent4766b7c3a17dc98f99c59d2b64076fd924df5804 (diff)
downloadPROJ-fa3163365869b15e14715378a826338e942bbfe4.tar.gz
PROJ-fa3163365869b15e14715378a826338e942bbfe4.zip
ConcatenatedOperation::fixStepsDirection(): fix bad chaining of steps when inverse map projection is involved in non-final step (fixes #2817)
Diffstat (limited to 'test')
-rw-r--r--test/unit/test_factory.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp
index a60296d1..e99072a8 100644
--- a/test/unit/test_factory.cpp
+++ b/test/unit/test_factory.cpp
@@ -3117,6 +3117,115 @@ TEST_F(FactoryWithTmpDatabase,
// ---------------------------------------------------------------------------
+TEST_F(FactoryWithTmpDatabase,
+ check_fixup_direction_concatenated_inverse_map_projection) {
+
+ // This tests https://github.com/OSGeo/PROJ/issues/2817
+
+ createStructure();
+ populateWithFakeEPSG();
+
+ ASSERT_TRUE(execute(
+ "INSERT INTO other_transformation "
+ "VALUES('EPSG','NOOP_TRANSFORMATION_32631','name',NULL,"
+ "'PROJ','PROJString','+proj=noop',"
+ "'EPSG','32631','EPSG','32631',0.0,"
+ "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"
+ "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"
+ "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"
+ "NULL,NULL,NULL,NULL,NULL,NULL,0);"))
+ << last_error();
+
+ ASSERT_TRUE(
+ execute("INSERT INTO usage VALUES('EPSG',"
+ "'other_transformation_NOOP_TRANSFORMATION_32631_usage',"
+ "'other_transformation',"
+ "'EPSG','NOOP_TRANSFORMATION_32631',"
+ "'EPSG','1262','EPSG','1024');"))
+ << last_error();
+
+ ASSERT_TRUE(execute(
+ "INSERT INTO other_transformation "
+ "VALUES('EPSG','NOOP_TRANSFORMATION_4326','name',NULL,"
+ "'PROJ','PROJString','+proj=noop',"
+ "'EPSG','4326','EPSG','4326',0.0,"
+ "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"
+ "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"
+ "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"
+ "NULL,NULL,NULL,NULL,NULL,NULL,0);"))
+ << last_error();
+
+ ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG',"
+ "'other_transformation_NOOP_TRANSFORMATION_4326_usage',"
+ "'other_transformation',"
+ "'EPSG','NOOP_TRANSFORMATION_4326',"
+ "'EPSG','1262','EPSG','1024');"))
+ << last_error();
+
+ ASSERT_TRUE(execute("INSERT INTO concatenated_operation "
+ "VALUES('EPSG','TEST_CONCATENATED','name',NULL,"
+ "'EPSG','4326','EPSG'"
+ ",'4326',NULL,NULL,0);"))
+ << last_error();
+ ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG',"
+ "'concatenated_operation_TEST_CONCATENATED_usage',"
+ "'concatenated_operation',"
+ "'EPSG','TEST_CONCATENATED',"
+ "'EPSG','1262','EPSG','1024');"))
+ << last_error();
+
+ // Forward map projection
+ ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step "
+ "VALUES('EPSG','TEST_CONCATENATED',1,"
+ "'EPSG','16031');"))
+ << last_error();
+
+ // Noop projected
+ ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step "
+ "VALUES('EPSG','TEST_CONCATENATED',2,"
+ "'EPSG','NOOP_TRANSFORMATION_32631');"))
+ << last_error();
+
+ // Inverse map projection
+ ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step "
+ "VALUES('EPSG','TEST_CONCATENATED',3,"
+ "'EPSG','16031');"))
+ << last_error();
+
+ // Noop geographic
+ ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step "
+ "VALUES('EPSG','TEST_CONCATENATED',4,"
+ "'EPSG','NOOP_TRANSFORMATION_4326');"))
+ << last_error();
+
+ // Forward map projection
+ ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step "
+ "VALUES('EPSG','TEST_CONCATENATED',5,"
+ "'EPSG','16031');"))
+ << last_error();
+
+ // Noop projected
+ ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step "
+ "VALUES('EPSG','TEST_CONCATENATED',6,"
+ "'EPSG','NOOP_TRANSFORMATION_32631');"))
+ << last_error();
+
+ // Inverse map projection
+ ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step "
+ "VALUES('EPSG','TEST_CONCATENATED',7,"
+ "'EPSG','16031');"))
+ << last_error();
+
+ auto dbContext = DatabaseContext::create(m_ctxt);
+ auto authFactory = AuthorityFactory::create(dbContext, std::string("EPSG"));
+ const auto op =
+ authFactory->createCoordinateOperation("TEST_CONCATENATED", false);
+ auto wkt = op->exportToPROJString(PROJStringFormatter::create().get());
+ EXPECT_EQ(wkt, "+proj=noop");
+}
+
+// ---------------------------------------------------------------------------
+
TEST(factory, createObjectsFromName) {
auto ctxt = DatabaseContext::create();
auto factory = AuthorityFactory::create(ctxt, std::string());