diff options
Diffstat (limited to 'include/proj/io.hpp')
| -rw-r--r-- | include/proj/io.hpp | 970 |
1 files changed, 970 insertions, 0 deletions
diff --git a/include/proj/io.hpp b/include/proj/io.hpp new file mode 100644 index 00000000..689fede1 --- /dev/null +++ b/include/proj/io.hpp @@ -0,0 +1,970 @@ +/****************************************************************************** + * + * 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 IO_HH_INCLUDED +#define IO_HH_INCLUDED + +#include <list> +#include <memory> +#include <set> +#include <string> +#include <utility> +#include <vector> + +#include "util.hpp" + +NS_PROJ_START + +namespace common { +class UnitOfMeasure; +using UnitOfMeasurePtr = std::shared_ptr<UnitOfMeasure>; +using UnitOfMeasureNNPtr = util::nn<UnitOfMeasurePtr>; + +class IdentifiedObject; +using IdentifiedObjectPtr = std::shared_ptr<IdentifiedObject>; +using IdentifiedObjectNNPtr = util::nn<IdentifiedObjectPtr>; +} // namespace common + +namespace cs { +class CoordinateSystem; +using CoordinateSystemPtr = std::shared_ptr<CoordinateSystem>; +using CoordinateSystemNNPtr = util::nn<CoordinateSystemPtr>; +} // namespace cs + +namespace metadata { +class Extent; +using ExtentPtr = std::shared_ptr<Extent>; +using ExtentNNPtr = util::nn<ExtentPtr>; +} // namespace metadata + +namespace datum { +class Datum; +using DatumPtr = std::shared_ptr<Datum>; +using DatumNNPtr = util::nn<DatumPtr>; + +class Ellipsoid; +using EllipsoidPtr = std::shared_ptr<Ellipsoid>; +using EllipsoidNNPtr = util::nn<EllipsoidPtr>; + +class PrimeMeridian; +using PrimeMeridianPtr = std::shared_ptr<PrimeMeridian>; +using PrimeMeridianNNPtr = util::nn<PrimeMeridianPtr>; + +class GeodeticReferenceFrame; +using GeodeticReferenceFramePtr = std::shared_ptr<GeodeticReferenceFrame>; +using GeodeticReferenceFrameNNPtr = util::nn<GeodeticReferenceFramePtr>; + +class VerticalReferenceFrame; +using VerticalReferenceFramePtr = std::shared_ptr<VerticalReferenceFrame>; +using VerticalReferenceFrameNNPtr = util::nn<VerticalReferenceFramePtr>; +} // namespace datum + +namespace crs { +class CRS; +using CRSPtr = std::shared_ptr<CRS>; +using CRSNNPtr = util::nn<CRSPtr>; + +class GeodeticCRS; +using GeodeticCRSPtr = std::shared_ptr<GeodeticCRS>; +using GeodeticCRSNNPtr = util::nn<GeodeticCRSPtr>; + +class GeographicCRS; +using GeographicCRSPtr = std::shared_ptr<GeographicCRS>; +using GeographicCRSNNPtr = util::nn<GeographicCRSPtr>; + +class VerticalCRS; +using VerticalCRSPtr = std::shared_ptr<VerticalCRS>; +using VerticalCRSNNPtr = util::nn<VerticalCRSPtr>; + +class ProjectedCRS; +using ProjectedCRSPtr = std::shared_ptr<ProjectedCRS>; +using ProjectedCRSNNPtr = util::nn<ProjectedCRSPtr>; + +class CompoundCRS; +using CompoundCRSPtr = std::shared_ptr<CompoundCRS>; +using CompoundCRSNNPtr = util::nn<CompoundCRSPtr>; +} // namespace crs + +namespace operation { +class Conversion; +using ConversionPtr = std::shared_ptr<Conversion>; +using ConversionNNPtr = util::nn<ConversionPtr>; + +class CoordinateOperation; +using CoordinateOperationPtr = std::shared_ptr<CoordinateOperation>; +using CoordinateOperationNNPtr = util::nn<CoordinateOperationPtr>; +} // namespace operation + +/** osgeo.proj.io namespace. + * + * \brief I/O classes + */ +namespace io { + +class DatabaseContext; +/** Shared pointer of DatabaseContext. */ +using DatabaseContextPtr = std::shared_ptr<DatabaseContext>; +/** Non-null shared pointer of DatabaseContext. */ +using DatabaseContextNNPtr = util::nn<DatabaseContextPtr>; + +// --------------------------------------------------------------------------- + +class WKTFormatter; +/** WKTFormatter unique pointer. */ +using WKTFormatterPtr = std::unique_ptr<WKTFormatter>; +/** Non-null WKTFormatter unique pointer. */ +using WKTFormatterNNPtr = util::nn<WKTFormatterPtr>; + +/** \brief Formatter to WKT strings. + * + * An instance of this class can only be used by a single + * thread at a time. + */ +class PROJ_GCC_DLL WKTFormatter { + public: + /** WKT variant. */ + enum class PROJ_MSVC_DLL Convention { + /** Full WKT2 string, conforming to ISO 19162:2015(E) / OGC 12-063r5 + * (\ref WKT2_2015) with all possible nodes and new keyword names. + */ + WKT2, + WKT2_2015 = WKT2, + + /** Same as WKT2 with the following exceptions: + * <ul> + * <li>UNIT keyword used.</li> + * <li>ID node only on top element.</li> + * <li>No ORDER element in AXIS element.</li> + * <li>PRIMEM node omitted if it is Greenwich.</li> + * <li>ELLIPSOID.UNIT node omitted if it is + * UnitOfMeasure::METRE.</li> + * <li>PARAMETER.UNIT / PRIMEM.UNIT omitted if same as AXIS.</li> + * <li>AXIS.UNIT omitted and replaced by a common GEODCRS.UNIT if + * they are all the same on all axis.</li> + * </ul> + */ + WKT2_SIMPLIFIED, + WKT2_2015_SIMPLIFIED = WKT2_SIMPLIFIED, + + /** Full WKT2 string, conforming to ISO 19162:2018 / OGC 18-010, with + * (\ref WKT2_2018) all possible nodes and new keyword names. + * Non-normative list of differences: + * <ul> + * <li>WKT2_2018 uses GEOGCRS / BASEGEOGCRS keywords for + * GeographicCRS.</li> + * </ul> + */ + WKT2_2018, + + /** WKT2_2018 with the simplification rule of WKT2_SIMPLIFIED */ + WKT2_2018_SIMPLIFIED, + + /** WKT1 as traditionally output by GDAL, deriving from OGC 01-009. + A notable departuPROJ_GCC_DLLre from WKT1_GDAL with respect to OGC + 01-009 is + that in WKT1_GDAL, the unit of the PRIMEM value is always degrees. + */ + WKT1_GDAL, + + /** WKT1 as traditionally output by ESRI software, + * deriving from OGC 99-049. */ + WKT1_ESRI, + }; + + PROJ_DLL static WKTFormatterNNPtr + create(Convention convention = Convention::WKT2, + DatabaseContextPtr dbContext = nullptr); + PROJ_DLL static WKTFormatterNNPtr create(const WKTFormatterNNPtr &other); + //! @cond Doxygen_Suppress + PROJ_DLL ~WKTFormatter(); + //! @endcond + + PROJ_DLL WKTFormatter &setMultiLine(bool multiLine) noexcept; + PROJ_DLL WKTFormatter &setIndentationWidth(int width) noexcept; + PROJ_DLL WKTFormatter &setOutputAxis(bool outputAxis) noexcept; + PROJ_DLL WKTFormatter &setStrict(bool strict) noexcept; + PROJ_DLL bool isStrict() const noexcept; + + PROJ_DLL const std::string &toString() const; + + PROJ_PRIVATE : + //! @cond Doxygen_Suppress + PROJ_DLL WKTFormatter & + setOutputId(bool outputIdIn); + + PROJ_INTERNAL void enter(); + PROJ_INTERNAL void leave(); + + PROJ_INTERNAL void startNode(const std::string &keyword, bool hasId); + PROJ_INTERNAL void endNode(); + + PROJ_DLL WKTFormatter &simulCurNodeHasId(); + + PROJ_INTERNAL void addQuotedString(const char *str); + PROJ_INTERNAL void addQuotedString(const std::string &str); + PROJ_INTERNAL void add(const std::string &str); + PROJ_INTERNAL void add(int number); + PROJ_INTERNAL void add(size_t number) = delete; + PROJ_INTERNAL void add(double number, int precision = 15); + + PROJ_INTERNAL void pushOutputUnit(bool outputUnitIn); + PROJ_INTERNAL void popOutputUnit(); + PROJ_INTERNAL bool outputUnit() const; + + PROJ_INTERNAL void pushOutputId(bool outputIdIn); + PROJ_INTERNAL void popOutputId(); + PROJ_INTERNAL bool outputId() const; + + PROJ_INTERNAL void + pushAxisLinearUnit(const common::UnitOfMeasureNNPtr &unit); + PROJ_INTERNAL void popAxisLinearUnit(); + PROJ_INTERNAL const common::UnitOfMeasureNNPtr &axisLinearUnit() const; + + PROJ_INTERNAL void + pushAxisAngularUnit(const common::UnitOfMeasureNNPtr &unit); + PROJ_INTERNAL void popAxisAngularUnit(); + PROJ_INTERNAL const common::UnitOfMeasureNNPtr &axisAngularUnit() const; + + PROJ_INTERNAL void setAbridgedTransformation(bool abriged); + PROJ_INTERNAL bool abridgedTransformation() const; + + PROJ_INTERNAL void setUseDerivingConversion(bool useDerivingConversionIn); + PROJ_INTERNAL bool useDerivingConversion() const; + + PROJ_INTERNAL void setTOWGS84Parameters(const std::vector<double> ¶ms); + PROJ_INTERNAL const std::vector<double> &getTOWGS84Parameters() const; + + PROJ_INTERNAL void setVDatumExtension(const std::string &filename); + PROJ_INTERNAL const std::string &getVDatumExtension() const; + + PROJ_INTERNAL void setHDatumExtension(const std::string &filename); + PROJ_INTERNAL const std::string &getHDatumExtension() const; + + PROJ_INTERNAL static std::string morphNameToESRI(const std::string &name); + +#ifdef unused + PROJ_INTERNAL void startInversion(); + PROJ_INTERNAL void stopInversion(); + PROJ_INTERNAL bool isInverted() const; +#endif + + PROJ_INTERNAL bool outputAxis() const; + PROJ_INTERNAL bool outputAxisOrder() const; + PROJ_INTERNAL bool primeMeridianOmittedIfGreenwich() const; + PROJ_INTERNAL bool ellipsoidUnitOmittedIfMetre() const; + PROJ_INTERNAL bool forceUNITKeyword() const; + PROJ_INTERNAL bool primeMeridianOrParameterUnitOmittedIfSameAsAxis() const; + PROJ_INTERNAL bool primeMeridianInDegree() const; + PROJ_INTERNAL bool outputCSUnitOnlyOnceIfSame() const; + + /** WKT version. */ + enum class Version { + /** WKT1 */ + WKT1, + /** WKT2 / ISO 19162 */ + WKT2 + }; + + PROJ_INTERNAL Version version() const; + PROJ_INTERNAL bool use2018Keywords() const; + PROJ_INTERNAL bool useESRIDialect() const; + + PROJ_INTERNAL const DatabaseContextPtr &databaseContext() const; + + //! @endcond + + protected: + //! @cond Doxygen_Suppress + PROJ_INTERNAL explicit WKTFormatter(Convention convention); + WKTFormatter(const WKTFormatter &other) = delete; + + INLINED_MAKE_UNIQUE + //! @endcond + + private: + PROJ_OPAQUE_PRIVATE_DATA +}; + +// --------------------------------------------------------------------------- + +class PROJStringFormatter; +/** PROJStringFormatter unique pointer. */ +using PROJStringFormatterPtr = std::unique_ptr<PROJStringFormatter>; +/** Non-null PROJStringFormatter unique pointer. */ +using PROJStringFormatterNNPtr = util::nn<PROJStringFormatterPtr>; + +/** \brief Formatter to PROJ strings. + * + * An instance of this class can only be used by a single + * thread at a time. + */ +class PROJ_GCC_DLL PROJStringFormatter { + public: + /** PROJ variant. */ + enum class PROJ_MSVC_DLL Convention { + /** PROJ v5 (or later versions) string. */ + PROJ_5, + + /** PROJ v4 string as output by GDAL exportToProj4() */ + PROJ_4 + }; + + PROJ_DLL static PROJStringFormatterNNPtr + create(Convention conventionIn = Convention::PROJ_5, + DatabaseContextPtr dbContext = nullptr); + //! @cond Doxygen_Suppress + PROJ_DLL ~PROJStringFormatter(); + //! @endcond + + PROJ_DLL void setUseETMercForTMerc(bool flag); + + PROJ_DLL const std::string &toString() const; + + PROJ_PRIVATE : + //! @cond Doxygen_Suppress + + PROJ_DLL void + startInversion(); + PROJ_DLL void stopInversion(); + PROJ_INTERNAL bool isInverted() const; + PROJ_INTERNAL bool getUseETMercForTMerc() const; + + PROJ_DLL void + ingestPROJString(const std::string &str); // throw ParsingException + + PROJ_DLL void addStep(const char *step); + PROJ_DLL void addStep(const std::string &step); + PROJ_DLL void setCurrentStepInverted(bool inverted); + PROJ_DLL void addParam(const std::string ¶mName); + PROJ_DLL void addParam(const char *paramName, double val); + PROJ_DLL void addParam(const std::string ¶mName, double val); + PROJ_DLL void addParam(const char *paramName, int val); + PROJ_DLL void addParam(const std::string ¶mName, int val); + PROJ_DLL void addParam(const char *paramName, const char *val); + PROJ_DLL void addParam(const char *paramName, const std::string &val); + PROJ_DLL void addParam(const std::string ¶mName, const char *val); + PROJ_DLL void addParam(const std::string ¶mName, + const std::string &val); + PROJ_DLL void addParam(const char *paramName, + const std::vector<double> &vals); + + PROJ_INTERNAL std::set<std::string> getUsedGridNames() const; + + PROJ_INTERNAL void setTOWGS84Parameters(const std::vector<double> ¶ms); + PROJ_INTERNAL const std::vector<double> &getTOWGS84Parameters() const; + + PROJ_INTERNAL void setVDatumExtension(const std::string &filename); + PROJ_INTERNAL const std::string &getVDatumExtension() const; + + PROJ_INTERNAL void setHDatumExtension(const std::string &filename); + PROJ_INTERNAL const std::string &getHDatumExtension() const; + + PROJ_INTERNAL void setOmitProjLongLatIfPossible(bool omit); + PROJ_INTERNAL bool omitProjLongLatIfPossible() const; + + PROJ_INTERNAL void setOmitZUnitConversion(bool omit); + PROJ_INTERNAL bool omitZUnitConversion() const; + + PROJ_INTERNAL const DatabaseContextPtr &databaseContext() const; + + PROJ_INTERNAL Convention convention() const; + + //! @endcond + + protected: + //! @cond Doxygen_Suppress + PROJ_INTERNAL explicit PROJStringFormatter( + Convention conventionIn, const DatabaseContextPtr &dbContext); + PROJStringFormatter(const PROJStringFormatter &other) = delete; + + INLINED_MAKE_UNIQUE + //! @endcond + + private: + PROJ_OPAQUE_PRIVATE_DATA +}; + +// --------------------------------------------------------------------------- + +/** \brief Exception possibly thrown by IWKTExportable::exportToWKT() or + * IPROJStringExportable::exportToPROJString(). */ +class PROJ_GCC_DLL FormattingException : public util::Exception { + public: + //! @cond Doxygen_Suppress + PROJ_INTERNAL explicit FormattingException(const char *message); + PROJ_INTERNAL explicit FormattingException(const std::string &message); + PROJ_DLL FormattingException(const FormattingException &other); + PROJ_DLL virtual ~FormattingException() override; + + PROJ_INTERNAL static void Throw(const char *msg) PROJ_NO_RETURN; + PROJ_INTERNAL static void Throw(const std::string &msg) PROJ_NO_RETURN; + //! @endcond +}; + +// --------------------------------------------------------------------------- + +/** \brief Exception possibly thrown by WKTNode::createFrom() or + * WKTParser::createFromWKT(). */ +class PROJ_GCC_DLL ParsingException : public util::Exception { + public: + //! @cond Doxygen_Suppress + PROJ_INTERNAL explicit ParsingException(const char *message); + PROJ_INTERNAL explicit ParsingException(const std::string &message); + PROJ_DLL ParsingException(const ParsingException &other); + PROJ_DLL virtual ~ParsingException() override; + //! @endcond +}; + +// --------------------------------------------------------------------------- + +/** \brief Interface for an object that can be exported to WKT. */ +class PROJ_GCC_DLL IWKTExportable { + public: + //! @cond Doxygen_Suppress + PROJ_DLL virtual ~IWKTExportable(); + //! @endcond + + /** Builds a WKT representation. May throw a FormattingException */ + PROJ_DLL std::string + exportToWKT(WKTFormatter *formatter) const; // throw(FormattingException) + + PROJ_PRIVATE : + + //! @cond Doxygen_Suppress + PROJ_INTERNAL virtual void + _exportToWKT( + WKTFormatter *formatter) const = 0; // throw(FormattingException) + //! @endcond +}; + +// --------------------------------------------------------------------------- + +class IPROJStringExportable; +/** Shared pointer of IPROJStringExportable. */ +using IPROJStringExportablePtr = std::shared_ptr<IPROJStringExportable>; +/** Non-null shared pointer of IPROJStringExportable. */ +using IPROJStringExportableNNPtr = util::nn<IPROJStringExportablePtr>; + +/** \brief Interface for an object that can be exported to a PROJ string. */ +class PROJ_GCC_DLL IPROJStringExportable { + public: + //! @cond Doxygen_Suppress + PROJ_DLL virtual ~IPROJStringExportable(); + //! @endcond + + /** \brief Builds a PROJ string representation. + * + * <ul> + * <li>For PROJStringFormatter::Convention::PROJ_5 (the default), return + * strings that generally express PROJ.5 pipelines. + * <ul> + * <li>For a crs::GeographicCRS, returns a string expressing the + * transformation from geographic coordinates expressed in radian with + * longitude, latitude order, and with respect to the international + * reference meridian, into geographic coordinates expressed in the units + * and axis order of the CRS, taking into account its prime meridian.</li> + * <li>For a geocentric crs::GeodeticCRS, returns a string expressing the + * transformation from geographic coordinates expressed in radian with + * longitude, latitude order, and with respect to the international + * reference meridian, into geocentric coordinates.</li> + * <li>For a + * crs::ProjectedCRS / crs::DerivedGeographicCRS / crs::DerivedProjectedCRS, + * returns a string expressing the transformation from the base CRS to the + * CRS</li> + * <li>For a crs::BoundCRS, throws a FormattingException.</li> + * <li>For operation::CoordinateTransformations, returns a PROJ + * pipeline.</li> + * </ul> + * + * <li>For PROJStringFormatter::Convention::PROJ_4, format a string + * compatible with the OGRSpatialReference::exportToProj4() of GDAL + * <=2.3. + * <ul> + * <li>For a crs::GeographicCRS, returns a proj=longlat string, with + * ellipsoid / datum / prime meridian information, ignoring axis order + * and unit information.</li> + * <li>For a geocentric crs::GeodeticCRS, returns the transformation from + * geographic coordinates into geocentric coordinates.</li> + * <li>For a crs::ProjectedCRS, returns the projection method, ignoring + * axis order.</li> + * <li>For a crs::BoundCRS, returns the PROJ string of its source/base CRS, + * amended with towgs84 / nadgrids parameter when the deriving conversion + * can be expressed in that way.</li> + * </ul> + * </li> + * + * </ul> + * + * @param formatter PROJ string formatter. + * @return a PROJ string. + * @throw FormattingException */ + PROJ_DLL std::string exportToPROJString( + PROJStringFormatter *formatter) const; // throw(FormattingException) + + PROJ_PRIVATE : + + //! @cond Doxygen_Suppress + PROJ_INTERNAL virtual void + _exportToPROJString(PROJStringFormatter *formatter) + const = 0; // throw(FormattingException) + //! @endcond +}; + +// --------------------------------------------------------------------------- + +class WKTNode; +/** Unique pointer of WKTNode. */ +using WKTNodePtr = std::unique_ptr<WKTNode>; +/** Non-null unique pointer of WKTNode. */ +using WKTNodeNNPtr = util::nn<WKTNodePtr>; + +/** \brief Node in the tree-splitted WKT representation. + */ +class PROJ_GCC_DLL WKTNode { + public: + PROJ_DLL explicit WKTNode(const std::string &valueIn); + //! @cond Doxygen_Suppress + PROJ_DLL ~WKTNode(); + //! @endcond + + PROJ_DLL const std::string &value() const; + PROJ_DLL const std::vector<WKTNodeNNPtr> &children() const; + + PROJ_DLL void addChild(WKTNodeNNPtr &&child); + PROJ_DLL const WKTNodePtr &lookForChild(const std::string &childName, + int occurrence = 0) const noexcept; + PROJ_DLL int countChildrenOfName(const std::string &childName) const + noexcept; + + PROJ_DLL std::string toString() const; + + PROJ_DLL static WKTNodeNNPtr createFrom(const std::string &wkt, + size_t indexStart = 0); + + protected: + PROJ_INTERNAL static WKTNodeNNPtr + createFrom(const std::string &wkt, size_t indexStart, int recLevel, + size_t &indexEnd); // throw(ParsingException) + + private: + friend class WKTParser; + PROJ_OPAQUE_PRIVATE_DATA +}; + +// --------------------------------------------------------------------------- + +PROJ_DLL util::BaseObjectNNPtr +createFromUserInput(const std::string &text, + const DatabaseContextPtr &dbContext); + +// --------------------------------------------------------------------------- + +/** \brief Parse a WKT string into the appropriate suclass of util::BaseObject. + */ +class PROJ_GCC_DLL WKTParser { + public: + PROJ_DLL WKTParser(); + //! @cond Doxygen_Suppress + PROJ_DLL ~WKTParser(); + //! @endcond + + PROJ_DLL WKTParser & + attachDatabaseContext(const DatabaseContextPtr &dbContext); + + PROJ_DLL WKTParser &setStrict(bool strict); + PROJ_DLL std::vector<std::string> warningList() const; + + PROJ_DLL util::BaseObjectNNPtr + createFromWKT(const std::string &wkt); // throw(ParsingException) + + /** Guessed WKT "dialect" */ + enum class PROJ_MSVC_DLL WKTGuessedDialect { + /** \ref WKT2_2018 */ + WKT2_2018, + /** \ref WKT2_2015 */ + WKT2_2015, + /** \ref WKT1 */ + WKT1_GDAL, + /** ESRI variant of WKT1 */ + WKT1_ESRI, + /** Not WKT / unrecognized */ + NOT_WKT + }; + + // cppcheck-suppress functionStatic + PROJ_DLL WKTGuessedDialect guessDialect(const std::string &wkt) noexcept; + + private: + PROJ_OPAQUE_PRIVATE_DATA +}; + +// --------------------------------------------------------------------------- + +/** \brief Parse a PROJ string into the appropriate suclass of util::BaseObject. + */ +class PROJ_GCC_DLL PROJStringParser { + public: + PROJ_DLL PROJStringParser(); + //! @cond Doxygen_Suppress + PROJ_DLL ~PROJStringParser(); + //! @endcond + + PROJ_DLL PROJStringParser & + attachDatabaseContext(const DatabaseContextPtr &dbContext); + + PROJ_DLL std::vector<std::string> warningList() const; + + PROJ_DLL util::BaseObjectNNPtr createFromPROJString( + const std::string &projString); // throw(ParsingException) + + private: + PROJ_OPAQUE_PRIVATE_DATA +}; + +// --------------------------------------------------------------------------- + +/** \brief Database context. + * + * A database context should be used only by one thread at a time. + */ +class PROJ_GCC_DLL DatabaseContext { + public: + //! @cond Doxygen_Suppress + PROJ_DLL ~DatabaseContext(); + //! @endcond + + PROJ_DLL static DatabaseContextNNPtr create(); + + PROJ_DLL static DatabaseContextNNPtr + create(const std::string &databasePath); + + PROJ_DLL static DatabaseContextNNPtr + create(const std::string &databasePath, + const std::vector<std::string> &auxiliaryDatabasePaths); + + PROJ_DLL const std::string &getPath() const; + + PROJ_DLL std::set<std::string> getAuthorities() const; + + PROJ_DLL std::vector<std::string> getDatabaseStructure() const; + + PROJ_PRIVATE : + //! @cond Doxygen_Suppress + PROJ_DLL void * + getSqliteHandle() const; + + PROJ_DLL static DatabaseContextNNPtr create(void *sqlite_handle); + + PROJ_INTERNAL void attachPJContext(void *pjCtxt); + + PROJ_INTERNAL bool lookForGridAlternative(const std::string &officialName, + std::string &projFilename, + std::string &projFormat, + bool &inverse) const; + + PROJ_DLL bool lookForGridInfo(const std::string &projFilename, + std::string &fullFilename, + std::string &packageName, std::string &url, + bool &directDownload, bool &openLicense, + bool &gridAvailable) const; + + PROJ_INTERNAL std::string + getAliasFromOfficialName(const std::string &officialName, + const std::string &tableName, + const std::string &source) const; + + PROJ_INTERNAL bool isKnownName(const std::string &name, + const std::string &tableName) const; + + //! @endcond + + protected: + PROJ_INTERNAL DatabaseContext(); + INLINED_MAKE_SHARED + PROJ_FRIEND(AuthorityFactory); + + private: + PROJ_OPAQUE_PRIVATE_DATA + DatabaseContext(const DatabaseContext &) = delete; + DatabaseContext &operator=(const DatabaseContext &other) = delete; +}; + +// --------------------------------------------------------------------------- + +class AuthorityFactory; +/** Shared pointer of AuthorityFactory. */ +using AuthorityFactoryPtr = std::shared_ptr<AuthorityFactory>; +/** Non-null shared pointer of AuthorityFactory. */ +using AuthorityFactoryNNPtr = util::nn<AuthorityFactoryPtr>; + +/** \brief Builds object from an authority database. + * + * A AuthorityFactory should be used only by one thread at a time. + * + * \remark Implements [AuthorityFactory] + * (http://www.geoapi.org/3.0/javadoc/org/opengis/referencing/AuthorityFactory.html) + * from \ref GeoAPI + */ +class PROJ_GCC_DLL AuthorityFactory { + public: + //! @cond Doxygen_Suppress + PROJ_DLL ~AuthorityFactory(); + //! @endcond + + PROJ_DLL util::BaseObjectNNPtr createObject(const std::string &code) const; + + PROJ_DLL common::UnitOfMeasureNNPtr + createUnitOfMeasure(const std::string &code) const; + + PROJ_DLL metadata::ExtentNNPtr createExtent(const std::string &code) const; + + PROJ_DLL datum::PrimeMeridianNNPtr + createPrimeMeridian(const std::string &code) const; + + PROJ_DLL std::string identifyBodyFromSemiMajorAxis(double a, + double tolerance) const; + + PROJ_DLL datum::EllipsoidNNPtr + createEllipsoid(const std::string &code) const; + + PROJ_DLL datum::DatumNNPtr createDatum(const std::string &code) const; + + PROJ_DLL datum::GeodeticReferenceFrameNNPtr + createGeodeticDatum(const std::string &code) const; + + PROJ_DLL datum::VerticalReferenceFrameNNPtr + createVerticalDatum(const std::string &code) const; + + PROJ_DLL cs::CoordinateSystemNNPtr + createCoordinateSystem(const std::string &code) const; + + PROJ_DLL crs::GeodeticCRSNNPtr + createGeodeticCRS(const std::string &code) const; + + PROJ_DLL crs::GeographicCRSNNPtr + createGeographicCRS(const std::string &code) const; + + PROJ_DLL crs::VerticalCRSNNPtr + createVerticalCRS(const std::string &code) const; + + PROJ_DLL operation::ConversionNNPtr + createConversion(const std::string &code) const; + + PROJ_DLL crs::ProjectedCRSNNPtr + createProjectedCRS(const std::string &code) const; + + PROJ_DLL crs::CompoundCRSNNPtr + createCompoundCRS(const std::string &code) const; + + PROJ_DLL crs::CRSNNPtr + createCoordinateReferenceSystem(const std::string &code) const; + + PROJ_DLL operation::CoordinateOperationNNPtr + createCoordinateOperation(const std::string &code, + bool usePROJAlternativeGridNames) const; + + PROJ_DLL std::vector<operation::CoordinateOperationNNPtr> + createFromCoordinateReferenceSystemCodes( + const std::string &sourceCRSCode, + const std::string &targetCRSCode) const; + + PROJ_DLL const std::string &getAuthority() PROJ_CONST_DECL; + + /** Object type. */ + enum class ObjectType { + /** Object of type datum::PrimeMeridian */ + PRIME_MERIDIAN, + /** Object of type datum::Ellipsoid */ + ELLIPSOID, + /** Object of type datum::Datum (and derived classes) */ + DATUM, + /** Object of type datum::GeodeticReferenceFrame (and derived + classes) */ + GEODETIC_REFERENCE_FRAME, + /** Object of type datum::VerticalReferenceFrame (and derived + classes) */ + VERTICAL_REFERENCE_FRAME, + /** Object of type crs::CRS (and derived classes) */ + CRS, + /** Object of type crs::GeodeticCRS (and derived classes) */ + GEODETIC_CRS, + /** GEODETIC_CRS of type geocentric */ + GEOCENTRIC_CRS, + /** Object of type crs::GeographicCRS (and derived classes) */ + GEOGRAPHIC_CRS, + /** GEOGRAPHIC_CRS of type Geographic 2D */ + GEOGRAPHIC_2D_CRS, + /** GEOGRAPHIC_CRS of type Geographic 3D */ + GEOGRAPHIC_3D_CRS, + /** Object of type crs::ProjectedCRS (and derived classes) */ + PROJECTED_CRS, + /** Object of type crs::VerticalCRS (and derived classes) */ + VERTICAL_CRS, + /** Object of type crs::CompoundCRS (and derived classes) */ + COMPOUND_CRS, + /** Object of type operation::CoordinateOperation (and derived + classes) */ + COORDINATE_OPERATION, + /** Object of type operation::Conversion (and derived classes) */ + CONVERSION, + /** Object of type operation::Transformation (and derived classes) + */ + TRANSFORMATION, + /** Object of type operation::ConcatenatedOperation (and derived + classes) */ + CONCATENATED_OPERATION, + }; + + PROJ_DLL std::set<std::string> + getAuthorityCodes(const ObjectType &type, + bool allowDeprecated = true) const; + + PROJ_DLL std::string getDescriptionText(const std::string &code) const; + + // non-standard + PROJ_DLL static AuthorityFactoryNNPtr + create(const DatabaseContextNNPtr &context, + const std::string &authorityName); + + PROJ_DLL const DatabaseContextNNPtr &databaseContext() const; + + PROJ_DLL std::vector<operation::CoordinateOperationNNPtr> + createFromCoordinateReferenceSystemCodes( + const std::string &sourceCRSAuthName, const std::string &sourceCRSCode, + const std::string &targetCRSAuthName, const std::string &targetCRSCode, + bool usePROJAlternativeGridNames, bool discardIfMissingGrid) const; + + PROJ_DLL std::vector<operation::CoordinateOperationNNPtr> + createFromCRSCodesWithIntermediates( + const std::string &sourceCRSAuthName, const std::string &sourceCRSCode, + const std::string &targetCRSAuthName, const std::string &targetCRSCode, + bool usePROJAlternativeGridNames, bool discardIfMissingGrid, + const std::vector<std::pair<std::string, std::string>> + &intermediateCRSAuthCodes) const; + + PROJ_DLL std::string getOfficialNameFromAlias( + const std::string &aliasedName, const std::string &tableName, + const std::string &source, std::string &outTableName, + std::string &outAuthName, std::string &outCode) const; + + PROJ_DLL std::list<common::IdentifiedObjectNNPtr> + createObjectsFromName(const std::string &name, + const std::vector<ObjectType> &allowedObjectTypes = + std::vector<ObjectType>(), + bool approximateMatch = true, + size_t limitResultCount = 0); + + PROJ_PRIVATE : + //! @cond Doxygen_Suppress + + PROJ_INTERNAL std::list<datum::EllipsoidNNPtr> + createEllipsoidFromExisting( + const datum::EllipsoidNNPtr &ellipsoid) const; + + PROJ_INTERNAL std::list<crs::GeodeticCRSNNPtr> + createGeodeticCRSFromDatum(const std::string &datum_auth_name, + const std::string &datum_code, + const std::string &geodetic_crs_type) const; + + PROJ_INTERNAL std::list<crs::GeodeticCRSNNPtr> + createGeodeticCRSFromEllipsoid(const std::string &ellipsoid_auth_name, + const std::string &ellipsoid_code, + const std::string &geodetic_crs_type) const; + + PROJ_INTERNAL std::list<crs::ProjectedCRSNNPtr> + createProjectedCRSFromExisting(const crs::ProjectedCRSNNPtr &crs) const; + + PROJ_INTERNAL std::list<crs::CompoundCRSNNPtr> + createCompoundCRSFromExisting(const crs::CompoundCRSNNPtr &crs) const; + //! @endcond + + protected: + PROJ_INTERNAL AuthorityFactory(const DatabaseContextNNPtr &context, + const std::string &authorityName); + + PROJ_INTERNAL crs::CRSNNPtr + createCoordinateReferenceSystem(const std::string &code, + bool allowCompound) const; + + PROJ_INTERNAL crs::GeodeticCRSNNPtr + createGeodeticCRS(const std::string &code, bool geographicOnly) const; + + PROJ_INTERNAL operation::CoordinateOperationNNPtr + createCoordinateOperation(const std::string &code, bool allowConcatenated, + bool usePROJAlternativeGridNames) const; + + INLINED_MAKE_SHARED + + private: + PROJ_OPAQUE_PRIVATE_DATA +}; + +// --------------------------------------------------------------------------- + +/** \brief Exception thrown when a factory can't create an instance of the + * requested object. + */ +class PROJ_GCC_DLL FactoryException : public util::Exception { + public: + //! @cond Doxygen_Suppress + PROJ_DLL explicit FactoryException(const char *message); + PROJ_DLL explicit FactoryException(const std::string &message); + PROJ_DLL + FactoryException(const FactoryException &other); + PROJ_DLL ~FactoryException() override; + //! @endcond +}; + +// --------------------------------------------------------------------------- + +/** \brief Exception thrown when an authority factory can't find the requested + * authority code. + */ +class PROJ_GCC_DLL NoSuchAuthorityCodeException : public FactoryException { + public: + //! @cond Doxygen_Suppress + PROJ_DLL explicit NoSuchAuthorityCodeException(const std::string &message, + const std::string &authority, + const std::string &code); + PROJ_DLL + NoSuchAuthorityCodeException(const NoSuchAuthorityCodeException &other); + PROJ_DLL ~NoSuchAuthorityCodeException() override; + //! @endcond + + PROJ_DLL const std::string &getAuthority() const; + PROJ_DLL const std::string &getAuthorityCode() const; + + private: + PROJ_OPAQUE_PRIVATE_DATA +}; + +} // namespace io + +NS_PROJ_END + +#endif // IO_HH_INCLUDED |
