aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/iso19111/c_api.cpp21
-rw-r--r--src/proj.h3
-rw-r--r--test/unit/test_c_api.cpp34
3 files changed, 57 insertions, 1 deletions
diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp
index 79147ae8..ba1b3324 100644
--- a/src/iso19111/c_api.cpp
+++ b/src/iso19111/c_api.cpp
@@ -915,6 +915,18 @@ convertPJObjectTypeToObjectType(PJ_TYPE type, bool &valid) {
cppType = AuthorityFactory::ObjectType::DATUM;
break;
+ case PJ_TYPE_TEMPORAL_DATUM:
+ valid = false;
+ break;
+
+ case PJ_TYPE_ENGINEERING_DATUM:
+ valid = false;
+ break;
+
+ case PJ_TYPE_PARAMETRIC_DATUM:
+ valid = false;
+ break;
+
case PJ_TYPE_CRS:
cppType = AuthorityFactory::ObjectType::CRS;
break;
@@ -1084,6 +1096,15 @@ PJ_TYPE proj_get_type(const PJ *obj) {
if (dynamic_cast<DatumEnsemble *>(ptr)) {
return PJ_TYPE_DATUM_ENSEMBLE;
}
+ if (dynamic_cast<TemporalDatum *>(ptr)) {
+ return PJ_TYPE_TEMPORAL_DATUM;
+ }
+ if (dynamic_cast<EngineeringDatum *>(ptr)) {
+ return PJ_TYPE_ENGINEERING_DATUM;
+ }
+ if (dynamic_cast<ParametricDatum *>(ptr)) {
+ return PJ_TYPE_PARAMETRIC_DATUM;
+ }
{
auto crs = dynamic_cast<GeographicCRS *>(ptr);
diff --git a/src/proj.h b/src/proj.h
index 330ab01e..2acaab82 100644
--- a/src/proj.h
+++ b/src/proj.h
@@ -710,6 +710,9 @@ typedef enum
PJ_TYPE_VERTICAL_REFERENCE_FRAME,
PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME,
PJ_TYPE_DATUM_ENSEMBLE,
+ PJ_TYPE_TEMPORAL_DATUM,
+ PJ_TYPE_ENGINEERING_DATUM,
+ PJ_TYPE_PARAMETRIC_DATUM,
/** Abstract type, not returned by proj_get_type() */
PJ_TYPE_CRS,
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index a1918fb7..0ef78d87 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -714,6 +714,34 @@ TEST_F(CApi, proj_get_type) {
EXPECT_EQ(proj_get_type(obj), PJ_TYPE_VERTICAL_CRS);
}
{
+ auto wkt = "TDATUM[\"Gregorian calendar\",\n"
+ " CALENDAR[\"proleptic Gregorian\"],\n"
+ " TIMEORIGIN[0000-01-01]]";
+
+ auto datum = proj_create_from_wkt(
+ m_ctxt, wkt,
+ nullptr, nullptr, nullptr);
+ ObjectKeeper keeper(datum);
+ ASSERT_NE(datum, nullptr);
+ EXPECT_EQ(proj_get_type(datum), PJ_TYPE_TEMPORAL_DATUM);
+ }
+ {
+ auto wkt = "ENGINEERINGDATUM[\"Engineering datum\"]";
+ auto datum = proj_create_from_wkt(
+ m_ctxt, wkt,
+ nullptr, nullptr, nullptr);
+ ObjectKeeper keeper(datum);
+ EXPECT_EQ(proj_get_type(datum), PJ_TYPE_ENGINEERING_DATUM);
+ }
+ {
+ auto wkt = "PDATUM[\"Mean Sea Level\",ANCHOR[\"1013.25 hPa at 15°C\"]]";
+ auto datum = proj_create_from_wkt(
+ m_ctxt, wkt,
+ nullptr, nullptr, nullptr);
+ ObjectKeeper keeper(datum);
+ EXPECT_EQ(proj_get_type(datum), PJ_TYPE_PARAMETRIC_DATUM);
+ }
+ {
auto obj = proj_create_from_wkt(
m_ctxt, createVerticalCRS()
->datum()
@@ -1132,6 +1160,9 @@ TEST_F(CApi, proj_get_codes_from_database) {
PJ_TYPE_VERTICAL_REFERENCE_FRAME,
PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME,
PJ_TYPE_DATUM_ENSEMBLE,
+ PJ_TYPE_TEMPORAL_DATUM,
+ PJ_TYPE_ENGINEERING_DATUM,
+ PJ_TYPE_PARAMETRIC_DATUM,
PJ_TYPE_CRS,
PJ_TYPE_GEODETIC_CRS,
@@ -1156,7 +1187,8 @@ TEST_F(CApi, proj_get_codes_from_database) {
auto list = proj_get_codes_from_database(m_ctxt, "EPSG", type, true);
ListFreer feer(list);
if (type == PJ_TYPE_TEMPORAL_CRS || type == PJ_TYPE_BOUND_CRS ||
- type == PJ_TYPE_UNKNOWN) {
+ type == PJ_TYPE_UNKNOWN || type == PJ_TYPE_TEMPORAL_DATUM ||
+ type == PJ_TYPE_ENGINEERING_DATUM || type == PJ_TYPE_PARAMETRIC_DATUM) {
EXPECT_EQ(list, nullptr) << type;
} else {
ASSERT_NE(list, nullptr) << type;