DYT/Tool/OpenSceneGraph-3.6.5/include/proj/metadata.hpp
2024-12-25 07:49:36 +08:00

471 lines
16 KiB
C++

/******************************************************************************
*
* 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 METADATA_HH_INCLUDED
#define METADATA_HH_INCLUDED
#include <memory>
#include <string>
#include <vector>
#include "io.hpp"
#include "util.hpp"
NS_PROJ_START
namespace common {
class UnitOfMeasure;
using UnitOfMeasurePtr = std::shared_ptr<UnitOfMeasure>;
using UnitOfMeasureNNPtr = util::nn<UnitOfMeasurePtr>;
class IdentifiedObject;
} // namespace common
/** osgeo.proj.metadata namespace
*
* \brief Common classes from \ref ISO_19115 standard
*/
namespace metadata {
// ---------------------------------------------------------------------------
/** \brief Standardized resource reference.
*
* A citation contains a title.
*
* \remark Simplified version of [Citation]
* (http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/metadata/citation/Citation.html)
* from \ref GeoAPI
*/
class PROJ_GCC_DLL Citation : public util::BaseObject {
public:
PROJ_DLL explicit Citation(const std::string &titleIn);
//! @cond Doxygen_Suppress
PROJ_DLL Citation();
PROJ_DLL Citation(const Citation &other);
PROJ_DLL ~Citation() override;
//! @endcond
PROJ_DLL const util::optional<std::string> &title() PROJ_PURE_DECL;
protected:
PROJ_FRIEND_OPTIONAL(Citation);
PROJ_INTERNAL Citation &operator=(const Citation &other);
private:
PROJ_OPAQUE_PRIVATE_DATA
};
// ---------------------------------------------------------------------------
class GeographicExtent;
/** Shared pointer of GeographicExtent. */
using GeographicExtentPtr = std::shared_ptr<GeographicExtent>;
/** Non-null shared pointer of GeographicExtent. */
using GeographicExtentNNPtr = util::nn<GeographicExtentPtr>;
/** \brief Base interface for geographic area of the dataset.
*
* \remark Simplified version of [GeographicExtent]
* (http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/metadata/extent/GeographicExtent.html)
* from \ref GeoAPI
*/
class PROJ_GCC_DLL GeographicExtent : public util::BaseObject,
public util::IComparable {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~GeographicExtent() override;
//! @endcond
// GeoAPI has a getInclusion() method. We assume that it is included for our
// use
//! @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 = 0;
//! @endcond
/** \brief Returns whether this extent contains the other one. */
PROJ_DLL virtual bool
contains(const GeographicExtentNNPtr &other) const = 0;
/** \brief Returns whether this extent intersects the other one. */
PROJ_DLL virtual bool
intersects(const GeographicExtentNNPtr &other) const = 0;
/** \brief Returns the intersection of this extent with another one. */
PROJ_DLL virtual GeographicExtentPtr
intersection(const GeographicExtentNNPtr &other) const = 0;
protected:
PROJ_INTERNAL GeographicExtent();
private:
PROJ_OPAQUE_PRIVATE_DATA
};
// ---------------------------------------------------------------------------
class GeographicBoundingBox;
/** Shared pointer of GeographicBoundingBox. */
using GeographicBoundingBoxPtr = std::shared_ptr<GeographicBoundingBox>;
/** Non-null shared pointer of GeographicBoundingBox. */
using GeographicBoundingBoxNNPtr = util::nn<GeographicBoundingBoxPtr>;
/** \brief Geographic position of the dataset.
*
* This is only an approximate so specifying the coordinate reference system is
* unnecessary.
*
* \remark Implements [GeographicBoundingBox]
* (http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/metadata/extent/GeographicBoundingBox.html)
* from \ref GeoAPI
*/
class PROJ_GCC_DLL GeographicBoundingBox : public GeographicExtent {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~GeographicBoundingBox() override;
//! @endcond
PROJ_DLL double westBoundLongitude() PROJ_PURE_DECL;
PROJ_DLL double southBoundLatitude() PROJ_PURE_DECL;
PROJ_DLL double eastBoundLongitude() PROJ_PURE_DECL;
PROJ_DLL double northBoundLatitude() PROJ_PURE_DECL;
PROJ_DLL static GeographicBoundingBoxNNPtr
create(double west, double south, double east, double north);
//! @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
PROJ_INTERNAL bool
contains(const GeographicExtentNNPtr &other) const override;
PROJ_INTERNAL bool
intersects(const GeographicExtentNNPtr &other) const override;
PROJ_INTERNAL GeographicExtentPtr
intersection(const GeographicExtentNNPtr &other) const override;
protected:
PROJ_INTERNAL GeographicBoundingBox(double west, double south, double east,
double north);
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
};
// ---------------------------------------------------------------------------
class TemporalExtent;
/** Shared pointer of TemporalExtent. */
using TemporalExtentPtr = std::shared_ptr<TemporalExtent>;
/** Non-null shared pointer of TemporalExtent. */
using TemporalExtentNNPtr = util::nn<TemporalExtentPtr>;
/** \brief Time period covered by the content of the dataset.
*
* \remark Simplified version of [TemporalExtent]
* (http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/metadata/extent/TemporalExtent.html)
* from \ref GeoAPI
*/
class PROJ_GCC_DLL TemporalExtent : public util::BaseObject,
public util::IComparable {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~TemporalExtent() override;
//! @endcond
PROJ_DLL const std::string &start() PROJ_PURE_DECL;
PROJ_DLL const std::string &stop() PROJ_PURE_DECL;
PROJ_DLL static TemporalExtentNNPtr create(const std::string &start,
const std::string &stop);
//! @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
PROJ_DLL bool contains(const TemporalExtentNNPtr &other) const;
PROJ_DLL bool intersects(const TemporalExtentNNPtr &other) const;
protected:
PROJ_INTERNAL TemporalExtent(const std::string &start,
const std::string &stop);
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
};
// ---------------------------------------------------------------------------
class VerticalExtent;
/** Shared pointer of VerticalExtent. */
using VerticalExtentPtr = std::shared_ptr<VerticalExtent>;
/** Non-null shared pointer of VerticalExtent. */
using VerticalExtentNNPtr = util::nn<VerticalExtentPtr>;
/** \brief Vertical domain of dataset.
*
* \remark Simplified version of [VerticalExtent]
* (http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/metadata/extent/VerticalExtent.html)
* from \ref GeoAPI
*/
class PROJ_GCC_DLL VerticalExtent : public util::BaseObject,
public util::IComparable {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~VerticalExtent() override;
//! @endcond
PROJ_DLL double minimumValue() PROJ_PURE_DECL;
PROJ_DLL double maximumValue() PROJ_PURE_DECL;
PROJ_DLL common::UnitOfMeasureNNPtr &unit() PROJ_PURE_DECL;
PROJ_DLL static VerticalExtentNNPtr
create(double minimumValue, double maximumValue,
const common::UnitOfMeasureNNPtr &unitIn);
//! @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
PROJ_DLL bool contains(const VerticalExtentNNPtr &other) const;
PROJ_DLL bool intersects(const VerticalExtentNNPtr &other) const;
protected:
PROJ_INTERNAL VerticalExtent(double minimumValue, double maximumValue,
const common::UnitOfMeasureNNPtr &unitIn);
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
};
// ---------------------------------------------------------------------------
class Extent;
/** Shared pointer of Extent. */
using ExtentPtr = std::shared_ptr<Extent>;
/** Non-null shared pointer of Extent. */
using ExtentNNPtr = util::nn<ExtentPtr>;
/** \brief Information about spatial, vertical, and temporal extent.
*
* \remark Simplified version of [Extent]
* (http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/metadata/extent/Extent.html)
* from \ref GeoAPI
*/
class PROJ_GCC_DLL Extent : public util::BaseObject, public util::IComparable {
public:
//! @cond Doxygen_Suppress
PROJ_DLL Extent(const Extent &other);
PROJ_DLL ~Extent() override;
//! @endcond
PROJ_DLL const util::optional<std::string> &description() PROJ_PURE_DECL;
PROJ_DLL const std::vector<GeographicExtentNNPtr> &
geographicElements() PROJ_PURE_DECL;
PROJ_DLL const std::vector<TemporalExtentNNPtr> &
temporalElements() PROJ_PURE_DECL;
PROJ_DLL const std::vector<VerticalExtentNNPtr> &
verticalElements() PROJ_PURE_DECL;
PROJ_DLL static ExtentNNPtr
create(const util::optional<std::string> &descriptionIn,
const std::vector<GeographicExtentNNPtr> &geographicElementsIn,
const std::vector<VerticalExtentNNPtr> &verticalElementsIn,
const std::vector<TemporalExtentNNPtr> &temporalElementsIn);
PROJ_DLL static ExtentNNPtr
createFromBBOX(double west, double south, double east, double north,
const util::optional<std::string> &descriptionIn =
util::optional<std::string>());
//! @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
PROJ_DLL bool contains(const ExtentNNPtr &other) const;
PROJ_DLL bool intersects(const ExtentNNPtr &other) const;
PROJ_DLL ExtentPtr intersection(const ExtentNNPtr &other) const;
PROJ_DLL static const ExtentNNPtr WORLD;
protected:
PROJ_INTERNAL Extent();
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
Extent &operator=(const Extent &other) = delete;
};
// ---------------------------------------------------------------------------
class Identifier;
/** Shared pointer of Identifier. */
using IdentifierPtr = std::shared_ptr<Identifier>;
/** Non-null shared pointer of Identifier. */
using IdentifierNNPtr = util::nn<IdentifierPtr>;
/** \brief Value uniquely identifying an object within a namespace.
*
* \remark Implements Identifier as described in \ref ISO_19111_2019 but which
* originates from \ref ISO_19115
*/
class PROJ_GCC_DLL Identifier : public util::BaseObject,
public io::IWKTExportable,
public io::IJSONExportable {
public:
//! @cond Doxygen_Suppress
PROJ_DLL Identifier(const Identifier &other);
PROJ_DLL ~Identifier() override;
//! @endcond
PROJ_DLL static IdentifierNNPtr
create(const std::string &codeIn = std::string(),
const util::PropertyMap &properties =
util::PropertyMap()); // throw(InvalidValueTypeException)
PROJ_DLL static const std::string AUTHORITY_KEY;
PROJ_DLL static const std::string CODE_KEY;
PROJ_DLL static const std::string CODESPACE_KEY;
PROJ_DLL static const std::string VERSION_KEY;
PROJ_DLL static const std::string DESCRIPTION_KEY;
PROJ_DLL static const std::string URI_KEY;
PROJ_DLL static const std::string EPSG;
PROJ_DLL static const std::string OGC;
PROJ_DLL const util::optional<Citation> &authority() PROJ_PURE_DECL;
PROJ_DLL const std::string &code() PROJ_PURE_DECL;
PROJ_DLL const util::optional<std::string> &codeSpace() PROJ_PURE_DECL;
PROJ_DLL const util::optional<std::string> &version() PROJ_PURE_DECL;
PROJ_DLL const util::optional<std::string> &description() PROJ_PURE_DECL;
PROJ_DLL const util::optional<std::string> &uri() PROJ_PURE_DECL;
PROJ_DLL static bool isEquivalentName(const char *a,
const char *b) noexcept;
PROJ_PRIVATE :
//! @cond Doxygen_Suppress
PROJ_INTERNAL static std::string
canonicalizeName(const std::string &str);
PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter)
const override; // throw(io::FormattingException)
PROJ_INTERNAL void _exportToJSON(io::JSONFormatter *formatter)
const override; // throw(io::FormattingException)
//! @endcond
protected:
PROJ_INTERNAL explicit Identifier(const std::string &codeIn,
const util::PropertyMap &properties);
PROJ_INTERNAL explicit Identifier();
PROJ_FRIEND_OPTIONAL(Identifier);
INLINED_MAKE_SHARED
Identifier &operator=(const Identifier &other) = delete;
PROJ_FRIEND(common::IdentifiedObject);
PROJ_INTERNAL static IdentifierNNPtr
createFromDescription(const std::string &descriptionIn);
private:
PROJ_OPAQUE_PRIVATE_DATA
};
// ---------------------------------------------------------------------------
class PositionalAccuracy;
/** Shared pointer of PositionalAccuracy. */
using PositionalAccuracyPtr = std::shared_ptr<PositionalAccuracy>;
/** Non-null shared pointer of PositionalAccuracy. */
using PositionalAccuracyNNPtr = util::nn<PositionalAccuracyPtr>;
/** \brief Accuracy of the position of features.
*
* \remark Simplified version of [PositionalAccuracy]
* (http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/metadata/quality/PositionalAccuracy.html)
* from \ref GeoAPI, which originates from \ref ISO_19115
*/
class PROJ_GCC_DLL PositionalAccuracy : public util::BaseObject {
public:
//! @cond Doxygen_Suppress
PROJ_DLL ~PositionalAccuracy() override;
//! @endcond
PROJ_DLL const std::string &value() PROJ_PURE_DECL;
PROJ_DLL static PositionalAccuracyNNPtr create(const std::string &valueIn);
protected:
PROJ_INTERNAL explicit PositionalAccuracy(const std::string &valueIn);
INLINED_MAKE_SHARED
private:
PROJ_OPAQUE_PRIVATE_DATA
PositionalAccuracy(const PositionalAccuracy &other) = delete;
PositionalAccuracy &operator=(const PositionalAccuracy &other) = delete;
};
} // namespace metadata
NS_PROJ_END
#endif // METADATA_HH_INCLUDED