From 6d2af0904652baba69ec81261c914e9b68221dac Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 16 Jan 2019 17:17:54 +0100 Subject: PROJBasedOperation: write it as a conformant CONVERSION WKT, and make it parsed appropriately on the reading side --- src/iso19111/coordinateoperation.cpp | 50 +++++++++++------------------------- src/iso19111/io.cpp | 16 ++++++++++-- 2 files changed, 29 insertions(+), 37 deletions(-) (limited to 'src') diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp index 47f10392..cc212314 100644 --- a/src/iso19111/coordinateoperation.cpp +++ b/src/iso19111/coordinateoperation.cpp @@ -11788,33 +11788,22 @@ PROJBasedOperation::~PROJBasedOperation() = default; // --------------------------------------------------------------------------- -PROJBasedOperation::PROJBasedOperation( - const OperationMethodNNPtr &methodIn, - const std::vector &values) - : SingleOperation(methodIn) { - setParameterValues(values); -} +PROJBasedOperation::PROJBasedOperation(const OperationMethodNNPtr &methodIn) + : SingleOperation(methodIn) {} // --------------------------------------------------------------------------- -static const std::string PROJSTRING_PARAMETER_NAME("PROJ string"); - PROJBasedOperationNNPtr PROJBasedOperation::create( const util::PropertyMap &properties, const std::string &PROJString, const crs::CRSPtr &sourceCRS, const crs::CRSPtr &targetCRS, const std::vector &accuracies) { - auto parameter = OperationParameter::create(util::PropertyMap().set( - common::IdentifiedObject::NAME_KEY, PROJSTRING_PARAMETER_NAME)); auto method = OperationMethod::create( util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, - "PROJ-based operation method"), - std::vector{parameter}); - std::vector values; - values.push_back(OperationParameterValue::create( - parameter, ParameterValue::create(PROJString))); - auto op = - PROJBasedOperation::nn_make_shared(method, values); + "PROJ-based operation method: " + PROJString), + std::vector{}); + auto op = PROJBasedOperation::nn_make_shared(method); op->assignSelf(op); + op->projString_ = PROJString; if (sourceCRS && targetCRS) { op->setCRSs(NN_NO_CHECK(sourceCRS), NN_NO_CHECK(targetCRS), nullptr); } @@ -11826,21 +11815,11 @@ PROJBasedOperationNNPtr PROJBasedOperation::create( // --------------------------------------------------------------------------- -static const std::string - APPROX_PROJSTRING_PARAMETER_NAME("(Approximte) PROJ string"); - PROJBasedOperationNNPtr PROJBasedOperation::create( const util::PropertyMap &properties, const io::IPROJStringExportableNNPtr &projExportable, bool inverse, const crs::CRSNNPtr &sourceCRS, const crs::CRSNNPtr &targetCRS, const std::vector &accuracies) { - auto parameter = OperationParameter::create(util::PropertyMap().set( - common::IdentifiedObject::NAME_KEY, APPROX_PROJSTRING_PARAMETER_NAME)); - auto method = OperationMethod::create( - util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, - "PROJ-based operation method"), - std::vector{parameter}); - std::vector values; auto formatter = io::PROJStringFormatter::create(); if (inverse) { @@ -11852,11 +11831,14 @@ PROJBasedOperationNNPtr PROJBasedOperation::create( } auto projString = formatter->toString(); - values.push_back(OperationParameterValue::create( - parameter, ParameterValue::create(projString))); - auto op = - PROJBasedOperation::nn_make_shared(method, values); + auto method = OperationMethod::create( + util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, + "PROJ-based operation method (approximate) : " + + projString), + std::vector{}); + auto op = PROJBasedOperation::nn_make_shared(method); op->assignSelf(op); + op->projString_ = projString; op->setCRSs(sourceCRS, targetCRS, nullptr); op->setProperties( addDefaultNameIfNeeded(properties, "PROJ-based coordinate operation")); @@ -11882,8 +11864,7 @@ CoordinateOperationNNPtr PROJBasedOperation::inverse() const { auto formatter = io::PROJStringFormatter::create(); formatter->startInversion(); try { - formatter->ingestPROJString( - parameterValue(PROJSTRING_PARAMETER_NAME)->stringValue()); + formatter->ingestPROJString(projString_); } catch (const io::ParsingException &e) { throw util::UnsupportedOperationException( std::string("PROJBasedOperation::inverse() failed: ") + e.what()); @@ -11938,8 +11919,7 @@ void PROJBasedOperation::_exportToPROJString( } try { - formatter->ingestPROJString( - parameterValue(PROJSTRING_PARAMETER_NAME)->stringValue()); + formatter->ingestPROJString(projString_); } catch (const io::ParsingException &e) { throw io::FormattingException( std::string("PROJBasedOperation::exportToPROJString() failed: ") + diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index 13a8f236..5be02ffe 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -4252,8 +4252,20 @@ BaseObjectNNPtr WKTParser::Private::build(const WKTNodeNNPtr &node) { } if (ci_equal(name, WKTConstants::CONVERSION)) { - return util::nn_static_pointer_cast( - buildConversion(node, UnitOfMeasure::METRE, UnitOfMeasure::DEGREE)); + auto conv = + buildConversion(node, UnitOfMeasure::METRE, UnitOfMeasure::DEGREE); + + if (conv->nameStr() == "PROJ-based coordinate operation" && + starts_with(conv->method()->nameStr(), + "PROJ-based operation method: ")) { + auto projString = conv->method()->nameStr().substr( + strlen("PROJ-based operation method: ")); + return util::nn_static_pointer_cast( + PROJBasedOperation::create(PropertyMap(), projString, nullptr, + nullptr, {})); + } + + return util::nn_static_pointer_cast(conv); } if (ci_equal(name, WKTConstants::CONCATENATEDOPERATION)) { -- cgit v1.2.3