diff options
| -rw-r--r-- | include/proj/common.hpp | 2 | ||||
| -rw-r--r-- | include/proj/datum.hpp | 4 | ||||
| -rw-r--r-- | src/iso19111/common.cpp | 9 | ||||
| -rw-r--r-- | src/iso19111/datum.cpp | 13 | ||||
| -rw-r--r-- | src/iso19111/factory.cpp | 9 | ||||
| -rw-r--r-- | test/unit/test_factory.cpp | 11 |
6 files changed, 45 insertions, 3 deletions
diff --git a/include/proj/common.hpp b/include/proj/common.hpp index 0a1f5d19..d2f71989 100644 --- a/include/proj/common.hpp +++ b/include/proj/common.hpp @@ -253,10 +253,10 @@ class DateTime { protected: DateTime(); PROJ_FRIEND_OPTIONAL(DateTime); + DateTime &operator=(const DateTime &other); private: explicit DateTime(const std::string &str); - DateTime &operator=(const DateTime &other) = delete; PROJ_OPAQUE_PRIVATE_DATA }; diff --git a/include/proj/datum.hpp b/include/proj/datum.hpp index a26c94b9..e97f1695 100644 --- a/include/proj/datum.hpp +++ b/include/proj/datum.hpp @@ -89,6 +89,10 @@ class PROJ_GCC_DLL Datum : public common::ObjectUsage, protected: PROJ_INTERNAL void setAnchor(const util::optional<std::string> &anchor); + PROJ_INTERNAL void + setProperties(const util::PropertyMap + &properties); // throw(InvalidValueTypeException) + private: PROJ_OPAQUE_PRIVATE_DATA Datum &operator=(const Datum &other) = delete; diff --git a/src/iso19111/common.cpp b/src/iso19111/common.cpp index d7960ee9..97900bda 100644 --- a/src/iso19111/common.cpp +++ b/src/iso19111/common.cpp @@ -552,6 +552,15 @@ DateTime::DateTime(const DateTime &other) // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress +DateTime &DateTime::operator=(const DateTime &other) { + d->str_ = other.d->str_; + return *this; +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress DateTime::~DateTime() = default; //! @endcond diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp index 95754a8d..321fe93f 100644 --- a/src/iso19111/datum.cpp +++ b/src/iso19111/datum.cpp @@ -200,6 +200,19 @@ void Datum::setAnchor(const util::optional<std::string> &anchor) { // --------------------------------------------------------------------------- +void Datum::setProperties( + const util::PropertyMap &properties) // throw(InvalidValueTypeException) +{ + std::string publicationDate; + properties.getStringValue("PUBLICATION_DATE", publicationDate); + if (!publicationDate.empty()) { + d->publicationDate = common::DateTime::create(publicationDate); + } + ObjectUsage::setProperties(properties); +} + +// --------------------------------------------------------------------------- + bool Datum::__isEquivalentTo(const util::IComparable *other, util::IComparable::Criterion criterion) const { auto otherDatum = dynamic_cast<const Datum *>(other); diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp index 309e778a..98b05317 100644 --- a/src/iso19111/factory.cpp +++ b/src/iso19111/factory.cpp @@ -1887,7 +1887,8 @@ AuthorityFactory::createGeodeticDatum(const std::string &code) const { auto res = d->runWithCodeParam( "SELECT name, ellipsoid_auth_name, ellipsoid_code, " "prime_meridian_auth_name, prime_meridian_code, area_of_use_auth_name, " - "area_of_use_code, deprecated FROM geodetic_datum WHERE " + "area_of_use_code, publication_date, deprecated FROM geodetic_datum " + "WHERE " "auth_name = ? AND code = ?", code); if (res.empty()) { @@ -1903,7 +1904,8 @@ AuthorityFactory::createGeodeticDatum(const std::string &code) const { const auto &prime_meridian_code = row[4]; const auto &area_of_use_auth_name = row[5]; const auto &area_of_use_code = row[6]; - const bool deprecated = row[7] == "1"; + const auto &publication_date = row[7]; + const bool deprecated = row[8] == "1"; auto ellipsoid = d->createFactory(ellipsoid_auth_name) ->createEllipsoid(ellipsoid_code); auto pm = d->createFactory(prime_meridian_auth_name) @@ -1911,6 +1913,9 @@ AuthorityFactory::createGeodeticDatum(const std::string &code) const { auto props = d->createProperties( code, name, deprecated, area_of_use_auth_name, area_of_use_code); auto anchor = util::optional<std::string>(); + if (!publication_date.empty()) { + props.set("PUBLICATION_DATE", publication_date); + } auto datum = datum::GeodeticReferenceFrame::create(props, ellipsoid, anchor, pm); d->context()->d->cache(cacheKey, datum); diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 15feda64..93b2ef34 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -251,6 +251,17 @@ TEST(factory, AuthorityFactory_createGeodeticDatum) { auto extent = domain->domainOfValidity(); ASSERT_TRUE(extent != nullptr); EXPECT_TRUE(extent->isEquivalentTo(factory->createExtent("1262").get())); + EXPECT_FALSE(grf->publicationDate().has_value()); +} + +// --------------------------------------------------------------------------- + +TEST(factory, AuthorityFactory_createGeodeticDatum_with_publication_date) { + auto factory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); + //'World Geodetic System 1984 (G1762) + auto grf = factory->createGeodeticDatum("1156"); + EXPECT_TRUE(grf->publicationDate().has_value()); + EXPECT_EQ(grf->publicationDate()->toString(), "2005-01-01"); } // --------------------------------------------------------------------------- |
