aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/coordinateoperation.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-08-26 20:10:22 +0200
committerGitHub <noreply@github.com>2020-08-26 20:10:22 +0200
commitef48acb4ab6e3426ac66f37a6477521d7b7be6d3 (patch)
tree3184c8908d7325ff2c69b59251810a00f6a18ae5 /src/iso19111/coordinateoperation.cpp
parent683d3097ff2cabd573a82757e8bef6d8f0447d37 (diff)
parent138555c2491a70428d3c8c82fdf9bb778ad0ae62 (diff)
downloadPROJ-ef48acb4ab6e3426ac66f37a6477521d7b7be6d3.tar.gz
PROJ-ef48acb4ab6e3426ac66f37a6477521d7b7be6d3.zip
Merge pull request #2342 from rouault/proj_create_vertical_crs_ex_accuracy
proj_create_vertical_crs_ex(): add a ACCURACY option to provide an explicit accuracy, or derive it from the grid name if it is known
Diffstat (limited to 'src/iso19111/coordinateoperation.cpp')
-rw-r--r--src/iso19111/coordinateoperation.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp
index 3d5287a3..327af7a1 100644
--- a/src/iso19111/coordinateoperation.cpp
+++ b/src/iso19111/coordinateoperation.cpp
@@ -13738,7 +13738,8 @@ CoordinateOperationFactory::Private::createOperationsGeogToVertFromGeoid(
return ret;
};
- const auto getProjGeoidTransformation = [&sourceCRS, &targetCRS, &vertDst](
+ const auto getProjGeoidTransformation = [&sourceCRS, &targetCRS, &vertDst,
+ &context](
const CoordinateOperationNNPtr &model,
const std::string &projFilename) {
@@ -13784,8 +13785,32 @@ CoordinateOperationFactory::Private::createOperationsGeogToVertFromGeoid(
const auto properties = util::PropertyMap().set(
common::IdentifiedObject::NAME_KEY,
buildOpName("Transformation", vertCRSMetre, geogSrcCRS));
+
+ // Try to find a representative value for the accuracy of this grid
+ // from the registered transformations.
+ std::vector<metadata::PositionalAccuracyNNPtr> accuracies;
+ const auto &modelAccuracies = model->coordinateOperationAccuracies();
+ if (modelAccuracies.empty()) {
+ const auto &authFactory = context.context->getAuthorityFactory();
+ if (authFactory) {
+ const auto transformationsForGrid =
+ io::DatabaseContext::getTransformationsForGridName(
+ authFactory->databaseContext(), projFilename);
+ double accuracy = -1;
+ for (const auto &transf : transformationsForGrid) {
+ accuracy = std::max(accuracy, getAccuracy(transf));
+ }
+ if (accuracy >= 0) {
+ accuracies.emplace_back(
+ metadata::PositionalAccuracy::create(
+ toString(accuracy)));
+ }
+ }
+ }
+
return Transformation::createGravityRelatedHeightToGeographic3D(
- properties, vertCRSMetre, geogSrcCRS, nullptr, projFilename, {});
+ properties, vertCRSMetre, geogSrcCRS, nullptr, projFilename,
+ !modelAccuracies.empty() ? modelAccuracies : accuracies);
};
std::vector<CoordinateOperationNNPtr> res;