DYT/Tool/OpenSceneGraph-3.6.5/include/proj/datum.hpp

861 lines
31 KiB
C++
Raw Permalink Normal View History

2024-12-24 23:49:36 +00:00
/******************************************************************************
*
* Project: PROJ
* Purpose: ISO19111:2019 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 DATUM_HH_INCLUDED
#define DATUM_HH_INCLUDED
#include <memory>
#include <string>
#include <vector>
#include "common.hpp"
#include "io.hpp"
#include "util.hpp"
NS_PROJ_START
/** osgeo.proj.datum namespace
\brief Datum (the relationship of a coordinate system to the body).
*/
namespace datum {
// ---------------------------------------------------------------------------
/** \brief Abstract class of the relationship of a coordinate system to an
* object, thus creating a coordinate reference system.
*
* For geodetic and vertical coordinate reference systems, it relates a
* coordinate system to the Earth (or the celestial body considered). With
* other types of coordinate reference systems, the datum may relate the
* coordinate system to another physical or
* virtual object. A datum uses a parameter or set of parameters that determine
* the location of the origin of the coordinate reference system. Each datum
* subtype can be associated with only specific types of coordinate reference
* systems.
*
* \remark Implements Datum from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL Datum : public common::ObjectUsage,
public io::IJSONExportable {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~Datum() override;
//! @endcond
PROJ_DLL const util::optional<std::string> &anchorDefinition() const;
PROJ_DLL const util::optional<common::Measure> &anchorEpoch() const;
PROJ_DLL const util::optional<common::DateTime> &publicationDate() const;
PROJ_DLL const common::IdentifiedObjectPtr &conventionalRS() const;
//! @cond Doxygen_Suppress
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
//! @endcond
protected:
PROJ_INTERNAL Datum();
#ifdef DOXYGEN_ENABLED
std::string *anchorDefinition_;
Date *publicationDate_;
common::IdentifiedObject *conventionalRS_;
#endif
protected:
PROJ_INTERNAL void setAnchor(const util::optional<std::string> &anchor);
PROJ_INTERNAL void
setAnchorEpoch(const util::optional<common::Measure> &anchorEpoch);
PROJ_INTERNAL void
setProperties(const util::PropertyMap
&properties); // throw(InvalidValueTypeException)
private:
PROJ_OPAQUE_PRIVATE_DATA
Datum &operator=(const Datum &other) = delete;
Datum(const Datum &other) = delete;
};
/** Shared pointer of Datum */
using DatumPtr = std::shared_ptr<Datum>;
/** Non-null shared pointer of Datum */
using DatumNNPtr = util::nn<DatumPtr>;
// ---------------------------------------------------------------------------
class DatumEnsemble;
/** Shared pointer of DatumEnsemble */
using DatumEnsemblePtr = std::shared_ptr<DatumEnsemble>;
/** Non-null shared pointer of DatumEnsemble */
using DatumEnsembleNNPtr = util::nn<DatumEnsemblePtr>;
/** \brief A collection of two or more geodetic or vertical reference frames
* (or if not geodetic or vertical reference frame, a collection of two or more
* datums) which for all but the highest accuracy requirements may be
* considered to be insignificantly different from each other.
*
* Every frame within the datum ensemble must be a realizations of the same
* Terrestrial Reference System or Vertical Reference System.
*
* \remark Implements DatumEnsemble from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL DatumEnsemble final : public common::ObjectUsage,
public io::IJSONExportable {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~DatumEnsemble() override;
//! @endcond
PROJ_DLL const std::vector<DatumNNPtr> &datums() const;
PROJ_DLL const metadata::PositionalAccuracyNNPtr &
positionalAccuracy() const;
PROJ_DLL static DatumEnsembleNNPtr create(
const util::PropertyMap &properties,
const std::vector<DatumNNPtr> &datumsIn,
const metadata::PositionalAccuracyNNPtr &accuracy); // throw(Exception)
//! @cond Doxygen_Suppress
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL void _exportToJSON(io::JSONFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_FOR_TEST DatumNNPtr
asDatum(const io::DatabaseContextPtr &dbContext) const;
//! @endcond
protected:
#ifdef DOXYGEN_ENABLED
Datum datums_[];
PositionalAccuracy positionalAccuracy_;
#endif
PROJ_INTERNAL
DatumEnsemble(const std::vector<DatumNNPtr> &datumsIn,
const metadata::PositionalAccuracyNNPtr &accuracy);
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
DatumEnsemble(const DatumEnsemble &other) = delete;
DatumEnsemble &operator=(const DatumEnsemble &other) = delete;
};
// ---------------------------------------------------------------------------
class PrimeMeridian;
/** Shared pointer of PrimeMeridian */
using PrimeMeridianPtr = std::shared_ptr<PrimeMeridian>;
/** Non-null shared pointer of PrimeMeridian */
using PrimeMeridianNNPtr = util::nn<PrimeMeridianPtr>;
/** \brief The origin meridian from which longitude values are determined.
*
* \note The default value for prime meridian name is "Greenwich". When the
* default applies, the value for the longitude shall be 0 (degrees).
*
* \remark Implements PrimeMeridian from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL PrimeMeridian final : public common::IdentifiedObject,
public io::IPROJStringExportable,
public io::IJSONExportable {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~PrimeMeridian() override;
//! @endcond
PROJ_DLL const common::Angle &longitude() PROJ_PURE_DECL;
// non-standard
PROJ_DLL static PrimeMeridianNNPtr
create(const util::PropertyMap &properties,
const common::Angle &longitudeIn);
PROJ_DLL static const PrimeMeridianNNPtr GREENWICH;
PROJ_DLL static const PrimeMeridianNNPtr REFERENCE_MERIDIAN;
PROJ_DLL static const PrimeMeridianNNPtr PARIS;
PROJ_PRIVATE :
//! @cond Doxygen_Suppress
PROJ_INTERNAL void
_exportToPROJString(io::PROJStringFormatter *formatter)
const override; // throw(FormattingException)
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL void _exportToJSON(io::JSONFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
PROJ_INTERNAL static std::string
getPROJStringWellKnownName(const common::Angle &angle);
//! @endcond
protected:
#ifdef DOXYGEN_ENABLED
Angle greenwichLongitude_;
#endif
PROJ_INTERNAL explicit PrimeMeridian(
const common::Angle &angle = common::Angle());
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
PrimeMeridian(const PrimeMeridian &other) = delete;
PrimeMeridian &operator=(const PrimeMeridian &other) = delete;
PROJ_INTERNAL static const PrimeMeridianNNPtr createGREENWICH();
PROJ_INTERNAL static const PrimeMeridianNNPtr createREFERENCE_MERIDIAN();
PROJ_INTERNAL static const PrimeMeridianNNPtr createPARIS();
};
// ---------------------------------------------------------------------------
class Ellipsoid;
/** Shared pointer of Ellipsoid */
using EllipsoidPtr = std::shared_ptr<Ellipsoid>;
/** Non-null shared pointer of Ellipsoid */
using EllipsoidNNPtr = util::nn<EllipsoidPtr>;
/** \brief A geometric figure that can be used to describe the approximate
* shape of an object.
*
* For the Earth an oblate biaxial ellipsoid is used: in mathematical terms,
* it is a surface formed by the rotation of an ellipse about its minor axis.
*
* \remark Implements Ellipsoid from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL Ellipsoid final : public common::IdentifiedObject,
public io::IPROJStringExportable,
public io::IJSONExportable {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~Ellipsoid() override;
//! @endcond
PROJ_DLL const common::Length &semiMajorAxis() PROJ_PURE_DECL;
// Inlined from SecondDefiningParameter union
PROJ_DLL const util::optional<common::Scale> &
inverseFlattening() PROJ_PURE_DECL;
PROJ_DLL const util::optional<common::Length> &
semiMinorAxis() PROJ_PURE_DECL;
PROJ_DLL bool isSphere() PROJ_PURE_DECL;
PROJ_DLL const util::optional<common::Length> &
semiMedianAxis() PROJ_PURE_DECL;
// non-standard
PROJ_DLL double computedInverseFlattening() PROJ_PURE_DECL;
PROJ_DLL double squaredEccentricity() PROJ_PURE_DECL;
PROJ_DLL common::Length computeSemiMinorAxis() const;
PROJ_DLL const std::string &celestialBody() PROJ_PURE_DECL;
PROJ_DLL static const std::string EARTH;
PROJ_DLL static EllipsoidNNPtr
createSphere(const util::PropertyMap &properties,
const common::Length &radius,
const std::string &celestialBody = EARTH);
PROJ_DLL static EllipsoidNNPtr
createFlattenedSphere(const util::PropertyMap &properties,
const common::Length &semiMajorAxisIn,
const common::Scale &invFlattening,
const std::string &celestialBody = EARTH);
PROJ_DLL static EllipsoidNNPtr
createTwoAxis(const util::PropertyMap &properties,
const common::Length &semiMajorAxisIn,
const common::Length &semiMinorAxisIn,
const std::string &celestialBody = EARTH);
PROJ_DLL EllipsoidNNPtr identify() const;
PROJ_DLL static const EllipsoidNNPtr CLARKE_1866;
PROJ_DLL static const EllipsoidNNPtr WGS84;
PROJ_DLL static const EllipsoidNNPtr GRS1980;
PROJ_PRIVATE :
//! @cond Doxygen_Suppress
PROJ_INTERNAL void
_exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL void _exportToJSON(io::JSONFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
PROJ_INTERNAL void _exportToPROJString(io::PROJStringFormatter *formatter)
const override; // throw(FormattingException)
//! @endcond
PROJ_INTERNAL static std::string
guessBodyName(const io::DatabaseContextPtr &dbContext, double a,
const std::string &ellpsName = std::string());
PROJ_INTERNAL bool lookForProjWellKnownEllps(std::string &projEllpsName,
std::string &ellpsName) const;
protected:
#ifdef DOXYGEN_ENABLED
common::Length semiMajorAxis_;
common::Scale *inverseFlattening_;
common::Length *semiMinorAxis_;
bool isSphere_;
common::Length *semiMedianAxis_;
#endif
PROJ_INTERNAL explicit Ellipsoid(const common::Length &radius,
const std::string &celestialBody);
PROJ_INTERNAL Ellipsoid(const common::Length &semiMajorAxisIn,
const common::Scale &invFlattening,
const std::string &celestialBody);
PROJ_INTERNAL Ellipsoid(const common::Length &semiMajorAxisIn,
const common::Length &semiMinorAxisIn,
const std::string &celestialBody);
PROJ_INTERNAL Ellipsoid(const Ellipsoid &other);
INLINED_MAKE_SHARED
PROJ_INTERNAL static const EllipsoidNNPtr createCLARKE_1866();
PROJ_INTERNAL static const EllipsoidNNPtr createWGS84();
PROJ_INTERNAL static const EllipsoidNNPtr createGRS1980();
private:
PROJ_OPAQUE_PRIVATE_DATA
Ellipsoid &operator=(const Ellipsoid &other) = delete;
};
// ---------------------------------------------------------------------------
class GeodeticReferenceFrame;
/** Shared pointer of GeodeticReferenceFrame */
using GeodeticReferenceFramePtr = std::shared_ptr<GeodeticReferenceFrame>;
/** Non-null shared pointer of GeodeticReferenceFrame */
using GeodeticReferenceFrameNNPtr = util::nn<GeodeticReferenceFramePtr>;
/** \brief The definition of the position, scale and orientation of a geocentric
* Cartesian 3D coordinate system relative to the Earth.
*
* It may also identify a defined ellipsoid (or sphere) that approximates
* the shape of the Earth and which is centred on and aligned to this
* geocentric coordinate system. Older geodetic datums define the location and
* orientation of a defined ellipsoid (or sphere) that approximates the shape
* of the earth.
*
* \note The terminology "Datum" is often used to mean a GeodeticReferenceFrame.
*
* \note In \ref ISO_19111_2007, this class was called GeodeticDatum.
*
* \remark Implements GeodeticReferenceFrame from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL GeodeticReferenceFrame : public Datum {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~GeodeticReferenceFrame() override;
//! @endcond
PROJ_DLL const PrimeMeridianNNPtr &primeMeridian() PROJ_PURE_DECL;
// We constraint more than the standard into which the ellipsoid might
// be omitted for a CRS with a non-ellipsoidal CS
PROJ_DLL const EllipsoidNNPtr &ellipsoid() PROJ_PURE_DECL;
// non-standard
PROJ_DLL static GeodeticReferenceFrameNNPtr
create(const util::PropertyMap &properties, const EllipsoidNNPtr &ellipsoid,
const util::optional<std::string> &anchor,
const PrimeMeridianNNPtr &primeMeridian);
PROJ_DLL static GeodeticReferenceFrameNNPtr
create(const util::PropertyMap &properties, const EllipsoidNNPtr &ellipsoid,
const util::optional<std::string> &anchor,
const util::optional<common::Measure> &anchorEpoch,
const PrimeMeridianNNPtr &primeMeridian);
PROJ_DLL static const GeodeticReferenceFrameNNPtr
EPSG_6267; // North American Datum 1927
PROJ_DLL static const GeodeticReferenceFrameNNPtr
EPSG_6269; // North American Datum 1983
PROJ_DLL static const GeodeticReferenceFrameNNPtr EPSG_6326; // WGS 84
//! @cond Doxygen_Suppress
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL void _exportToJSON(io::JSONFormatter *formatter)
const override; // throw(FormattingException)
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
PROJ_INTERNAL bool isEquivalentToNoExactTypeCheck(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const;
//! @endcond
protected:
#ifdef DOXYGEN_ENABLED
PrimeMeridian primeMeridian_;
Ellipsoid *ellipsoid_;
#endif
PROJ_INTERNAL
GeodeticReferenceFrame(const EllipsoidNNPtr &ellipsoidIn,
const PrimeMeridianNNPtr &primeMeridianIn);
INLINED_MAKE_SHARED
PROJ_INTERNAL static const GeodeticReferenceFrameNNPtr createEPSG_6267();
PROJ_INTERNAL static const GeodeticReferenceFrameNNPtr createEPSG_6269();
PROJ_INTERNAL static const GeodeticReferenceFrameNNPtr createEPSG_6326();
bool hasEquivalentNameToUsingAlias(
const IdentifiedObject *other,
const io::DatabaseContextPtr &dbContext) const override;
private:
PROJ_OPAQUE_PRIVATE_DATA
GeodeticReferenceFrame(const GeodeticReferenceFrame &other) = delete;
GeodeticReferenceFrame &
operator=(const GeodeticReferenceFrame &other) = delete;
};
// ---------------------------------------------------------------------------
class DynamicGeodeticReferenceFrame;
/** Shared pointer of DynamicGeodeticReferenceFrame */
using DynamicGeodeticReferenceFramePtr =
std::shared_ptr<DynamicGeodeticReferenceFrame>;
/** Non-null shared pointer of DynamicGeodeticReferenceFrame */
using DynamicGeodeticReferenceFrameNNPtr =
util::nn<DynamicGeodeticReferenceFramePtr>;
/** \brief A geodetic reference frame in which some of the parameters describe
* time evolution of defining station coordinates.
*
* For example defining station coordinates having linear velocities to account
* for crustal motion.
*
* \remark Implements DynamicGeodeticReferenceFrame from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL DynamicGeodeticReferenceFrame final
: public GeodeticReferenceFrame {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~DynamicGeodeticReferenceFrame() override;
//! @endcond
PROJ_DLL const common::Measure &frameReferenceEpoch() const;
PROJ_DLL const util::optional<std::string> &deformationModelName() const;
// non-standard
PROJ_DLL static DynamicGeodeticReferenceFrameNNPtr
create(const util::PropertyMap &properties, const EllipsoidNNPtr &ellipsoid,
const util::optional<std::string> &anchor,
const PrimeMeridianNNPtr &primeMeridian,
const common::Measure &frameReferenceEpochIn,
const util::optional<std::string> &deformationModelNameIn);
//! @cond Doxygen_Suppress
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
//! @endcond
protected:
#ifdef DOXYGEN_ENABLED
Measure frameReferenceEpoch_;
#endif
PROJ_INTERNAL DynamicGeodeticReferenceFrame(
const EllipsoidNNPtr &ellipsoidIn,
const PrimeMeridianNNPtr &primeMeridianIn,
const common::Measure &frameReferenceEpochIn,
const util::optional<std::string> &deformationModelNameIn);
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
DynamicGeodeticReferenceFrame(const DynamicGeodeticReferenceFrame &other) =
delete;
DynamicGeodeticReferenceFrame &
operator=(const DynamicGeodeticReferenceFrame &other) = delete;
};
// ---------------------------------------------------------------------------
/** \brief The specification of the method by which the vertical reference frame
* is realized.
*
* \remark Implements RealizationMethod from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL RealizationMethod : public util::CodeList {
public:
PROJ_DLL static const RealizationMethod LEVELLING;
PROJ_DLL static const RealizationMethod GEOID;
PROJ_DLL static const RealizationMethod TIDAL;
private:
PROJ_FRIEND_OPTIONAL(RealizationMethod);
PROJ_DLL explicit RealizationMethod(
const std::string &nameIn = std::string());
PROJ_DLL RealizationMethod(const RealizationMethod &other) = default;
PROJ_DLL RealizationMethod &operator=(const RealizationMethod &other);
};
// ---------------------------------------------------------------------------
class VerticalReferenceFrame;
/** Shared pointer of VerticalReferenceFrame */
using VerticalReferenceFramePtr = std::shared_ptr<VerticalReferenceFrame>;
/** Non-null shared pointer of VerticalReferenceFrame */
using VerticalReferenceFrameNNPtr = util::nn<VerticalReferenceFramePtr>;
/** \brief A textual description and/or a set of parameters identifying a
* particular reference level surface used as a zero-height or zero-depth
* surface, including its position with respect to the Earth.
*
* \note In \ref ISO_19111_2007, this class was called VerticalDatum.
* \remark Implements VerticalReferenceFrame from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL VerticalReferenceFrame : public Datum {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~VerticalReferenceFrame() override;
//! @endcond
PROJ_DLL const util::optional<RealizationMethod> &realizationMethod() const;
// non-standard
PROJ_DLL static VerticalReferenceFrameNNPtr
create(const util::PropertyMap &properties,
const util::optional<std::string> &anchor =
util::optional<std::string>(),
const util::optional<RealizationMethod> &realizationMethodIn =
util::optional<RealizationMethod>());
PROJ_DLL static VerticalReferenceFrameNNPtr
create(const util::PropertyMap &properties,
const util::optional<std::string> &anchor,
const util::optional<common::Measure> &anchorEpoch,
const util::optional<RealizationMethod> &realizationMethodIn =
util::optional<RealizationMethod>());
//! @cond Doxygen_Suppress
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
PROJ_INTERNAL bool isEquivalentToNoExactTypeCheck(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const;
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL void _exportToJSON(io::JSONFormatter *formatter)
const override; // throw(FormattingException)
PROJ_INTERNAL const std::string &getWKT1DatumType() const;
//! @endcond
protected:
#ifdef DOXYGEN_ENABLED
RealizationMethod realizationMethod_;
#endif
PROJ_INTERNAL explicit VerticalReferenceFrame(
const util::optional<RealizationMethod> &realizationMethodIn);
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
};
// ---------------------------------------------------------------------------
class DynamicVerticalReferenceFrame;
/** Shared pointer of DynamicVerticalReferenceFrame */
using DynamicVerticalReferenceFramePtr =
std::shared_ptr<DynamicVerticalReferenceFrame>;
/** Non-null shared pointer of DynamicVerticalReferenceFrame */
using DynamicVerticalReferenceFrameNNPtr =
util::nn<DynamicVerticalReferenceFramePtr>;
/** \brief A vertical reference frame in which some of the defining parameters
* have time dependency.
*
* For example defining station heights have velocity to account for
* post-glacial isostatic rebound motion.
*
* \remark Implements DynamicVerticalReferenceFrame from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL DynamicVerticalReferenceFrame final
: public VerticalReferenceFrame {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~DynamicVerticalReferenceFrame() override;
//! @endcond
PROJ_DLL const common::Measure &frameReferenceEpoch() const;
PROJ_DLL const util::optional<std::string> &deformationModelName() const;
// non-standard
PROJ_DLL static DynamicVerticalReferenceFrameNNPtr
create(const util::PropertyMap &properties,
const util::optional<std::string> &anchor,
const util::optional<RealizationMethod> &realizationMethodIn,
const common::Measure &frameReferenceEpochIn,
const util::optional<std::string> &deformationModelNameIn);
//! @cond Doxygen_Suppress
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
//! @endcond
protected:
#ifdef DOXYGEN_ENABLED
Measure frameReferenceEpoch_;
#endif
PROJ_INTERNAL DynamicVerticalReferenceFrame(
const util::optional<RealizationMethod> &realizationMethodIn,
const common::Measure &frameReferenceEpochIn,
const util::optional<std::string> &deformationModelNameIn);
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
DynamicVerticalReferenceFrame(const DynamicVerticalReferenceFrame &other) =
delete;
DynamicVerticalReferenceFrame &
operator=(const DynamicVerticalReferenceFrame &other) = delete;
};
// ---------------------------------------------------------------------------
class TemporalDatum;
/** Shared pointer of TemporalDatum */
using TemporalDatumPtr = std::shared_ptr<TemporalDatum>;
/** Non-null shared pointer of TemporalDatum */
using TemporalDatumNNPtr = util::nn<TemporalDatumPtr>;
/** \brief The definition of the relationship of a temporal coordinate system
* to an object. The object is normally time on the Earth.
*
* \remark Implements TemporalDatum from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL TemporalDatum final : public Datum {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~TemporalDatum() override;
//! @endcond
PROJ_DLL const common::DateTime &temporalOrigin() const;
PROJ_DLL const std::string &calendar() const;
PROJ_DLL static const std::string CALENDAR_PROLEPTIC_GREGORIAN;
// non-standard
PROJ_DLL static TemporalDatumNNPtr
create(const util::PropertyMap &properties,
const common::DateTime &temporalOriginIn,
const std::string &calendarIn);
//! @cond Doxygen_Suppress
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL void _exportToJSON(io::JSONFormatter *formatter)
const override; // throw(FormattingException)
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
//! @endcond
protected:
PROJ_INTERNAL TemporalDatum(const common::DateTime &temporalOriginIn,
const std::string &calendarIn);
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
};
// ---------------------------------------------------------------------------
class EngineeringDatum;
/** Shared pointer of EngineeringDatum */
using EngineeringDatumPtr = std::shared_ptr<EngineeringDatum>;
/** Non-null shared pointer of EngineeringDatum */
using EngineeringDatumNNPtr = util::nn<EngineeringDatumPtr>;
/** \brief The definition of the origin and orientation of an engineering
* coordinate reference system.
*
* \note The origin can be fixed with respect to the Earth (such as a defined
* point at a construction site), or be a defined point on a moving vehicle
* (such as on a ship or satellite), or a defined point of an image.
*
* \remark Implements EngineeringDatum from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL EngineeringDatum final : public Datum {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~EngineeringDatum() override;
//! @endcond
// non-standard
PROJ_DLL static EngineeringDatumNNPtr
create(const util::PropertyMap &properties,
const util::optional<std::string> &anchor =
util::optional<std::string>());
//! @cond Doxygen_Suppress
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL void _exportToJSON(io::JSONFormatter *formatter)
const override; // throw(FormattingException)
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
//! @endcond
protected:
PROJ_INTERNAL EngineeringDatum();
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
};
// ---------------------------------------------------------------------------
class ParametricDatum;
/** Shared pointer of ParametricDatum */
using ParametricDatumPtr = std::shared_ptr<ParametricDatum>;
/** Non-null shared pointer of ParametricDatum */
using ParametricDatumNNPtr = util::nn<ParametricDatumPtr>;
/** \brief Textual description and/or a set of parameters identifying a
* particular reference surface used as the origin of a parametric coordinate
* system, including its position with respect to the Earth.
*
* \remark Implements ParametricDatum from \ref ISO_19111_2019
*/
class PROJ_GCC_DLL ParametricDatum final : public Datum {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~ParametricDatum() override;
//! @endcond
// non-standard
PROJ_DLL static ParametricDatumNNPtr
create(const util::PropertyMap &properties,
const util::optional<std::string> &anchor =
util::optional<std::string>());
//! @cond Doxygen_Suppress
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL void _exportToJSON(io::JSONFormatter *formatter)
const override; // throw(FormattingException)
PROJ_INTERNAL bool _isEquivalentTo(
const util::IComparable *other,
util::IComparable::Criterion criterion =
util::IComparable::Criterion::STRICT,
const io::DatabaseContextPtr &dbContext = nullptr) const override;
//! @endcond
protected:
PROJ_INTERNAL ParametricDatum();
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
};
} // namespace datum
NS_PROJ_END
#endif // DATUM_HH_INCLUDED