diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2021-03-13 13:17:48 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2021-03-15 16:16:32 +0100 |
| commit | d618dcc33b5a0783565e15ad36a9fa0b8839fb7b (patch) | |
| tree | f0861e8ab5b32ab32e19412a0e7157fd740b958f | |
| parent | 8a67a3fb96ffdb29887b2954dd4bb8af92f6960d (diff) | |
| download | PROJ-d618dcc33b5a0783565e15ad36a9fa0b8839fb7b.tar.gz PROJ-d618dcc33b5a0783565e15ad36a9fa0b8839fb7b.zip | |
SQL export: add publication_date and frame_reference_epoch to datums
| -rw-r--r-- | src/iso19111/factory.cpp | 44 | ||||
| -rw-r--r-- | test/unit/test_factory.cpp | 30 |
2 files changed, 66 insertions, 8 deletions
diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp index d7050bce..a4c5dcba 100644 --- a/src/iso19111/factory.cpp +++ b/src/iso19111/factory.cpp @@ -1825,13 +1825,27 @@ std::vector<std::string> DatabaseContext::Private::getInsertStatementsFor( } // Insert new record in geodetic_datum table + std::string publicationDate("NULL"); + if (datum->publicationDate().has_value()) { + publicationDate = '\''; + publicationDate += + replaceAll(datum->publicationDate()->toString(), "'", "''"); + publicationDate += '\''; + } + std::string frameReferenceEpoch("NULL"); + const auto dynamicDatum = + dynamic_cast<const datum::DynamicGeodeticReferenceFrame *>(datum.get()); + if (dynamicDatum) { + frameReferenceEpoch = + toString(dynamicDatum->frameReferenceEpoch().value()); + } const auto sql = formatStatement( "INSERT INTO geodetic_datum VALUES(" - "'%q','%q','%q','%q','%q','%q','%q','%q',NULL,NULL,NULL,0);", + "'%q','%q','%q','%q','%q','%q','%q','%q',%s,%s,NULL,0);", authName.c_str(), code.c_str(), datum->nameStr().c_str(), "", // description ellipsoidAuthName.c_str(), ellipsoidCode.c_str(), pmAuthName.c_str(), - pmCode.c_str()); + pmCode.c_str(), publicationDate.c_str(), frameReferenceEpoch.c_str()); appendSql(sqlStatements, sql); identifyOrInsertUsages(datum, "geodetic_datum", authName, code, @@ -2066,12 +2080,26 @@ std::vector<std::string> DatabaseContext::Private::getInsertStatementsFor( } // Insert new record in vertical_datum table - const auto sql = formatStatement("INSERT INTO vertical_datum VALUES(" - "'%q','%q','%q','%q',NULL,NULL,NULL,0);", - authName.c_str(), code.c_str(), - datum->nameStr().c_str(), - "" // description - ); + std::string publicationDate("NULL"); + if (datum->publicationDate().has_value()) { + publicationDate = '\''; + publicationDate += + replaceAll(datum->publicationDate()->toString(), "'", "''"); + publicationDate += '\''; + } + std::string frameReferenceEpoch("NULL"); + const auto dynamicDatum = + dynamic_cast<const datum::DynamicVerticalReferenceFrame *>(datum.get()); + if (dynamicDatum) { + frameReferenceEpoch = + toString(dynamicDatum->frameReferenceEpoch().value()); + } + const auto sql = formatStatement( + "INSERT INTO vertical_datum VALUES(" + "'%q','%q','%q','%q',%s,%s,NULL,0);", + authName.c_str(), code.c_str(), datum->nameStr().c_str(), + "", // description + publicationDate.c_str(), frameReferenceEpoch.c_str()); appendSql(sqlStatements, sql); identifyOrInsertUsages(datum, "vertical_datum", authName, code, diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 55378134..16aa87a3 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -4005,6 +4005,36 @@ TEST(factory, objectInsertion) { .empty()); ctxt->stopInsertStatementsSession(); } + + // DynamicGeodeticReferenceFrame + { + auto ctxt = DatabaseContext::create(); + ctxt->startInsertStatementsSession(); + const auto datum = AuthorityFactory::create(ctxt, "EPSG") + ->createDatum("1165"); // ITRF2014 + const auto sql = ctxt->getInsertStatementsFor(datum, "HOBU", "XXXX", + false, {"HOBU"}); + const auto datumNew = + AuthorityFactory::create(ctxt, "HOBU")->createDatum("XXXX"); + EXPECT_TRUE(datumNew->isEquivalentTo( + datum.get(), IComparable::Criterion::EQUIVALENT)); + ctxt->stopInsertStatementsSession(); + } + + // DynamicVerticalReferenceFrame + { + auto ctxt = DatabaseContext::create(); + ctxt->startInsertStatementsSession(); + const auto datum = AuthorityFactory::create(ctxt, "EPSG") + ->createDatum("1096"); // Norway Normal Null 2000 + const auto sql = ctxt->getInsertStatementsFor(datum, "HOBU", "XXXX", + false, {"HOBU"}); + const auto datumNew = + AuthorityFactory::create(ctxt, "HOBU")->createDatum("XXXX"); + EXPECT_TRUE(datumNew->isEquivalentTo( + datum.get(), IComparable::Criterion::EQUIVALENT)); + ctxt->stopInsertStatementsSession(); + } } } // namespace |
