aboutsummaryrefslogtreecommitdiff
path: root/include/proj/crs.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/proj/crs.hpp')
-rw-r--r--include/proj/crs.hpp1361
1 files changed, 1361 insertions, 0 deletions
diff --git a/include/proj/crs.hpp b/include/proj/crs.hpp
new file mode 100644
index 00000000..252c90e3
--- /dev/null
+++ b/include/proj/crs.hpp
@@ -0,0 +1,1361 @@
+/******************************************************************************
+ *
+ * Project: PROJ
+ * Purpose: ISO19111:2018 implementation
+ * Author: Even Rouault <even dot rouault at spatialys dot com>
+ *
+ ******************************************************************************
+ * Copyright (c) 2018, Even Rouault <even dot rouault at spatialys dot com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+#ifndef CRS_HH_INCLUDED
+#define CRS_HH_INCLUDED
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "common.hpp"
+#include "coordinateoperation.hpp"
+#include "coordinatesystem.hpp"
+#include "datum.hpp"
+#include "io.hpp"
+#include "util.hpp"
+
+NS_PROJ_START
+
+/** osgeo.proj.crs namespace
+
+ \brief CRS (coordinate reference system = coordinate system with a datum).
+*/
+namespace crs {
+
+// ---------------------------------------------------------------------------
+
+class GeographicCRS;
+/** Shared pointer of GeographicCRS */
+using GeographicCRSPtr = std::shared_ptr<GeographicCRS>;
+/** Non-null shared pointer of GeographicCRS */
+using GeographicCRSNNPtr = util::nn<GeographicCRSPtr>;
+
+class VerticalCRS;
+/** Shared pointer of VerticalCRS */
+using VerticalCRSPtr = std::shared_ptr<VerticalCRS>;
+/** Non-null shared pointer of VerticalCRS */
+using VerticalCRSNNPtr = util::nn<VerticalCRSPtr>;
+
+class BoundCRS;
+/** Shared pointer of BoundCRS */
+using BoundCRSPtr = std::shared_ptr<BoundCRS>;
+/** Non-null shared pointer of BoundCRS */
+using BoundCRSNNPtr = util::nn<BoundCRSPtr>;
+
+// ---------------------------------------------------------------------------
+
+class CRS;
+/** Shared pointer of CRS */
+using CRSPtr = std::shared_ptr<CRS>;
+/** Non-null shared pointer of CRS */
+using CRSNNPtr = util::nn<CRSPtr>;
+
+/** \brief Abstract class modelling a coordinate reference system which is
+ * usually single but may be compound.
+ *
+ * \remark Implements CRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL CRS : public common::ObjectUsage {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~CRS() override;
+ //! @endcond
+
+ // Non-standard
+
+ PROJ_DLL GeodeticCRSPtr extractGeodeticCRS() const;
+ PROJ_DLL GeographicCRSPtr extractGeographicCRS() const;
+ PROJ_DLL VerticalCRSPtr extractVerticalCRS() const;
+ PROJ_DLL CRSNNPtr createBoundCRSToWGS84IfPossible(
+ const io::DatabaseContextPtr &dbContext) const;
+ PROJ_DLL CRSNNPtr stripVerticalComponent() const;
+
+ PROJ_DLL const BoundCRSPtr &canonicalBoundCRS() PROJ_CONST_DECL;
+
+ PROJ_DLL std::list<std::pair<CRSNNPtr, int>>
+ identify(const io::AuthorityFactoryPtr &authorityFactory) const;
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL const GeodeticCRS *
+ extractGeodeticCRSRaw() const;
+
+ PROJ_FOR_TEST CRSNNPtr shallowClone() const;
+
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL CRS();
+ PROJ_INTERNAL CRS(const CRS &other);
+ friend class BoundCRS;
+ PROJ_INTERNAL void setCanonicalBoundCRS(const BoundCRSNNPtr &boundCRS);
+
+ PROJ_INTERNAL virtual CRSNNPtr _shallowClone() const = 0;
+
+ PROJ_INTERNAL virtual std::list<std::pair<CRSNNPtr, int>>
+ _identify(const io::AuthorityFactoryPtr &authorityFactory) const;
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Abstract class modelling a coordinate reference system consisting of
+ * one Coordinate System and either one datum::Datum or one
+ * datum::DatumEnsemble.
+ *
+ * \remark Implements SingleCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL SingleCRS : public CRS {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~SingleCRS() override;
+ //! @endcond
+
+ PROJ_DLL const datum::DatumPtr &datum() PROJ_CONST_DECL;
+ PROJ_DLL const datum::DatumEnsemblePtr &datumEnsemble() PROJ_CONST_DECL;
+ PROJ_DLL const cs::CoordinateSystemNNPtr &
+ coordinateSystem() PROJ_CONST_DECL;
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void
+ exportDatumOrDatumEnsembleToWkt(io::WKTFormatter *formatter)
+ const; // throw(io::FormattingException)
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL SingleCRS(const datum::DatumPtr &datumIn,
+ const datum::DatumEnsemblePtr &datumEnsembleIn,
+ const cs::CoordinateSystemNNPtr &csIn);
+ PROJ_INTERNAL SingleCRS(const SingleCRS &other);
+
+ PROJ_INTERNAL bool
+ baseIsEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const;
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ SingleCRS &operator=(const SingleCRS &other) = delete;
+};
+
+/** Shared pointer of SingleCRS */
+using SingleCRSPtr = std::shared_ptr<SingleCRS>;
+/** Non-null shared pointer of SingleCRS */
+using SingleCRSNNPtr = util::nn<SingleCRSPtr>;
+
+// ---------------------------------------------------------------------------
+
+class GeodeticCRS;
+/** Shared pointer of GeodeticCRS */
+using GeodeticCRSPtr = std::shared_ptr<GeodeticCRS>;
+/** Non-null shared pointer of GeodeticCRS */
+using GeodeticCRSNNPtr = util::nn<GeodeticCRSPtr>;
+
+/** \brief A coordinate reference system associated with a geodetic reference
+ * frame and a three-dimensional Cartesian or spherical coordinate system.
+ *
+ * If the geodetic reference frame is dynamic or if the geodetic CRS has an
+ * association to a velocity model then the geodetic CRS is dynamic, else it
+ * is static.
+ *
+ * \remark Implements GeodeticCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL GeodeticCRS : virtual public SingleCRS,
+ public io::IPROJStringExportable {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~GeodeticCRS() override;
+ //! @endcond
+
+ PROJ_DLL const datum::GeodeticReferenceFramePtr &datum() PROJ_CONST_DECL;
+
+ PROJ_DLL const datum::PrimeMeridianNNPtr &primeMeridian() PROJ_CONST_DECL;
+ PROJ_DLL const datum::EllipsoidNNPtr &ellipsoid() PROJ_CONST_DECL;
+
+ // coordinateSystem() returns either a EllipsoidalCS, SphericalCS or
+ // CartesianCS
+
+ PROJ_DLL const std::vector<operation::PointMotionOperationNNPtr> &
+ velocityModel() PROJ_CONST_DECL;
+
+ // Non-standard
+
+ PROJ_DLL bool isGeocentric() PROJ_CONST_DECL;
+
+ PROJ_DLL static GeodeticCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::GeodeticReferenceFrameNNPtr &datum,
+ const cs::SphericalCSNNPtr &cs);
+
+ PROJ_DLL static GeodeticCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::GeodeticReferenceFrameNNPtr &datum,
+ const cs::CartesianCSNNPtr &cs);
+
+ PROJ_DLL static GeodeticCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::GeodeticReferenceFramePtr &datum,
+ const datum::DatumEnsemblePtr &datumEnsemble,
+ const cs::SphericalCSNNPtr &cs);
+
+ PROJ_DLL static GeodeticCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::GeodeticReferenceFramePtr &datum,
+ const datum::DatumEnsemblePtr &datumEnsemble,
+ const cs::CartesianCSNNPtr &cs);
+
+ PROJ_DLL static const GeodeticCRSNNPtr EPSG_4978; // WGS 84 Geocentric
+
+ PROJ_DLL std::list<std::pair<GeodeticCRSNNPtr, int>>
+ identify(const io::AuthorityFactoryPtr &authorityFactory) const;
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void
+ addDatumInfoToPROJString(io::PROJStringFormatter *formatter) const;
+
+ PROJ_INTERNAL void addGeocentricUnitConversionIntoPROJString(
+ io::PROJStringFormatter *formatter) const;
+
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL GeodeticCRS(const datum::GeodeticReferenceFramePtr &datumIn,
+ const datum::DatumEnsemblePtr &datumEnsembleIn,
+ const cs::EllipsoidalCSNNPtr &csIn);
+ PROJ_INTERNAL GeodeticCRS(const datum::GeodeticReferenceFramePtr &datumIn,
+ const datum::DatumEnsemblePtr &datumEnsembleIn,
+ const cs::SphericalCSNNPtr &csIn);
+ PROJ_INTERNAL GeodeticCRS(const datum::GeodeticReferenceFramePtr &datumIn,
+ const datum::DatumEnsemblePtr &datumEnsembleIn,
+ const cs::CartesianCSNNPtr &csIn);
+ PROJ_INTERNAL GeodeticCRS(const GeodeticCRS &other);
+
+ PROJ_INTERNAL static GeodeticCRSNNPtr createEPSG_4978();
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL std::list<std::pair<CRSNNPtr, int>>
+ _identify(const io::AuthorityFactoryPtr &authorityFactory) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+
+ GeodeticCRS &operator=(const GeodeticCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief A coordinate reference system associated with a geodetic reference
+ * frame and a two- or three-dimensional ellipsoidal coordinate system.
+ *
+ * If the geodetic reference frame is dynamic or if the geographic CRS has an
+ * association to a velocity model then the geodetic CRS is dynamic, else it is
+ * static.
+ *
+ * \remark Implements GeographicCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL GeographicCRS : public GeodeticCRS {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~GeographicCRS() override;
+ //! @endcond
+
+ PROJ_DLL const cs::EllipsoidalCSNNPtr &coordinateSystem() PROJ_CONST_DECL;
+
+ // Non-standard
+ PROJ_DLL static GeographicCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::GeodeticReferenceFrameNNPtr &datum,
+ const cs::EllipsoidalCSNNPtr &cs);
+ PROJ_DLL static GeographicCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::GeodeticReferenceFramePtr &datum,
+ const datum::DatumEnsemblePtr &datumEnsemble,
+ const cs::EllipsoidalCSNNPtr &cs);
+
+ PROJ_DLL static const GeographicCRSNNPtr EPSG_4267; // NAD27
+ PROJ_DLL static const GeographicCRSNNPtr EPSG_4269; // NAD83
+ PROJ_DLL static const GeographicCRSNNPtr EPSG_4326; // WGS 84 2D
+ PROJ_DLL static const GeographicCRSNNPtr OGC_CRS84; // CRS84 (Long, Lat)
+ PROJ_DLL static const GeographicCRSNNPtr EPSG_4807; // NTF Paris
+ PROJ_DLL static const GeographicCRSNNPtr EPSG_4979; // WGS 84 3D
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void
+ addAngularUnitConvertAndAxisSwap(
+ io::PROJStringFormatter *formatter) const;
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_DLL bool
+ is2DPartOf3D(util::nn<const GeographicCRS *> other) PROJ_CONST_DECL;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL GeographicCRS(const datum::GeodeticReferenceFramePtr &datumIn,
+ const datum::DatumEnsemblePtr &datumEnsembleIn,
+ const cs::EllipsoidalCSNNPtr &csIn);
+ PROJ_INTERNAL GeographicCRS(const GeographicCRS &other);
+
+ PROJ_INTERNAL static GeographicCRSNNPtr createEPSG_4267();
+ PROJ_INTERNAL static GeographicCRSNNPtr createEPSG_4269();
+ PROJ_INTERNAL static GeographicCRSNNPtr createEPSG_4326();
+ PROJ_INTERNAL static GeographicCRSNNPtr createOGC_CRS84();
+ PROJ_INTERNAL static GeographicCRSNNPtr createEPSG_4807();
+ PROJ_INTERNAL static GeographicCRSNNPtr createEPSG_4979();
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+
+ GeographicCRS &operator=(const GeographicCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief A coordinate reference system having a vertical reference frame and
+ * a one-dimensional vertical coordinate system used for recording
+ * gravity-related heights or depths.
+ *
+ * Vertical CRSs make use of the direction of gravity to define the concept of
+ * height or depth, but the relationship with gravity may not be
+ * straightforward. If the vertical reference frame is dynamic or if the
+ * vertical CRS has an association to a velocity model then the CRS is dynamic,
+ * else it is static.
+ *
+ * \note Ellipsoidal heights cannot be captured in a vertical coordinate
+ * reference system. They exist only as an inseparable part of a 3D coordinate
+ * tuple defined in a geographic 3D coordinate reference system.
+ *
+ * \remark Implements VerticalCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL VerticalCRS : virtual public SingleCRS,
+ public io::IPROJStringExportable {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~VerticalCRS() override;
+ //! @endcond
+
+ PROJ_DLL const datum::VerticalReferenceFramePtr datum() const;
+ PROJ_DLL const cs::VerticalCSNNPtr coordinateSystem() const;
+ PROJ_DLL const std::vector<operation::TransformationNNPtr> &
+ geoidModel() PROJ_CONST_DECL;
+ PROJ_DLL const std::vector<operation::PointMotionOperationNNPtr> &
+ velocityModel() PROJ_CONST_DECL;
+
+ PROJ_DLL static VerticalCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::VerticalReferenceFrameNNPtr &datumIn,
+ const cs::VerticalCSNNPtr &csIn);
+
+ PROJ_DLL static VerticalCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::VerticalReferenceFramePtr &datumIn,
+ const datum::DatumEnsemblePtr &datumEnsembleIn,
+ const cs::VerticalCSNNPtr &csIn);
+
+ PROJ_DLL std::list<std::pair<VerticalCRSNNPtr, int>>
+ identify(const io::AuthorityFactoryPtr &authorityFactory) const;
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void
+ addLinearUnitConvert(io::PROJStringFormatter *formatter) const;
+
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL VerticalCRS(const datum::VerticalReferenceFramePtr &datumIn,
+ const datum::DatumEnsemblePtr &datumEnsembleIn,
+ const cs::VerticalCSNNPtr &csIn);
+ PROJ_INTERNAL VerticalCRS(const VerticalCRS &other);
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_INTERNAL std::list<std::pair<CRSNNPtr, int>>
+ _identify(const io::AuthorityFactoryPtr &authorityFactory) const override;
+
+ INLINED_MAKE_SHARED
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ VerticalCRS &operator=(const VerticalCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Abstract class modelling a single coordinate reference system that
+ * is defined through the application of a specified coordinate conversion to
+ * the definition of a previously established single coordinate reference
+ * system referred to as the base CRS.
+ *
+ * A derived coordinate reference system inherits its datum (or datum ensemble)
+ * from its base CRS. The coordinate conversion between the base and derived
+ * coordinate reference system is implemented using the parameters and
+ * formula(s) specified in the definition of the coordinate conversion.
+ *
+ * \remark Implements DerivedCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL DerivedCRS : virtual public SingleCRS {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~DerivedCRS() override;
+ //! @endcond
+
+ PROJ_DLL const SingleCRSNNPtr &baseCRS() PROJ_CONST_DECL;
+ PROJ_DLL const operation::ConversionNNPtr derivingConversion() const;
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ const operation::ConversionNNPtr &
+ derivingConversionRef() PROJ_CONST_DECL;
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL
+ DerivedCRS(const SingleCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::CoordinateSystemNNPtr &cs);
+ PROJ_INTERNAL DerivedCRS(const DerivedCRS &other);
+
+ PROJ_INTERNAL void setDerivingConversionCRS();
+
+ PROJ_INTERNAL void baseExportToPROJString(
+ io::PROJStringFormatter *formatter) const; // throw(FormattingException)
+
+ PROJ_INTERNAL void baseExportToWKT(
+ io::WKTFormatter *&formatter, const std::string &keyword,
+ const std::string &baseKeyword) const; // throw(FormattingException)
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ DerivedCRS &operator=(const DerivedCRS &other) = delete;
+};
+
+/** Shared pointer of DerivedCRS */
+using DerivedCRSPtr = std::shared_ptr<DerivedCRS>;
+/** Non-null shared pointer of DerivedCRS */
+using DerivedCRSNNPtr = util::nn<DerivedCRSPtr>;
+
+// ---------------------------------------------------------------------------
+
+class ProjectedCRS;
+/** Shared pointer of ProjectedCRS */
+using ProjectedCRSPtr = std::shared_ptr<ProjectedCRS>;
+/** Non-null shared pointer of ProjectedCRS */
+using ProjectedCRSNNPtr = util::nn<ProjectedCRSPtr>;
+
+/** \brief A derived coordinate reference system which has a geodetic
+ * (usually geographic) coordinate reference system as its base CRS, thereby
+ * inheriting a geodetic reference frame, and is converted using a map
+ * projection.
+ *
+ * It has a Cartesian coordinate system, usually two-dimensional but may be
+ * three-dimensional; in the 3D case the base geographic CRSs ellipsoidal
+ * height is passed through unchanged and forms the vertical axis of the
+ * projected CRS's Cartesian coordinate system.
+ *
+ * \remark Implements ProjectedCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL ProjectedCRS final : public DerivedCRS,
+ public io::IPROJStringExportable {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~ProjectedCRS() override;
+ //! @endcond
+
+ PROJ_DLL const GeodeticCRSNNPtr &baseCRS() PROJ_CONST_DECL;
+ PROJ_DLL const cs::CartesianCSNNPtr &coordinateSystem() PROJ_CONST_DECL;
+
+ PROJ_DLL static ProjectedCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const GeodeticCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::CartesianCSNNPtr &csIn);
+
+ PROJ_DLL std::list<std::pair<ProjectedCRSNNPtr, int>>
+ identify(const io::AuthorityFactoryPtr &authorityFactory) const;
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void
+ addUnitConvertAndAxisSwap(io::PROJStringFormatter *formatter,
+ bool axisSpecFound) const;
+
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL
+ ProjectedCRS(const GeodeticCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::CartesianCSNNPtr &csIn);
+ PROJ_INTERNAL ProjectedCRS(const ProjectedCRS &other);
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ PROJ_INTERNAL std::list<std::pair<CRSNNPtr, int>>
+ _identify(const io::AuthorityFactoryPtr &authorityFactory) const override;
+
+ INLINED_MAKE_SHARED
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ ProjectedCRS &operator=(const ProjectedCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class TemporalCRS;
+/** Shared pointer of TemporalCRS */
+using TemporalCRSPtr = std::shared_ptr<TemporalCRS>;
+/** Non-null shared pointer of TemporalCRS */
+using TemporalCRSNNPtr = util::nn<TemporalCRSPtr>;
+
+/** \brief A coordinate reference system associated with a temporal datum and a
+ * one-dimensional temporal coordinate system.
+ *
+ * \remark Implements TemporalCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL TemporalCRS : virtual public SingleCRS {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~TemporalCRS() override;
+ //! @endcond
+
+ PROJ_DLL const datum::TemporalDatumNNPtr datum() const;
+
+ PROJ_DLL const cs::TemporalCSNNPtr coordinateSystem() const;
+
+ PROJ_DLL static TemporalCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::TemporalDatumNNPtr &datumIn,
+ const cs::TemporalCSNNPtr &csIn);
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL TemporalCRS(const datum::TemporalDatumNNPtr &datumIn,
+ const cs::TemporalCSNNPtr &csIn);
+ PROJ_INTERNAL TemporalCRS(const TemporalCRS &other);
+
+ INLINED_MAKE_SHARED
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ TemporalCRS &operator=(const TemporalCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class EngineeringCRS;
+/** Shared pointer of EngineeringCRS */
+using EngineeringCRSPtr = std::shared_ptr<EngineeringCRS>;
+/** Non-null shared pointer of EngineeringCRS */
+using EngineeringCRSNNPtr = util::nn<EngineeringCRSPtr>;
+
+/** \brief Contextually local coordinate reference system associated with an
+ * engineering datum.
+ *
+ * It is applied either to activities on or near the surface of the Earth
+ * without geodetic corrections, or on moving platforms such as road vehicles,
+ * vessels, aircraft or spacecraft, or as the internal CRS of an image.
+ *
+ * In \ref WKT2, it maps to a ENGINEERINGCRS / ENGCRS keyword. In \ref WKT1,
+ * it maps to a LOCAL_CS keyword.
+ *
+ * \remark Implements EngineeringCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL EngineeringCRS : virtual public SingleCRS {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~EngineeringCRS() override;
+ //! @endcond
+
+ PROJ_DLL const datum::EngineeringDatumNNPtr datum() const;
+
+ PROJ_DLL static EngineeringCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::EngineeringDatumNNPtr &datumIn,
+ const cs::CoordinateSystemNNPtr &csIn);
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL EngineeringCRS(const datum::EngineeringDatumNNPtr &datumIn,
+ const cs::CoordinateSystemNNPtr &csIn);
+ PROJ_INTERNAL EngineeringCRS(const EngineeringCRS &other);
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ EngineeringCRS &operator=(const EngineeringCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class ParametricCRS;
+/** Shared pointer of ParametricCRS */
+using ParametricCRSPtr = std::shared_ptr<ParametricCRS>;
+/** Non-null shared pointer of ParametricCRS */
+using ParametricCRSNNPtr = util::nn<ParametricCRSPtr>;
+
+/** \brief Contextually local coordinate reference system associated with an
+ * engineering datum.
+ *
+ * This is applied either to activities on or near the surface of the Earth
+ * without geodetic corrections, or on moving platforms such as road vehicles
+ * vessels, aircraft or spacecraft, or as the internal CRS of an image.
+ *
+ * \remark Implements ParametricCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL ParametricCRS : virtual public SingleCRS {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~ParametricCRS() override;
+ //! @endcond
+
+ PROJ_DLL const datum::ParametricDatumNNPtr datum() const;
+
+ PROJ_DLL const cs::ParametricCSNNPtr coordinateSystem() const;
+
+ PROJ_DLL static ParametricCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const datum::ParametricDatumNNPtr &datumIn,
+ const cs::ParametricCSNNPtr &csIn);
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL ParametricCRS(const datum::ParametricDatumNNPtr &datumIn,
+ const cs::ParametricCSNNPtr &csIn);
+ PROJ_INTERNAL ParametricCRS(const ParametricCRS &other);
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ ParametricCRS &operator=(const ParametricCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class CompoundCRS;
+/** Shared pointer of CompoundCRS */
+using CompoundCRSPtr = std::shared_ptr<CompoundCRS>;
+/** Non-null shared pointer of CompoundCRS */
+using CompoundCRSNNPtr = util::nn<CompoundCRSPtr>;
+
+/** \brief A coordinate reference system describing the position of points
+ * through two or more independent single coordinate reference systems.
+ *
+ * \note Two coordinate reference systems are independent of each other
+ * if coordinate values in one cannot be converted or transformed into
+ * coordinate values in the other.
+ *
+ * \note As a departure to \ref ISO_19111_2018, we allow to build a CompoundCRS
+ * from CRS objects, whereas ISO19111:2018 restricts the components to
+ * SingleCRS.
+ *
+ * \remark Implements CompoundCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL CompoundCRS final : public CRS,
+ public io::IPROJStringExportable {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~CompoundCRS() override;
+ //! @endcond
+
+ PROJ_DLL const std::vector<CRSNNPtr> &
+ componentReferenceSystems() PROJ_CONST_DECL;
+
+ PROJ_DLL std::list<std::pair<CompoundCRSNNPtr, int>>
+ identify(const io::AuthorityFactoryPtr &authorityFactory) const;
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ PROJ_DLL static CompoundCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const std::vector<CRSNNPtr> &components);
+
+ protected:
+ // relaxed: standard say SingleCRSNNPtr
+ PROJ_INTERNAL explicit CompoundCRS(const std::vector<CRSNNPtr> &components);
+ PROJ_INTERNAL CompoundCRS(const CompoundCRS &other);
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ PROJ_INTERNAL std::list<std::pair<CRSNNPtr, int>>
+ _identify(const io::AuthorityFactoryPtr &authorityFactory) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ CompoundCRS &operator=(const CompoundCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief A coordinate reference system with an associated transformation to
+ * a target/hub CRS.
+ *
+ * The definition of a CRS is not dependent upon any relationship to an
+ * independent CRS. However in an implementation that merges datasets
+ * referenced to differing CRSs, it is sometimes useful to associate the
+ * definition of the transformation that has been used with the CRS definition.
+ * This facilitates the interrelationship of CRS by concatenating
+ * transformations via a common or hub CRS. This is sometimes referred to as
+ * "early-binding". \ref WKT2 permits the association of an abridged coordinate
+ * transformation description with a coordinate reference system description in
+ * a single text string. In a BoundCRS, the abridged coordinate transformation
+ * is applied to the source CRS with the target CRS being the common or hub
+ * system.
+ *
+ * Coordinates referring to a BoundCRS are expressed into its source/base CRS.
+ *
+ * This abstraction can for example model the concept of TOWGS84 datum shift
+ * present in \ref WKT1.
+ *
+ * \note Contrary to other CRS classes of this package, there is no
+ * \ref ISO_19111_2018 modelling of a BoundCRS.
+ *
+ * \remark Implements BoundCRS from \ref WKT2
+ */
+class PROJ_GCC_DLL BoundCRS final : public CRS,
+ public io::IPROJStringExportable {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~BoundCRS() override;
+ //! @endcond
+
+ PROJ_DLL const CRSNNPtr &baseCRS() PROJ_CONST_DECL;
+ PROJ_DLL CRSNNPtr baseCRSWithCanonicalBoundCRS() const;
+
+ PROJ_DLL const CRSNNPtr &hubCRS() PROJ_CONST_DECL;
+ PROJ_DLL const operation::TransformationNNPtr &
+ transformation() PROJ_CONST_DECL;
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ PROJ_DLL static BoundCRSNNPtr
+ create(const CRSNNPtr &baseCRSIn, const CRSNNPtr &hubCRSIn,
+ const operation::TransformationNNPtr &transformationIn);
+
+ PROJ_DLL static BoundCRSNNPtr
+ createFromTOWGS84(const CRSNNPtr &baseCRSIn,
+ const std::vector<double> &TOWGS84Parameters);
+
+ PROJ_DLL static BoundCRSNNPtr
+ createFromNadgrids(const CRSNNPtr &baseCRSIn, const std::string &filename);
+
+ protected:
+ PROJ_INTERNAL
+ BoundCRS(const CRSNNPtr &baseCRSIn, const CRSNNPtr &hubCRSIn,
+ const operation::TransformationNNPtr &transformationIn);
+ PROJ_INTERNAL BoundCRS(const BoundCRS &other);
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ PROJ_INTERNAL BoundCRSNNPtr shallowCloneAsBoundCRS() const;
+ PROJ_INTERNAL bool isTOWGS84Compatible() const;
+ PROJ_INTERNAL std::string getHDatumPROJ4GRIDS() const;
+ PROJ_INTERNAL std::string getVDatumPROJ4GRIDS() const;
+
+ PROJ_INTERNAL std::list<std::pair<CRSNNPtr, int>>
+ _identify(const io::AuthorityFactoryPtr &authorityFactory) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ BoundCRS &operator=(const BoundCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class DerivedGeodeticCRS;
+/** Shared pointer of DerivedGeodeticCRS */
+using DerivedGeodeticCRSPtr = std::shared_ptr<DerivedGeodeticCRS>;
+/** Non-null shared pointer of DerivedGeodeticCRS */
+using DerivedGeodeticCRSNNPtr = util::nn<DerivedGeodeticCRSPtr>;
+
+/** \brief A derived coordinate reference system which has either a geodetic
+ * or a geographic coordinate reference system as its base CRS, thereby
+ * inheriting a geodetic reference frame, and associated with a 3D Cartesian
+ * or spherical coordinate system.
+ *
+ * \remark Implements DerivedGeodeticCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL DerivedGeodeticCRS final : public GeodeticCRS,
+ public DerivedCRS {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~DerivedGeodeticCRS() override;
+ //! @endcond
+
+ PROJ_DLL const GeodeticCRSNNPtr baseCRS() const;
+
+ PROJ_DLL static DerivedGeodeticCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const GeodeticCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::CartesianCSNNPtr &csIn);
+
+ PROJ_DLL static DerivedGeodeticCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const GeodeticCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::SphericalCSNNPtr &csIn);
+
+ //! @cond Doxygen_Suppress
+ void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL
+ DerivedGeodeticCRS(const GeodeticCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::CartesianCSNNPtr &csIn);
+ PROJ_INTERNAL
+ DerivedGeodeticCRS(const GeodeticCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::SphericalCSNNPtr &csIn);
+ PROJ_INTERNAL DerivedGeodeticCRS(const DerivedGeodeticCRS &other);
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ PROJ_INTERNAL std::list<std::pair<CRSNNPtr, int>>
+ _identify(const io::AuthorityFactoryPtr &authorityFactory) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ DerivedGeodeticCRS &operator=(const DerivedGeodeticCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class DerivedGeographicCRS;
+/** Shared pointer of DerivedGeographicCRS */
+using DerivedGeographicCRSPtr = std::shared_ptr<DerivedGeographicCRS>;
+/** Non-null shared pointer of DerivedGeographicCRS */
+using DerivedGeographicCRSNNPtr = util::nn<DerivedGeographicCRSPtr>;
+
+/** \brief A derived coordinate reference system which has either a geodetic or
+ * a geographic coordinate reference system as its base CRS, thereby inheriting
+ * a geodetic reference frame, and an ellipsoidal coordinate system.
+ *
+ * A derived geographic CRS can be based on a geodetic CRS only if that
+ * geodetic CRS definition includes an ellipsoid.
+ *
+ * \remark Implements DerivedGeographicCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL DerivedGeographicCRS final : public GeographicCRS,
+ public DerivedCRS {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~DerivedGeographicCRS() override;
+ //! @endcond
+
+ PROJ_DLL const GeodeticCRSNNPtr baseCRS() const;
+
+ PROJ_DLL static DerivedGeographicCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const GeodeticCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::EllipsoidalCSNNPtr &csIn);
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL
+ DerivedGeographicCRS(const GeodeticCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::EllipsoidalCSNNPtr &csIn);
+ PROJ_INTERNAL DerivedGeographicCRS(const DerivedGeographicCRS &other);
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ PROJ_INTERNAL std::list<std::pair<CRSNNPtr, int>>
+ _identify(const io::AuthorityFactoryPtr &authorityFactory) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ DerivedGeographicCRS &operator=(const DerivedGeographicCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class DerivedProjectedCRS;
+/** Shared pointer of DerivedProjectedCRS */
+using DerivedProjectedCRSPtr = std::shared_ptr<DerivedProjectedCRS>;
+/** Non-null shared pointer of DerivedProjectedCRS */
+using DerivedProjectedCRSNNPtr = util::nn<DerivedProjectedCRSPtr>;
+
+/** \brief A derived coordinate reference system which has a projected
+ * coordinate reference system as its base CRS, thereby inheriting a geodetic
+ * reference frame, but also inheriting the distortion characteristics of the
+ * base projected CRS.
+ *
+ * A DerivedProjectedCRS is not a ProjectedCRS.
+ *
+ * \remark Implements DerivedProjectedCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL DerivedProjectedCRS final
+ : public DerivedCRS,
+ public io::IPROJStringExportable {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~DerivedProjectedCRS() override;
+ //! @endcond
+
+ PROJ_DLL const ProjectedCRSNNPtr baseCRS() const;
+
+ PROJ_DLL static DerivedProjectedCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const ProjectedCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::CoordinateSystemNNPtr &csIn);
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL
+ DerivedProjectedCRS(const ProjectedCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::CoordinateSystemNNPtr &csIn);
+ PROJ_INTERNAL DerivedProjectedCRS(const DerivedProjectedCRS &other);
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ DerivedProjectedCRS &operator=(const DerivedProjectedCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class DerivedVerticalCRS;
+/** Shared pointer of DerivedVerticalCRS */
+using DerivedVerticalCRSPtr = std::shared_ptr<DerivedVerticalCRS>;
+/** Non-null shared pointer of DerivedVerticalCRS */
+using DerivedVerticalCRSNNPtr = util::nn<DerivedVerticalCRSPtr>;
+
+/** \brief A derived coordinate reference system which has a vertical
+ * coordinate reference system as its base CRS, thereby inheriting a vertical
+ * reference frame, and a vertical coordinate system.
+ *
+ * \remark Implements DerivedVerticalCRS from \ref ISO_19111_2018
+ */
+class PROJ_GCC_DLL DerivedVerticalCRS final : public VerticalCRS,
+ public DerivedCRS {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~DerivedVerticalCRS() override;
+ //! @endcond
+
+ PROJ_DLL const VerticalCRSNNPtr baseCRS() const;
+
+ PROJ_DLL static DerivedVerticalCRSNNPtr
+ create(const util::PropertyMap &properties,
+ const VerticalCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::VerticalCSNNPtr &csIn);
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL
+ DerivedVerticalCRS(const VerticalCRSNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const cs::VerticalCSNNPtr &csIn);
+ PROJ_INTERNAL DerivedVerticalCRS(const DerivedVerticalCRS &other);
+
+ PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
+ const override; // throw(FormattingException)
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ PROJ_INTERNAL std::list<std::pair<CRSNNPtr, int>>
+ _identify(const io::AuthorityFactoryPtr &authorityFactory) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ DerivedVerticalCRS &operator=(const DerivedVerticalCRS &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Template representing a derived coordinate reference system.
+ */
+template <class DerivedCRSTraits>
+class PROJ_GCC_DLL DerivedCRSTemplate final : public DerivedCRSTraits::BaseType,
+ public DerivedCRS {
+ protected:
+ /** Base type */
+ typedef typename DerivedCRSTraits::BaseType BaseType;
+ /** CSType */
+ typedef typename DerivedCRSTraits::CSType CSType;
+
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~DerivedCRSTemplate() override;
+ //! @endcond
+
+ /** Non-null shared pointer of DerivedCRSTemplate */
+ typedef typename util::nn<std::shared_ptr<DerivedCRSTemplate>> NNPtr;
+ /** Non-null shared pointer of BaseType */
+ typedef util::nn<std::shared_ptr<BaseType>> BaseNNPtr;
+ /** Non-null shared pointer of CSType */
+ typedef util::nn<std::shared_ptr<CSType>> CSNNPtr;
+
+ /** \brief Return the base CRS of a DerivedCRSTemplate.
+ *
+ * @return the base CRS.
+ */
+ PROJ_DLL const BaseNNPtr baseCRS() const;
+
+ /** \brief Instanciate a DerivedCRSTemplate from a base CRS, a deriving
+ * conversion and a cs::CoordinateSystem.
+ *
+ * @param properties See \ref general_properties.
+ * At minimum the name should be defined.
+ * @param baseCRSIn base CRS.
+ * @param derivingConversionIn the deriving conversion from the base CRS to
+ * this
+ * CRS.
+ * @param csIn the coordinate system.
+ * @return new DerivedCRSTemplate.
+ */
+ PROJ_DLL static NNPtr
+ create(const util::PropertyMap &properties, const BaseNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const CSNNPtr &csIn);
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
+ const override; // throw(io::FormattingException)
+ //! @endcond
+
+ protected:
+ PROJ_INTERNAL
+ DerivedCRSTemplate(const BaseNNPtr &baseCRSIn,
+ const operation::ConversionNNPtr &derivingConversionIn,
+ const CSNNPtr &csIn);
+ PROJ_INTERNAL DerivedCRSTemplate(const DerivedCRSTemplate &other);
+
+ PROJ_INTERNAL CRSNNPtr _shallowClone() const override;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ INLINED_MAKE_SHARED
+
+ private:
+ struct PROJ_INTERNAL Private;
+ std::unique_ptr<Private> d;
+
+ DerivedCRSTemplate &operator=(const DerivedCRSTemplate &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+//! @cond Doxygen_Suppress
+struct PROJ_GCC_DLL DerivedEngineeringCRSTraits {
+ typedef EngineeringCRS BaseType;
+ typedef cs::CoordinateSystem CSType;
+ // old x86_64-w64-mingw32-g++ has issues with static variables. use method
+ // instead
+ inline static const std::string &CRSName();
+ inline static const std::string &WKTKeyword();
+ inline static const std::string &WKTBaseKeyword();
+ static const bool wkt2_2018_only = true;
+};
+//! @endcond
+
+/** \brief A derived coordinate reference system which has an engineering
+ * coordinate reference system as its base CRS, thereby inheriting an
+ * engineering datum, and is associated with one of the coordinate system
+ * types for an EngineeringCRS
+ *
+ * \remark Implements DerivedEngineeringCRS from \ref ISO_19111_2018
+ */
+#ifdef DOXYGEN_ENABLED
+class DerivedEngineeringCRS
+ : public DerivedCRSTemplate<DerivedEngineeringCRSTraits> {};
+#else
+using DerivedEngineeringCRS = DerivedCRSTemplate<DerivedEngineeringCRSTraits>;
+#endif
+
+#ifndef DO_NOT_DEFINE_EXTERN_DERIVED_CRS_TEMPLATE
+extern template class DerivedCRSTemplate<DerivedEngineeringCRSTraits>;
+#endif
+
+/** Shared pointer of DerivedEngineeringCRS */
+using DerivedEngineeringCRSPtr = std::shared_ptr<DerivedEngineeringCRS>;
+/** Non-null shared pointer of DerivedEngineeringCRS */
+using DerivedEngineeringCRSNNPtr = util::nn<DerivedEngineeringCRSPtr>;
+
+// ---------------------------------------------------------------------------
+
+//! @cond Doxygen_Suppress
+struct PROJ_GCC_DLL DerivedParametricCRSTraits {
+ typedef ParametricCRS BaseType;
+ typedef cs::ParametricCS CSType;
+ // old x86_64-w64-mingw32-g++ has issues with static variables. use method
+ // instead
+ inline static const std::string &CRSName();
+ inline static const std::string &WKTKeyword();
+ inline static const std::string &WKTBaseKeyword();
+ static const bool wkt2_2018_only = false;
+};
+//! @endcond
+
+/** \brief A derived coordinate reference system which has a parametric
+ * coordinate reference system as its base CRS, thereby inheriting a parametric
+ * datum, and a parametric coordinate system.
+ *
+ * \remark Implements DerivedParametricCRS from \ref ISO_19111_2018
+ */
+#ifdef DOXYGEN_ENABLED
+class DerivedParametricCRS
+ : public DerivedCRSTemplate<DerivedParametricCRSTraits> {};
+#else
+using DerivedParametricCRS = DerivedCRSTemplate<DerivedParametricCRSTraits>;
+#endif
+
+#ifndef DO_NOT_DEFINE_EXTERN_DERIVED_CRS_TEMPLATE
+extern template class DerivedCRSTemplate<DerivedParametricCRSTraits>;
+#endif
+
+/** Shared pointer of DerivedParametricCRS */
+using DerivedParametricCRSPtr = std::shared_ptr<DerivedParametricCRS>;
+/** Non-null shared pointer of DerivedParametricCRS */
+using DerivedParametricCRSNNPtr = util::nn<DerivedParametricCRSPtr>;
+
+// ---------------------------------------------------------------------------
+
+//! @cond Doxygen_Suppress
+struct PROJ_GCC_DLL DerivedTemporalCRSTraits {
+ typedef TemporalCRS BaseType;
+ typedef cs::TemporalCS CSType;
+ // old x86_64-w64-mingw32-g++ has issues with static variables. use method
+ // instead
+ inline static const std::string &CRSName();
+ inline static const std::string &WKTKeyword();
+ inline static const std::string &WKTBaseKeyword();
+ static const bool wkt2_2018_only = false;
+};
+//! @endcond
+
+/** \brief A derived coordinate reference system which has a temporal
+ * coordinate reference system as its base CRS, thereby inheriting a temporal
+ * datum, and a temporal coordinate system.
+ *
+ * \remark Implements DerivedTemporalCRS from \ref ISO_19111_2018
+ */
+#ifdef DOXYGEN_ENABLED
+class DerivedTemporalCRS : public DerivedCRSTemplate<DerivedTemporalCRSTraits> {
+};
+#else
+using DerivedTemporalCRS = DerivedCRSTemplate<DerivedTemporalCRSTraits>;
+#endif
+
+#ifndef DO_NOT_DEFINE_EXTERN_DERIVED_CRS_TEMPLATE
+extern template class DerivedCRSTemplate<DerivedTemporalCRSTraits>;
+#endif
+
+/** Shared pointer of DerivedTemporalCRS */
+using DerivedTemporalCRSPtr = std::shared_ptr<DerivedTemporalCRS>;
+/** Non-null shared pointer of DerivedTemporalCRS */
+using DerivedTemporalCRSNNPtr = util::nn<DerivedTemporalCRSPtr>;
+
+// ---------------------------------------------------------------------------
+
+} // namespace crs
+
+NS_PROJ_END
+
+#endif // CRS_HH_INCLUDED