diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2020-10-11 20:01:29 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2020-10-11 20:01:29 +0200 |
| commit | d1a0d95da549f7d32bcd8be408afe1fca62a6fb2 (patch) | |
| tree | aaaffe1812578ec5479c5fc413d47793cd1d5bcb /src | |
| parent | ad80dc88a70032e1d96812b574b2d4d22e223394 (diff) | |
| download | PROJ-d1a0d95da549f7d32bcd8be408afe1fca62a6fb2.tar.gz PROJ-d1a0d95da549f7d32bcd8be408afe1fca62a6fb2.zip | |
Database query: add AuthorityFactory::ObjectType::DYNAMIC_GEODETIC_REFERENCE_FRAME and DYNAMIC_VERTICAL_REFERENCE_FRAME, and make corresponding C API work
Diffstat (limited to 'src')
| -rw-r--r-- | src/iso19111/c_api.cpp | 12 | ||||
| -rw-r--r-- | src/iso19111/factory.cpp | 53 |
2 files changed, 49 insertions, 16 deletions
diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp index fb0a3af7..c152df88 100644 --- a/src/iso19111/c_api.cpp +++ b/src/iso19111/c_api.cpp @@ -898,15 +898,23 @@ convertPJObjectTypeToObjectType(PJ_TYPE type, bool &valid) { break; case PJ_TYPE_GEODETIC_REFERENCE_FRAME: - case PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME: cppType = AuthorityFactory::ObjectType::GEODETIC_REFERENCE_FRAME; break; + case PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME: + cppType = + AuthorityFactory::ObjectType::DYNAMIC_GEODETIC_REFERENCE_FRAME; + break; + case PJ_TYPE_VERTICAL_REFERENCE_FRAME: - case PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME: cppType = AuthorityFactory::ObjectType::VERTICAL_REFERENCE_FRAME; break; + case PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME: + cppType = + AuthorityFactory::ObjectType::DYNAMIC_VERTICAL_REFERENCE_FRAME; + break; + case PJ_TYPE_DATUM_ENSEMBLE: cppType = AuthorityFactory::ObjectType::DATUM; break; diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp index 473aa254..ef5c6e02 100644 --- a/src/iso19111/factory.cpp +++ b/src/iso19111/factory.cpp @@ -2101,14 +2101,15 @@ AuthorityFactory::createVerticalDatum(const std::string &code) const { props.set("PUBLICATION_DATE", publication_date); } auto anchor = util::optional<std::string>(); - return frame_reference_epoch.empty() - ? datum::VerticalReferenceFrame::create(props, anchor) - : datum::DynamicVerticalReferenceFrame::create( - props, anchor, - util::optional<datum::RealizationMethod>(), - common::Measure(c_locale_stod(frame_reference_epoch), - common::UnitOfMeasure::YEAR), - util::optional<std::string>()); + if (frame_reference_epoch.empty()) { + return datum::VerticalReferenceFrame::create(props, anchor); + } else { + return datum::DynamicVerticalReferenceFrame::create( + props, anchor, util::optional<datum::RealizationMethod>(), + common::Measure(c_locale_stod(frame_reference_epoch), + common::UnitOfMeasure::YEAR), + util::optional<std::string>()); + } } catch (const std::exception &ex) { throw buildFactoryException("vertical reference frame", code, ex); } @@ -5260,9 +5261,17 @@ AuthorityFactory::getAuthorityCodes(const ObjectType &type, case ObjectType::GEODETIC_REFERENCE_FRAME: sql = "SELECT code FROM geodetic_datum WHERE "; break; + case ObjectType::DYNAMIC_GEODETIC_REFERENCE_FRAME: + sql = "SELECT code FROM geodetic_datum WHERE " + "frame_reference_epoch IS NOT NULL AND "; + break; case ObjectType::VERTICAL_REFERENCE_FRAME: sql = "SELECT code FROM vertical_datum WHERE "; break; + case ObjectType::DYNAMIC_VERTICAL_REFERENCE_FRAME: + sql = "SELECT code FROM vertical_datum WHERE " + "frame_reference_epoch IS NOT NULL AND "; + break; case ObjectType::CRS: sql = "SELECT code FROM crs_view WHERE "; break; @@ -5742,10 +5751,18 @@ AuthorityFactory::createObjectsFromNameEx( res.emplace_back( TableType("geodetic_datum", std::string())); break; + case ObjectType::DYNAMIC_GEODETIC_REFERENCE_FRAME: + res.emplace_back( + TableType("geodetic_datum", "frame_reference_epoch")); + break; case ObjectType::VERTICAL_REFERENCE_FRAME: res.emplace_back( TableType("vertical_datum", std::string())); break; + case ObjectType::DYNAMIC_VERTICAL_REFERENCE_FRAME: + res.emplace_back( + TableType("vertical_datum", "frame_reference_epoch")); + break; case ObjectType::CRS: res.emplace_back(TableType("geodetic_crs", std::string())); res.emplace_back(TableType("projected_crs", std::string())); @@ -5824,9 +5841,13 @@ AuthorityFactory::createObjectsFromNameEx( sql += tableNameTypePair.first; sql += " WHERE 1 = 1 "; if (!tableNameTypePair.second.empty()) { - sql += "AND type = '"; - sql += tableNameTypePair.second; - sql += "' "; + if (tableNameTypePair.second == "frame_reference_epoch") { + sql += "AND frame_reference_epoch IS NOT NULL "; + } else { + sql += "AND type = '"; + sql += tableNameTypePair.second; + sql += "' "; + } } if (deprecated) { sql += "AND deprecated = 1 "; @@ -5854,9 +5875,13 @@ AuthorityFactory::createObjectsFromNameEx( sql += tableNameTypePair.first; sql += "' "; if (!tableNameTypePair.second.empty()) { - sql += "AND ov.type = '"; - sql += tableNameTypePair.second; - sql += "' "; + if (tableNameTypePair.second == "frame_reference_epoch") { + sql += "AND ov.frame_reference_epoch IS NOT NULL "; + } else { + sql += "AND ov.type = '"; + sql += tableNameTypePair.second; + sql += "' "; + } } if (deprecated) { sql += "AND ov.deprecated = 1 "; |
