aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-12-03 17:52:57 +0100
committerGitHub <noreply@github.com>2019-12-03 17:52:57 +0100
commitcb4e77d58f2a791c24e232792c1671d6b9f4a477 (patch)
treec599d52dbd53dd7b621eeca7f68eb361627b4477 /src
parenta0de56228be06427c7870cbc1923b11dad11856e (diff)
parent1d2b1884b05cf29991bf1ad420829f0f56cf9a2b (diff)
downloadPROJ-cb4e77d58f2a791c24e232792c1671d6b9f4a477.tar.gz
PROJ-cb4e77d58f2a791c24e232792c1671d6b9f4a477.zip
Merge pull request #1761 from rouault/register_ausgeoid
Database: register AUSGeoid09 and AUSGeoid2020
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/coordinateoperation.cpp43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp
index c295aff2..6120c768 100644
--- a/src/iso19111/coordinateoperation.cpp
+++ b/src/iso19111/coordinateoperation.cpp
@@ -12923,9 +12923,40 @@ bool CoordinateOperationFactory::Private::createOperationsFromDatabase(
bool sameGeodeticDatum = false;
if (vertSrc || vertDst) {
- createOperationsFromDatabaseWithVertCRS(sourceCRS, targetCRS, context,
- geogSrc, geogDst, vertSrc,
- vertDst, res);
+ if (res.empty()) {
+ if (geogSrc &&
+ geogSrc->coordinateSystem()->axisList().size() == 2 &&
+ vertDst) {
+ auto dbContext =
+ context.context->getAuthorityFactory()->databaseContext();
+ auto resTmp = findOpsInRegistryDirect(
+ sourceCRS->promoteTo3D(std::string(), dbContext), targetCRS,
+ context, resFindDirectNonEmptyBeforeFiltering);
+ for (auto &op : resTmp) {
+ auto newOp = op->shallowClone();
+ setCRSs(newOp.get(), sourceCRS, targetCRS);
+ res.emplace_back(newOp);
+ }
+ } else if (geogDst &&
+ geogDst->coordinateSystem()->axisList().size() == 2 &&
+ vertSrc) {
+ auto dbContext =
+ context.context->getAuthorityFactory()->databaseContext();
+ auto resTmp = findOpsInRegistryDirect(
+ sourceCRS, targetCRS->promoteTo3D(std::string(), dbContext),
+ context, resFindDirectNonEmptyBeforeFiltering);
+ for (auto &op : resTmp) {
+ auto newOp = op->shallowClone();
+ setCRSs(newOp.get(), sourceCRS, targetCRS);
+ res.emplace_back(newOp);
+ }
+ }
+ }
+ if (res.empty()) {
+ createOperationsFromDatabaseWithVertCRS(sourceCRS, targetCRS,
+ context, geogSrc, geogDst,
+ vertSrc, vertDst, res);
+ }
} else if (geodSrc && geodDst) {
const auto &srcDatum = geodSrc->datum();
@@ -13406,7 +13437,7 @@ void CoordinateOperationFactory::Private::createOperationsGeodToGeod(
util::IComparable::Criterion::EQUIVALENT)) {
res.emplace_back(
Conversion::createGeographicGeocentric(sourceCRS, targetCRS));
- } else if (isSrcGeocentric) {
+ } else if (isSrcGeocentric && geogDst) {
std::string interm_crs_name(geogDst->nameStr());
interm_crs_name += " (geocentric)";
auto interm_crs =
@@ -13539,7 +13570,7 @@ void CoordinateOperationFactory::Private::createOperationsBoundToGeog(
}
}
// If the datum are equivalent, this is also fine
- } else if (geogCRSOfBaseOfBoundSrc && hubSrcGeog->datum() &&
+ } else if (geogCRSOfBaseOfBoundSrc && hubSrcGeog && hubSrcGeog->datum() &&
geogDst->datum() &&
hubSrcGeog->datum()->_isEquivalentTo(
geogDst->datum().get(),
@@ -13568,7 +13599,7 @@ void CoordinateOperationFactory::Private::createOperationsBoundToGeog(
// Case of "+proj=latlong +ellps=clrk66
// +nadgrids=ntv1_can.dat,conus"
// to "+proj=latlong +datum=NAD83"
- } else if (geogCRSOfBaseOfBoundSrc && hubSrcGeog->datum() &&
+ } else if (geogCRSOfBaseOfBoundSrc && hubSrcGeog && hubSrcGeog->datum() &&
geogDst->datum() &&
geogCRSOfBaseOfBoundSrc->ellipsoid()->_isEquivalentTo(
datum::Ellipsoid::CLARKE_1866.get(),