aboutsummaryrefslogtreecommitdiff
path: root/include/proj/common.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/proj/common.hpp')
-rw-r--r--include/proj/common.hpp445
1 files changed, 445 insertions, 0 deletions
diff --git a/include/proj/common.hpp b/include/proj/common.hpp
new file mode 100644
index 00000000..f1e683e7
--- /dev/null
+++ b/include/proj/common.hpp
@@ -0,0 +1,445 @@
+/******************************************************************************
+ *
+ * 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 COMMON_HH_INCLUDED
+#define COMMON_HH_INCLUDED
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "io.hpp"
+#include "metadata.hpp"
+#include "util.hpp"
+
+NS_PROJ_START
+
+/** osgeo.proj.common namespace
+ *
+ * \brief Common classes.
+ */
+namespace common {
+
+// ---------------------------------------------------------------------------
+
+class UnitOfMeasure;
+/** Shared pointer of UnitOfMeasure. */
+using UnitOfMeasurePtr = std::shared_ptr<UnitOfMeasure>;
+/** Non-null shared pointer of UnitOfMeasure. */
+using UnitOfMeasureNNPtr = util::nn<UnitOfMeasurePtr>;
+
+/** \brief Unit of measure.
+ *
+ * This is a mutable object.
+ */
+class PROJ_GCC_DLL UnitOfMeasure : public util::BaseObject {
+ public:
+ /** \brief Type of unit of measure. */
+ enum class PROJ_MSVC_DLL Type {
+ /** Unknown unit of measure */
+ UNKNOWN,
+ /** No unit of measure */
+ NONE,
+ /** Angular unit of measure */
+ ANGULAR,
+ /** Linear unit of measure */
+ LINEAR,
+ /** Scale unit of measure */
+ SCALE,
+ /** Time unit of measure */
+ TIME,
+ /** Parametric unit of measure */
+ PARAMETRIC,
+ };
+
+ PROJ_DLL UnitOfMeasure(const std::string &nameIn = std::string(),
+ double toSIIn = 1.0, Type typeIn = Type::UNKNOWN,
+ const std::string &codeSpaceIn = std::string(),
+ const std::string &codeIn = std::string());
+
+ //! @cond Doxygen_Suppress
+ PROJ_DLL UnitOfMeasure(const UnitOfMeasure &other);
+ PROJ_DLL ~UnitOfMeasure() override;
+ PROJ_DLL UnitOfMeasure &operator=(const UnitOfMeasure &other);
+ PROJ_INTERNAL static UnitOfMeasureNNPtr create(const UnitOfMeasure &other);
+ //! @endcond
+
+ PROJ_DLL const std::string &name() PROJ_PURE_DECL;
+ PROJ_DLL double conversionToSI() PROJ_PURE_DECL;
+ PROJ_DLL Type type() PROJ_PURE_DECL;
+
+ PROJ_DLL const std::string &codeSpace() PROJ_PURE_DECL;
+ PROJ_DLL const std::string &code() PROJ_PURE_DECL;
+
+ PROJ_DLL bool operator==(const UnitOfMeasure &other) PROJ_PURE_DECL;
+ PROJ_DLL bool operator!=(const UnitOfMeasure &other) PROJ_PURE_DECL;
+
+ //! @cond Doxygen_Suppress
+ PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter,
+ const std::string &unitType = std::string())
+ const; // throw(io::FormattingException)
+
+ PROJ_INTERNAL std::string exportToPROJString() const;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const UnitOfMeasure &other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const;
+
+ //! @endcond
+
+ PROJ_DLL static const UnitOfMeasure NONE;
+
+ PROJ_DLL static const UnitOfMeasure SCALE_UNITY;
+ PROJ_DLL static const UnitOfMeasure PARTS_PER_MILLION;
+ PROJ_DLL static const UnitOfMeasure PPM_PER_YEAR;
+
+ PROJ_DLL static const UnitOfMeasure METRE;
+ PROJ_DLL static const UnitOfMeasure METRE_PER_YEAR;
+
+ PROJ_DLL static const UnitOfMeasure RADIAN;
+ PROJ_DLL static const UnitOfMeasure MICRORADIAN;
+ PROJ_DLL static const UnitOfMeasure DEGREE;
+ PROJ_DLL static const UnitOfMeasure ARC_SECOND;
+ PROJ_DLL static const UnitOfMeasure GRAD;
+ PROJ_DLL static const UnitOfMeasure ARC_SECOND_PER_YEAR;
+
+ PROJ_DLL static const UnitOfMeasure SECOND;
+ PROJ_DLL static const UnitOfMeasure YEAR;
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Numeric value associated with a UnitOfMeasure. */
+class Measure : public util::BaseObject {
+ public:
+ PROJ_DLL Measure(double valueIn = 0.0,
+ const UnitOfMeasure &unitIn = UnitOfMeasure());
+
+ //! @cond Doxygen_Suppress
+ PROJ_DLL Measure(const Measure &other);
+ PROJ_DLL ~Measure();
+ //! @endcond
+
+ PROJ_DLL const UnitOfMeasure &unit() PROJ_CONST_DECL;
+ PROJ_DLL double getSIValue() PROJ_CONST_DECL;
+ PROJ_DLL double value() PROJ_CONST_DECL;
+
+ PROJ_DLL double
+ convertToUnit(const UnitOfMeasure &otherUnit) PROJ_CONST_DECL;
+
+ PROJ_DLL bool operator==(const Measure &other) PROJ_CONST_DECL;
+
+ PROJ_INTERNAL bool
+ _isEquivalentTo(const Measure &other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const;
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ Measure &operator=(const Measure &) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Numeric value, without a physical unit of measure. */
+class Scale : public Measure {
+ public:
+ PROJ_DLL explicit Scale(double valueIn = 0.0);
+ PROJ_DLL explicit Scale(double valueIn, const UnitOfMeasure &unitIn);
+
+ //! @cond Doxygen_Suppress
+ explicit Scale(const Measure &other) : Scale(other.value(), other.unit()) {}
+ PROJ_DLL Scale(const Scale &other);
+ PROJ_DLL ~Scale() override;
+ //! @endcond
+
+ protected:
+ PROJ_FRIEND_OPTIONAL(Scale);
+ Scale &operator=(const Scale &) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Numeric value, with a angular unit of measure. */
+class Angle : public Measure {
+ public:
+ PROJ_DLL explicit Angle(double valueIn = 0.0);
+ PROJ_DLL Angle(double valueIn, const UnitOfMeasure &unitIn);
+
+ //! @cond Doxygen_Suppress
+ explicit Angle(const Measure &other) : Angle(other.value(), other.unit()) {}
+ PROJ_DLL Angle(const Angle &other);
+ PROJ_DLL ~Angle() override;
+ //! @endcond
+
+ protected:
+ PROJ_FRIEND_OPTIONAL(Angle);
+ Angle &operator=(const Angle &) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Numeric value, with a linear unit of measure. */
+class Length : public Measure {
+ public:
+ PROJ_DLL explicit Length(double valueIn = 0.0);
+ PROJ_DLL Length(double valueIn, const UnitOfMeasure &unitIn);
+
+ //! @cond Doxygen_Suppress
+ explicit Length(const Measure &other)
+ : Length(other.value(), other.unit()) {}
+ PROJ_DLL Length(const Length &other);
+ PROJ_DLL ~Length() override;
+ //! @endcond
+
+ protected:
+ PROJ_FRIEND_OPTIONAL(Length);
+ Length &operator=(const Length &) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Date-time value, as a ISO:8601 encoded string, or other string
+ * encoding */
+class DateTime {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL DateTime(const DateTime &other);
+ PROJ_DLL ~DateTime();
+ //! @endcond
+
+ PROJ_DLL bool isISO_8601() const;
+ PROJ_DLL std::string toString() const;
+
+ PROJ_DLL static DateTime
+ create(const std::string &str); // may throw Exception
+
+ protected:
+ DateTime();
+ PROJ_FRIEND_OPTIONAL(DateTime);
+
+ private:
+ explicit DateTime(const std::string &str);
+ DateTime &operator=(const DateTime &other) = delete;
+
+ PROJ_OPAQUE_PRIVATE_DATA
+};
+
+// ---------------------------------------------------------------------------
+
+/** \brief Data epoch */
+class DataEpoch {
+ // FIXME
+ public:
+ /** FIXME */
+ Measure coordinateEpoch{};
+};
+
+// ---------------------------------------------------------------------------
+
+class IdentifiedObject;
+/** Shared pointer of IdentifiedObject. */
+using IdentifiedObjectPtr = std::shared_ptr<IdentifiedObject>;
+/** Non-null shared pointer of IdentifiedObject. */
+using IdentifiedObjectNNPtr = util::nn<IdentifiedObjectPtr>;
+
+/** \brief Abstract class representating a CRS-related object that has an
+ * identification.
+ *
+ * \remark Implements IdentifiedObject from \ref ISO_19111_2018
+ */
+class IdentifiedObject : public util::BaseObject,
+ public util::IComparable,
+ public io::IWKTExportable {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~IdentifiedObject() override;
+ //! @endcond
+
+ PROJ_DLL static const std::string NAME_KEY;
+ PROJ_DLL static const std::string IDENTIFIERS_KEY;
+ PROJ_DLL static const std::string ALIAS_KEY;
+ PROJ_DLL static const std::string REMARKS_KEY;
+ PROJ_DLL static const std::string DEPRECATED_KEY;
+
+ // in practice only name().description() is used
+ PROJ_DLL const metadata::IdentifierNNPtr &name() PROJ_CONST_DECL;
+ PROJ_DLL const std::string &nameStr() PROJ_CONST_DECL;
+ PROJ_DLL const std::vector<metadata::IdentifierNNPtr> &
+ identifiers() PROJ_CONST_DECL;
+ PROJ_DLL const std::vector<util::GenericNameNNPtr> &
+ aliases() PROJ_CONST_DECL;
+ PROJ_DLL const std::string &remarks() PROJ_CONST_DECL;
+
+ // from Apache SIS AbstractIdentifiedObject
+ PROJ_DLL bool isDeprecated() PROJ_CONST_DECL;
+
+ // Non-standard
+ PROJ_DLL std::string alias() PROJ_CONST_DECL;
+ PROJ_DLL int getEPSGCode() PROJ_CONST_DECL;
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ void
+ formatID(io::WKTFormatter *formatter) const;
+ void formatRemarks(io::WKTFormatter *formatter) const;
+
+ bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+
+ bool
+ _isEquivalentTo(const IdentifiedObject *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) PROJ_CONST_DECL;
+ //! @endcond
+
+ protected:
+ PROJ_FRIEND_OPTIONAL(IdentifiedObject);
+ INLINED_MAKE_SHARED
+ IdentifiedObject();
+ IdentifiedObject(const IdentifiedObject &other);
+
+ void setProperties(const util::PropertyMap
+ &properties); // throw(InvalidValueTypeException)
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ IdentifiedObject &operator=(const IdentifiedObject &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class ObjectDomain;
+/** Shared pointer of ObjectDomain. */
+using ObjectDomainPtr = std::shared_ptr<ObjectDomain>;
+/** Non-null shared pointer of ObjectDomain. */
+using ObjectDomainNNPtr = util::nn<ObjectDomainPtr>;
+
+/** \brief The scope and validity of a CRS-related object.
+ *
+ * \remark Implements ObjectDomain from \ref ISO_19111_2018
+ */
+class ObjectDomain : public util::BaseObject, public util::IComparable {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~ObjectDomain() override;
+ //! @endcond
+
+ // In ISO_19111:2018, scope and domain are compulsory, but in WKT2:2015,
+ // they
+ // are not necessarily both specified
+ PROJ_DLL const util::optional<std::string> &scope() PROJ_CONST_DECL;
+ PROJ_DLL const metadata::ExtentPtr &domainOfValidity() PROJ_CONST_DECL;
+
+ PROJ_DLL static ObjectDomainNNPtr
+ create(const util::optional<std::string> &scopeIn,
+ const metadata::ExtentPtr &extent);
+
+ PROJ_PRIVATE :
+ //! @cond Doxygen_Suppress
+ void
+ _exportToWKT(io::WKTFormatter *formatter)
+ const; // throw(io::FormattingException)
+
+ bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+ //! @endcond
+
+ protected:
+ //! @cond Doxygen_Suppress
+ ObjectDomain(const util::optional<std::string> &scopeIn,
+ const metadata::ExtentPtr &extent);
+ //! @endcond
+
+ ObjectDomain(const ObjectDomain &other);
+ INLINED_MAKE_SHARED
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ ObjectDomain &operator=(const ObjectDomain &other) = delete;
+};
+
+// ---------------------------------------------------------------------------
+
+class ObjectUsage;
+/** Shared pointer of ObjectUsage. */
+using ObjectUsagePtr = std::shared_ptr<ObjectUsage>;
+/** Non-null shared pointer of ObjectUsage. */
+using ObjectUsageNNPtr = util::nn<ObjectUsagePtr>;
+
+/** \brief Abstract class of a CRS-related object that has usages.
+ *
+ * \remark Implements ObjectUsage from \ref ISO_19111_2018
+ */
+class ObjectUsage : public IdentifiedObject {
+ public:
+ //! @cond Doxygen_Suppress
+ PROJ_DLL ~ObjectUsage() override;
+ //! @endcond
+
+ PROJ_DLL const std::vector<ObjectDomainNNPtr> &domains() PROJ_CONST_DECL;
+
+ PROJ_DLL static const std::string SCOPE_KEY;
+ PROJ_DLL static const std::string DOMAIN_OF_VALIDITY_KEY;
+
+ PROJ_DLL static const std::string OBJECT_DOMAIN_KEY;
+
+ //! @cond Doxygen_Suppress
+ bool
+ _isEquivalentTo(const util::IComparable *other,
+ util::IComparable::Criterion criterion =
+ util::IComparable::Criterion::STRICT) const override;
+ //! @endcond
+
+ protected:
+ ObjectUsage();
+ ObjectUsage(const ObjectUsage &other);
+ void setProperties(const util::PropertyMap
+ &properties); // throw(InvalidValueTypeException)
+
+ void baseExportToWKT(
+ io::WKTFormatter *formatter) const; // throw(io::FormattingException)
+
+ private:
+ PROJ_OPAQUE_PRIVATE_DATA
+ ObjectUsage &operator=(const ObjectUsage &other) = delete;
+};
+
+} // namespace common
+
+NS_PROJ_END
+
+#endif // COMMON_HH_INCLUDED