aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/proj/common.hpp2
-rw-r--r--include/proj/datum.hpp4
-rw-r--r--src/iso19111/common.cpp9
-rw-r--r--src/iso19111/datum.cpp13
-rw-r--r--src/iso19111/factory.cpp9
-rw-r--r--test/unit/test_factory.cpp11
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");
}
// ---------------------------------------------------------------------------