From 4d9fa77bef599353d3809541cb7e6adb8ec12525 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sun, 24 May 2020 19:52:46 +0200 Subject: Database: add a same_source_target_crs column to supersession table This is in preparation for EPSG 9.8.11 import that supersedes a number of grid transformation for US transformations, but the superseded and replacement transformations don't operate on the same (source_crs, target_crs), which is a bit weird. So in that situation, ignores the supersession. --- src/iso19111/factory.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'src/iso19111/factory.cpp') diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp index 3901e183..9388b196 100644 --- a/src/iso19111/factory.cpp +++ b/src/iso19111/factory.cpp @@ -3587,7 +3587,8 @@ AuthorityFactory::createFromCoordinateReferenceSystemCodes( "ss.superseded_table_name = cov.table_name AND " "ss.superseded_auth_name = cov.auth_name AND " "ss.superseded_code = cov.code AND " - "ss.superseded_table_name = ss.replacement_table_name " + "ss.superseded_table_name = ss.replacement_table_name AND " + "ss.same_source_target_crs = 1 " "WHERE "; } else { sql = "SELECT source_crs_auth_name, source_crs_code, " @@ -3920,12 +3921,14 @@ AuthorityFactory::createFromCRSCodesWithIntermediates( "ss1.superseded_table_name = v1.table_name AND " "ss1.superseded_auth_name = v1.auth_name AND " "ss1.superseded_code = v1.code AND " - "ss1.superseded_table_name = ss1.replacement_table_name " + "ss1.superseded_table_name = ss1.replacement_table_name AND " + "ss1.same_source_target_crs = 1 " "LEFT JOIN supersession ss2 ON " "ss2.superseded_table_name = v2.table_name AND " "ss2.superseded_auth_name = v2.auth_name AND " "ss2.superseded_code = v2.code AND " - "ss2.superseded_table_name = ss2.replacement_table_name "); + "ss2.superseded_table_name = ss2.replacement_table_name AND " + "ss2.same_source_target_crs = 1 "); const std::string joinArea( (discardSuperseded ? joinSupersession : std::string()) + "JOIN area a1 ON v1.area_of_use_auth_name = a1.auth_name " @@ -4529,10 +4532,11 @@ AuthorityFactory::createBetweenGeodeticCRSWithDatumBasedIntermediates( const auto filterOutSuperseded = [&](SQLResultSet &&resultSet) { std::set> setTransf; - std::string findSupersededSql("SELECT superseded_table_name, " - "superseded_auth_name, superseded_code, " - "replacement_auth_name, replacement_code " - "FROM supersession WHERE "); + std::string findSupersededSql( + "SELECT superseded_table_name, " + "superseded_auth_name, superseded_code, " + "replacement_auth_name, replacement_code " + "FROM supersession WHERE same_source_target_crs = 1 AND ("); bool findSupersededFirstWhere = true; ListOfParams findSupersededParams; @@ -4583,6 +4587,7 @@ AuthorityFactory::createBetweenGeodeticCRSWithDatumBasedIntermediates( setTransf.insert( std::pair(auth_name2, code2)); } + findSupersededSql += ')'; std::map>> mapSupersession; -- cgit v1.2.3 From bf50f76e1d1e45d65b79229c060fe66df8ef289c Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sun, 24 May 2020 21:35:13 +0200 Subject: Database: import scope and remarks for conversion (fixes #2237) --- src/iso19111/factory.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src/iso19111/factory.cpp') diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp index 9388b196..8fa5a24d 100644 --- a/src/iso19111/factory.cpp +++ b/src/iso19111/factory.cpp @@ -2392,7 +2392,8 @@ operation::ConversionNNPtr AuthorityFactory::createConversion(const std::string &code) const { static const char *sql = - "SELECT name, area_of_use_auth_name, area_of_use_code, " + "SELECT name, description, scope, " + "area_of_use_auth_name, area_of_use_code, " "method_auth_name, method_code, method_name, " "param1_auth_name, param1_code, param1_name, param1_value, " @@ -2441,6 +2442,8 @@ AuthorityFactory::createConversion(const std::string &code) const { const auto &row = res.front(); size_t idx = 0; const auto &name = row[idx++]; + const auto &description = row[idx++]; + const auto &scope = row[idx++]; const auto &area_of_use_auth_name = row[idx++]; const auto &area_of_use_code = row[idx++]; const auto &method_auth_name = row[idx++]; @@ -2475,8 +2478,9 @@ AuthorityFactory::createConversion(const std::string &code) const { } const bool deprecated = row[base_param_idx + N_MAX_PARAMS * 6] == "1"; - auto propConversion = d->createProperties( - code, name, deprecated, area_of_use_auth_name, area_of_use_code); + auto propConversion = + d->createProperties(code, name, deprecated, description, scope, + area_of_use_auth_name, area_of_use_code); auto propMethod = util::PropertyMap().set( common::IdentifiedObject::NAME_KEY, method_name); -- cgit v1.2.3