aboutsummaryrefslogtreecommitdiff
path: root/test/unit/test_factory.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-03-19 11:27:49 +0100
committerEven Rouault <even.rouault@spatialys.com>2021-03-19 11:30:54 +0100
commit219758a4c9cfa84d15c593b1d0239250606cb7a2 (patch)
tree12fb702d3727e7b95bc98ab6f0ca4feba6262bbf /test/unit/test_factory.cpp
parent76906029f3798ecaeb0a3f61d140d7714cc8524d (diff)
downloadPROJ-219758a4c9cfa84d15c593b1d0239250606cb7a2.tar.gz
PROJ-219758a4c9cfa84d15c593b1d0239250606cb7a2.zip
SQL output: make it possible to export non-EPSG projection methods or methods and params lacking an explicit EPSG id
Diffstat (limited to 'test/unit/test_factory.cpp')
-rw-r--r--test/unit/test_factory.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp
index e0616baa..d153d401 100644
--- a/test/unit/test_factory.cpp
+++ b/test/unit/test_factory.cpp
@@ -4086,6 +4086,97 @@ TEST(factory, objectInsertion) {
ensemble.get(), IComparable::Criterion::EQUIVALENT));
ctxt->stopInsertStatementsSession();
}
+
+ // non-EPSG projection method
+ {
+ auto ctxt = DatabaseContext::create();
+ ctxt->startInsertStatementsSession();
+ const auto crs = nn_dynamic_pointer_cast<CRS>(
+ PROJStringParser().createFromPROJString(
+ "+proj=sinu +lon_0=195 +x_0=0 +y_0=0 +R=3396000 +units=m "
+ "+no_defs +type=crs"));
+ ASSERT_TRUE(crs != nullptr);
+ const auto statements = ctxt->getInsertStatementsFor(
+ NN_NO_CHECK(crs), "HOBU", "XXXX", false);
+ bool found = false;
+ for (const auto &sql : statements) {
+ if (sql.find("INSERT INTO conversion") != std::string::npos) {
+ found = true;
+ const char *expected =
+ "VALUES('HOBU','CONVERSION_XXXX',"
+ "'unknown','','PROJ','sinu','Sinusoidal',";
+ EXPECT_TRUE(sql.find(expected) != std::string::npos) << sql;
+ }
+ }
+ EXPECT_TRUE(found);
+ const auto crsNew =
+ AuthorityFactory::create(ctxt, "HOBU")->createProjectedCRS("XXXX");
+ EXPECT_TRUE(crsNew->isEquivalentTo(crs.get(),
+ IComparable::Criterion::EQUIVALENT));
+ ctxt->stopInsertStatementsSession();
+ }
+
+ // Missing projection method and parameter id
+ {
+ auto ctxt = DatabaseContext::create();
+ ctxt->startInsertStatementsSession();
+ const auto wkt =
+ "PROJCRS[\"unknown\",\n"
+ " BASEGEOGCRS[\"unknown\",\n"
+ " DATUM[\"World Geodetic System 1984\",\n"
+ " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n"
+ " LENGTHUNIT[\"metre\",1]]],\n"
+ " PRIMEM[\"Greenwich\",0,\n"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]]],\n"
+ " CONVERSION[\"UTM zone 31N\",\n"
+ " METHOD[\"Transverse Mercator\"],\n"
+ " PARAMETER[\"Latitude of natural origin\",0,\n"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
+ " PARAMETER[\"Longitude of natural origin\",3,\n"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
+ " PARAMETER[\"Scale factor at natural origin\",0.9996,\n"
+ " SCALEUNIT[\"unity\",1]],\n"
+ " PARAMETER[\"False easting\",500000,\n"
+ " LENGTHUNIT[\"metre\",1]],\n"
+ " PARAMETER[\"False northing\",0,\n"
+ " LENGTHUNIT[\"metre\",1]]],\n"
+ " CS[Cartesian,2],\n"
+ " AXIS[\"(E)\",east,\n"
+ " ORDER[1],\n"
+ " LENGTHUNIT[\"metre\",1]],\n"
+ " AXIS[\"(N)\",north,\n"
+ " ORDER[2],\n"
+ " LENGTHUNIT[\"metre\",1]]]";
+ const auto crs =
+ nn_dynamic_pointer_cast<CRS>(WKTParser().createFromWKT(wkt));
+ ASSERT_TRUE(crs != nullptr);
+ const auto statements = ctxt->getInsertStatementsFor(
+ NN_NO_CHECK(crs), "HOBU", "XXXX", false);
+ bool found = false;
+ const char *expected =
+ "INSERT INTO conversion VALUES('HOBU','CONVERSION_XXXX',"
+ "'UTM zone 31N','','EPSG','9807','Transverse Mercator',"
+ "'EPSG','8801','Latitude of natural origin',0,'EPSG','9102',"
+ "'EPSG','8802','Longitude of natural origin',3,'EPSG','9102',"
+ "'EPSG','8805','Scale factor at natural origin',0.9996,"
+ "'EPSG','9201',"
+ "'EPSG','8806','False easting',500000,'EPSG','9001',"
+ "'EPSG','8807','False northing',0,'EPSG','9001',"
+ "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"
+ "NULL,0)";
+ for (const auto &sql : statements) {
+ if (sql.find("INSERT INTO conversion") != std::string::npos) {
+ found = true;
+ EXPECT_TRUE(sql.find(expected) != std::string::npos) << sql;
+ }
+ }
+ EXPECT_TRUE(found);
+ const auto crsNew =
+ AuthorityFactory::create(ctxt, "HOBU")->createProjectedCRS("XXXX");
+ EXPECT_TRUE(crsNew->isEquivalentTo(crs.get(),
+ IComparable::Criterion::EQUIVALENT));
+ ctxt->stopInsertStatementsSession();
+ }
}
} // namespace