diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2020-08-26 20:10:22 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-26 20:10:22 +0200 |
| commit | ef48acb4ab6e3426ac66f37a6477521d7b7be6d3 (patch) | |
| tree | 3184c8908d7325ff2c69b59251810a00f6a18ae5 /src/iso19111/coordinateoperation.cpp | |
| parent | 683d3097ff2cabd573a82757e8bef6d8f0447d37 (diff) | |
| parent | 138555c2491a70428d3c8c82fdf9bb778ad0ae62 (diff) | |
| download | PROJ-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.cpp | 29 |
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; |
