diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-04-16 19:26:16 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-04-16 21:03:19 +0200 |
| commit | d9e2a15f2e17b6710ccffa3e271595e006ceadf2 (patch) | |
| tree | dd69a0bb125a8b4759bd8d1a0d38d1ae56b568bf /include | |
| parent | c16c23addf48fcb3c87e18bcfd4ebcf0d873a30d (diff) | |
| download | PROJ-d9e2a15f2e17b6710ccffa3e271595e006ceadf2.tar.gz PROJ-d9e2a15f2e17b6710ccffa3e271595e006ceadf2.zip | |
createOperations(): do not attempt using a unrelated datum intermediate when doing geog2D<-->geog3D conversions of same datum
Seen when testing transformations between "CR 05" (EPSG:5365) and "CR-SIRGAS" (EPSG:8907)
which require going through their corresponding 3D GeogCRS to find a Helmert
transformation.
Diffstat (limited to 'include')
| -rw-r--r-- | include/proj/coordinateoperation.hpp | 15 | ||||
| -rw-r--r-- | include/proj/internal/coordinateoperation_internal.hpp | 18 |
2 files changed, 31 insertions, 2 deletions
diff --git a/include/proj/coordinateoperation.hpp b/include/proj/coordinateoperation.hpp index 9e7812c7..994cbab2 100644 --- a/include/proj/coordinateoperation.hpp +++ b/include/proj/coordinateoperation.hpp @@ -154,6 +154,12 @@ class PROJ_GCC_DLL CoordinateOperation : public common::ObjectUsage, PROJ_DLL CoordinateOperationNNPtr normalizeForVisualization() const; + PROJ_PRIVATE : + //! @cond Doxygen_Suppress + PROJ_FOR_TEST CoordinateOperationNNPtr + shallowClone() const; + //! @endcond + protected: PROJ_INTERNAL CoordinateOperation(); PROJ_INTERNAL CoordinateOperation(const CoordinateOperation &other); @@ -179,6 +185,8 @@ class PROJ_GCC_DLL CoordinateOperation : public common::ObjectUsage, setProperties(const util::PropertyMap &properties); // throw(InvalidValueTypeException) + PROJ_INTERNAL virtual CoordinateOperationNNPtr _shallowClone() const = 0; + private: PROJ_OPAQUE_PRIVATE_DATA CoordinateOperation &operator=(const CoordinateOperation &other) = delete; @@ -1328,6 +1336,8 @@ class PROJ_GCC_DLL Conversion : public SingleOperation { PROJ_FRIEND(crs::ProjectedCRS); PROJ_INTERNAL bool addWKTExtensionNode(io::WKTFormatter *formatter) const; + PROJ_INTERNAL CoordinateOperationNNPtr _shallowClone() const override; + private: PROJ_OPAQUE_PRIVATE_DATA Conversion &operator=(const Conversion &other) = delete; @@ -1543,6 +1553,8 @@ class PROJ_GCC_DLL Transformation : public SingleOperation { PROJ_INTERNAL TransformationNNPtr inverseAsTransformation() const; + PROJ_INTERNAL CoordinateOperationNNPtr _shallowClone() const override; + private: PROJ_OPAQUE_PRIVATE_DATA }; @@ -1634,12 +1646,15 @@ class PROJ_GCC_DLL ConcatenatedOperation final : public CoordinateOperation { //! @endcond protected: + PROJ_INTERNAL ConcatenatedOperation(const ConcatenatedOperation &other); PROJ_INTERNAL explicit ConcatenatedOperation( const std::vector<CoordinateOperationNNPtr> &operationsIn); PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter) const override; // throw(FormattingException) + PROJ_INTERNAL CoordinateOperationNNPtr _shallowClone() const override; + INLINED_MAKE_SHARED private: diff --git a/include/proj/internal/coordinateoperation_internal.hpp b/include/proj/internal/coordinateoperation_internal.hpp index 680e805e..207c20b4 100644 --- a/include/proj/internal/coordinateoperation_internal.hpp +++ b/include/proj/internal/coordinateoperation_internal.hpp @@ -109,8 +109,9 @@ using InverseCoordinateOperationNNPtr = util::nn<InverseCoordinateOperationPtr>; */ class InverseCoordinateOperation : virtual public CoordinateOperation { public: - InverseCoordinateOperation(const CoordinateOperationNNPtr &forwardOperation, - bool wktSupportsInversion); + InverseCoordinateOperation( + const CoordinateOperationNNPtr &forwardOperationIn, + bool wktSupportsInversion); ~InverseCoordinateOperation() override; @@ -124,6 +125,10 @@ class InverseCoordinateOperation : virtual public CoordinateOperation { CoordinateOperationNNPtr inverse() const override; + const CoordinateOperationNNPtr &forwardOperation() const { + return forwardOperation_; + } + protected: CoordinateOperationNNPtr forwardOperation_; bool wktSupportsInversion_; @@ -174,6 +179,8 @@ class InverseConversion : public Conversion, public InverseCoordinateOperation { #endif static CoordinateOperationNNPtr create(const ConversionNNPtr &forward); + + CoordinateOperationNNPtr _shallowClone() const override; }; // --------------------------------------------------------------------------- @@ -204,6 +211,8 @@ class InverseTransformation : public Transformation, return InverseCoordinateOperation::inverse(); } + TransformationNNPtr inverseAsTransformation() const; + #ifdef _MSC_VER // To avoid a warning C4250: // 'osgeo::proj::operation::InverseTransformation': inherits @@ -216,6 +225,8 @@ class InverseTransformation : public Transformation, #endif static TransformationNNPtr create(const TransformationNNPtr &forward); + + CoordinateOperationNNPtr _shallowClone() const override; }; // --------------------------------------------------------------------------- @@ -253,11 +264,14 @@ class PROJBasedOperation : public SingleOperation { gridsNeeded(const io::DatabaseContextPtr &databaseContext) const override; protected: + PROJBasedOperation(const PROJBasedOperation &) = default; explicit PROJBasedOperation(const OperationMethodNNPtr &methodIn); void _exportToPROJString(io::PROJStringFormatter *formatter) const override; // throw(FormattingException) + CoordinateOperationNNPtr _shallowClone() const override; + INLINED_MAKE_SHARED private: |
