aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-04-18 16:29:57 +0200
committerGitHub <noreply@github.com>2021-04-18 16:29:57 +0200
commitc70a7447c1f7ca71534b0b711150784aff5b8dbd (patch)
tree6b59da476222a0e0ecacc056f811d3f06f07deb6 /src
parente4e2991b174ea48b67e9b41c8f356a9cf1bba081 (diff)
parentdd79ca70edcee3dc4f5485a87e11e52cfa2ea041 (diff)
downloadPROJ-c70a7447c1f7ca71534b0b711150784aff5b8dbd.tar.gz
PROJ-c70a7447c1f7ca71534b0b711150784aff5b8dbd.zip
Merge pull request #2676 from rouault/fix_geog_to_geog_deprecated
createOperations(): fix Geog to Geog when one is deprecated (fix master regression)
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/factory.cpp73
1 files changed, 43 insertions, 30 deletions
diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp
index 088289c5..8f2bd24a 100644
--- a/src/iso19111/factory.cpp
+++ b/src/iso19111/factory.cpp
@@ -6752,42 +6752,55 @@ AuthorityFactory::createBetweenGeodeticCRSWithDatumBasedIntermediates(
return listTmp;
}
- // Find all geodetic CRS that share the same datum as the source CRS
- SQLResultSet listSourceCRS;
- {
- const auto res = d->run("SELECT datum_auth_name, datum_code FROM "
- "geodetic_crs WHERE auth_name = ? AND code = ?",
- {sourceCRSAuthName, sourceCRSCode});
- if (res.size() != 1) {
- return listTmp;
+ const auto GetListCRSWithSameDatum = [this](const crs::GeodeticCRS *crs,
+ const std::string &crsAuthName,
+ const std::string &crsCode) {
+ // Find all geodetic CRS that share the same datum as the CRS
+ SQLResultSet listCRS;
+
+ const common::IdentifiedObject *obj = crs->datum().get();
+ if (obj == nullptr)
+ obj = crs->datumEnsemble().get();
+ assert(obj != nullptr);
+ const auto &ids = obj->identifiers();
+ std::string datumAuthName;
+ std::string datumCode;
+ if (!ids.empty()) {
+ const auto &id = ids.front();
+ datumAuthName = *(id->codeSpace());
+ datumCode = id->code();
+ } else {
+ const auto res =
+ d->run("SELECT datum_auth_name, datum_code FROM "
+ "geodetic_crs WHERE auth_name = ? AND code = ?",
+ {crsAuthName, crsCode});
+ if (res.size() != 1) {
+ return listCRS;
+ }
+ const auto &row = res.front();
+ datumAuthName = row[0];
+ datumCode = row[1];
}
- const auto &row = res.front();
- const auto sourceDatumAuthName = row[0];
- const auto sourceDatumCode = row[1];
- listSourceCRS =
+ listCRS =
d->run("SELECT auth_name, code FROM geodetic_crs WHERE "
"datum_auth_name = ? AND datum_code = ? AND deprecated = 0",
- {sourceDatumAuthName, sourceDatumCode});
- }
-
- // Find all geodetic CRS that share the same datum as the target CRS
- SQLResultSet listTargetCRS;
- {
- const auto res = d->run("SELECT datum_auth_name, datum_code FROM "
- "geodetic_crs WHERE auth_name = ? AND code = ?",
- {targetCRSAuthName, targetCRSCode});
- if (res.size() != 1) {
- return listTmp;
+ {datumAuthName, datumCode});
+ if (listCRS.empty()) {
+ // Can happen if the CRS is deprecated
+ listCRS.emplace_back(SQLRow{crsAuthName, crsCode});
}
- const auto &row = res.front();
- const auto targetDatumAuthName = row[0];
- const auto targetDatumCode = row[1];
+ return listCRS;
+ };
- listTargetCRS =
- d->run("SELECT auth_name, code FROM geodetic_crs WHERE "
- "datum_auth_name = ? AND datum_code = ? AND deprecated = 0",
- {targetDatumAuthName, targetDatumCode});
+ const SQLResultSet listSourceCRS = GetListCRSWithSameDatum(
+ sourceGeodCRS, sourceCRSAuthName, sourceCRSCode);
+ const SQLResultSet listTargetCRS = GetListCRSWithSameDatum(
+ targetGeodCRS, targetCRSAuthName, targetCRSCode);
+ if (listSourceCRS.empty() || listTargetCRS.empty()) {
+ // would happen only if we had CRS objects in the database without a
+ // link to a datum.
+ return listTmp;
}
ListOfParams params;