PROJ C++ API
coordinateoperation.hpp
1 /******************************************************************************
2  *
3  * Project: PROJ
4  * Purpose: ISO19111:2018 implementation
5  * Author: Even Rouault <even dot rouault at spatialys dot com>
6  *
7  ******************************************************************************
8  * Copyright (c) 2018, Even Rouault <even dot rouault at spatialys dot com>
9  *
10  * Permission is hereby granted, free of charge, to any person obtaining a
11  * copy of this software and associated documentation files (the "Software"),
12  * to deal in the Software without restriction, including without limitation
13  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14  * and/or sell copies of the Software, and to permit persons to whom the
15  * Software is furnished to do so, subject to the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be included
18  * in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26  * DEALINGS IN THE SOFTWARE.
27  ****************************************************************************/
28 
29 #ifndef COORDINATEOPERATION_HH_INCLUDED
30 #define COORDINATEOPERATION_HH_INCLUDED
31 
32 #include <memory>
33 #include <string>
34 #include <utility>
35 #include <vector>
36 
37 #include "common.hpp"
38 #include "io.hpp"
39 #include "metadata.hpp"
40 
41 NS_PROJ_START
42 
43 namespace crs {
44 class CRS;
45 using CRSPtr = std::shared_ptr<CRS>;
46 using CRSNNPtr = util::nn<CRSPtr>;
47 
48 class DerivedCRS;
49 class ProjectedCRS;
50 } // namespace crs
51 
60 namespace operation {
61 
62 // ---------------------------------------------------------------------------
63 
66  std::string shortName{};
67  std::string fullName{};
68  std::string packageName{};
69  std::string url{};
71  bool directDownload = false;
72  bool openLicense =
73  false;
74  bool available = false;
76  bool operator<(const GridDescription &other) const {
78  return shortName < other.shortName;
79  }
80 
81  PROJ_DLL GridDescription();
82  PROJ_DLL ~GridDescription();
83  PROJ_DLL GridDescription(const GridDescription &);
84  PROJ_DLL GridDescription(GridDescription &&) noexcept;
86 };
87 
88 // ---------------------------------------------------------------------------
89 
92 using CoordinateOperationPtr = std::shared_ptr<CoordinateOperation>;
94 using CoordinateOperationNNPtr = util::nn<CoordinateOperationPtr>;
95 
119  public io::IWKTExportable,
121  public:
123  PROJ_DLL ~CoordinateOperation() override;
125 
126  PROJ_DLL const util::optional<std::string> &operationVersion() const;
127  PROJ_DLL const std::vector<metadata::PositionalAccuracyNNPtr> &
128  coordinateOperationAccuracies() const;
129 
130  PROJ_DLL const crs::CRSPtr sourceCRS() const;
131  PROJ_DLL const crs::CRSPtr targetCRS() const;
132  PROJ_DLL const crs::CRSPtr &interpolationCRS() const;
133  PROJ_DLL const util::optional<common::DataEpoch> &
134  sourceCoordinateEpoch() const;
135  PROJ_DLL const util::optional<common::DataEpoch> &
136  targetCoordinateEpoch() const;
137 
138  // virtual void transform(...) = 0; TODO
139 
143  PROJ_DLL virtual CoordinateOperationNNPtr inverse() const = 0;
144 
146  PROJ_DLL virtual std::set<GridDescription>
147  gridsNeeded(const io::DatabaseContextPtr &databaseContext) const = 0;
148 
149  PROJ_DLL bool
150  isPROJInstanciable(const io::DatabaseContextPtr &databaseContext) const;
151 
152  protected:
155 
156  PROJ_FRIEND(crs::DerivedCRS);
157  PROJ_FRIEND(io::AuthorityFactory);
158  PROJ_FRIEND(CoordinateOperationFactory);
159  void setWeakSourceTargetCRS(std::weak_ptr<crs::CRS> sourceCRSIn,
160  std::weak_ptr<crs::CRS> targetCRSIn);
161  void setCRSs(const crs::CRSNNPtr &sourceCRSIn,
162  const crs::CRSNNPtr &targetCRSIn,
163  const crs::CRSPtr &interpolationCRSIn);
164  void setAccuracies(
165  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
166 
167  private:
168  PROJ_OPAQUE_PRIVATE_DATA
169  CoordinateOperation &operator=(const CoordinateOperation &other) = delete;
170 };
171 
172 // ---------------------------------------------------------------------------
173 
180  public:
182  PROJ_DLL ~GeneralOperationParameter() override;
184 
185  PROJ_DLL bool
186  isEquivalentTo(const util::IComparable *other,
187  util::IComparable::Criterion criterion =
188  util::IComparable::Criterion::STRICT) const override = 0;
189 
190  protected:
193 
194  private:
195  PROJ_OPAQUE_PRIVATE_DATA
197  operator=(const GeneralOperationParameter &other) = delete;
198 };
199 
201 using GeneralOperationParameterPtr = std::shared_ptr<GeneralOperationParameter>;
203 using GeneralOperationParameterNNPtr = util::nn<GeneralOperationParameterPtr>;
204 
205 // ---------------------------------------------------------------------------
206 
207 class OperationParameter;
209 using OperationParameterPtr = std::shared_ptr<OperationParameter>;
211 using OperationParameterNNPtr = util::nn<OperationParameterPtr>;
212 
221  public:
223  PROJ_DLL ~OperationParameter() override;
225 
226  PROJ_DLL bool
227  isEquivalentTo(const util::IComparable *other,
228  util::IComparable::Criterion criterion =
229  util::IComparable::Criterion::STRICT) const override;
230 
231  // non-standard
232  PROJ_DLL static OperationParameterNNPtr
233  create(const util::PropertyMap &properties);
234 
235  protected:
238  INLINED_MAKE_SHARED
239 
240  private:
241  PROJ_OPAQUE_PRIVATE_DATA
242  OperationParameter &operator=(const OperationParameter &other) = delete;
243 };
244 
245 // ---------------------------------------------------------------------------
246 
248 struct MethodMapping;
250 
257  public io::IWKTExportable,
258  public util::IComparable {
259  public:
261  PROJ_DLL ~GeneralParameterValue() override;
262 
263  void _exportToWKT(io::WKTFormatter *formatter) const override =
264  0; // throw(io::FormattingException)
266 
267  PROJ_DLL bool
268  isEquivalentTo(const util::IComparable *other,
269  util::IComparable::Criterion criterion =
270  util::IComparable::Criterion::STRICT) const override = 0;
271 
272  protected:
276 
277  friend class Conversion;
278  friend class SingleOperation;
279  virtual void _exportToWKT(io::WKTFormatter *formatter,
280  const MethodMapping *mapping)
281  const = 0; // throw(io::FormattingException)
283 
284  private:
285  PROJ_OPAQUE_PRIVATE_DATA
287  operator=(const GeneralParameterValue &other) = delete;
288 };
289 
291 using GeneralParameterValuePtr = std::shared_ptr<GeneralParameterValue>;
293 using GeneralParameterValueNNPtr = util::nn<GeneralParameterValuePtr>;
294 
295 // ---------------------------------------------------------------------------
296 
297 class ParameterValue;
299 using ParameterValuePtr = std::shared_ptr<ParameterValue>;
301 using ParameterValueNNPtr = util::nn<ParameterValuePtr>;
302 
310 class ParameterValue final : public util::BaseObject,
311  public io::IWKTExportable,
312  public util::IComparable {
313  public:
315  enum class Type {
317  MEASURE,
319  STRING,
321  INTEGER,
323  BOOLEAN,
325  FILENAME
326  };
328  PROJ_DLL ~ParameterValue() override;
329 
330  void _exportToWKT(io::WKTFormatter *formatter)
331  const override; // throw(io::FormattingException)
333 
334  PROJ_DLL static ParameterValueNNPtr
335  create(const common::Measure &measureIn);
336  PROJ_DLL static ParameterValueNNPtr create(const char *stringValueIn);
337  PROJ_DLL static ParameterValueNNPtr
338  create(const std::string &stringValueIn);
339  PROJ_DLL static ParameterValueNNPtr create(int integerValueIn);
340  PROJ_DLL static ParameterValueNNPtr create(bool booleanValueIn);
341  PROJ_DLL static ParameterValueNNPtr
342  createFilename(const std::string &stringValueIn);
343 
344  PROJ_DLL const Type &type() PROJ_CONST_DECL;
345  PROJ_DLL const common::Measure &value() PROJ_CONST_DECL;
346  PROJ_DLL const std::string &stringValue() PROJ_CONST_DECL;
347  PROJ_DLL const std::string &valueFile() PROJ_CONST_DECL;
348  PROJ_DLL int integerValue() PROJ_CONST_DECL;
349  PROJ_DLL bool booleanValue() PROJ_CONST_DECL;
350 
351  PROJ_DLL bool
352  isEquivalentTo(const util::IComparable *other,
353  util::IComparable::Criterion criterion =
354  util::IComparable::Criterion::STRICT) const override;
355 
356  protected:
357  explicit ParameterValue(const common::Measure &measureIn);
358  explicit ParameterValue(const std::string &stringValueIn, Type typeIn);
359  explicit ParameterValue(int integerValueIn);
360  explicit ParameterValue(bool booleanValueIn);
361  INLINED_MAKE_SHARED
362  private:
363  PROJ_OPAQUE_PRIVATE_DATA
364  ParameterValue &operator=(const ParameterValue &other) = delete;
365 };
366 
367 // ---------------------------------------------------------------------------
368 
371 using OperationParameterValuePtr = std::shared_ptr<OperationParameterValue>;
373 using OperationParameterValueNNPtr = util::nn<OperationParameterValuePtr>;
374 
383  public:
385  PROJ_DLL ~OperationParameterValue() override;
387 
388  PROJ_DLL const OperationParameterNNPtr &parameter() PROJ_CONST_DECL;
389  PROJ_DLL const ParameterValueNNPtr &parameterValue() PROJ_CONST_DECL;
390 
391  PROJ_DLL bool
392  isEquivalentTo(const util::IComparable *other,
393  util::IComparable::Criterion criterion =
394  util::IComparable::Criterion::STRICT) const override;
395 
396  PROJ_DLL static OperationParameterValueNNPtr
397  create(const OperationParameterNNPtr &parameterIn,
398  const ParameterValueNNPtr &valueIn);
399 
400  PROJ_PRIVATE :
402  static bool
403  convertFromAbridged(const std::string &paramName, double &val,
404  const common::UnitOfMeasure *&unit,
405  int &paramEPSGCode);
406 
407  void _exportToWKT(io::WKTFormatter *formatter)
408  const override; // throw(io::FormattingException)
409 
411 
412  protected:
414  const ParameterValueNNPtr &valueIn);
416  INLINED_MAKE_SHARED
417 
418  void _exportToWKT(io::WKTFormatter *formatter,
419  const MethodMapping *mapping)
420  const override; // throw(io::FormattingException)
421 
422  private:
423  PROJ_OPAQUE_PRIVATE_DATA
425  operator=(const OperationParameterValue &other) = delete;
426 };
427 
428 // ---------------------------------------------------------------------------
429 
430 class OperationMethod;
432 using OperationMethodPtr = std::shared_ptr<OperationMethod>;
434 using OperationMethodNNPtr = util::nn<OperationMethodPtr>;
435 
445  public io::IWKTExportable {
446  public:
448  PROJ_DLL ~OperationMethod() override;
450 
451  PROJ_DLL const util::optional<std::string> &formula() PROJ_CONST_DECL;
452  PROJ_DLL const util::optional<metadata::Citation> &
453  formulaCitation() PROJ_CONST_DECL;
454  PROJ_DLL const std::vector<GeneralOperationParameterNNPtr> &
455  parameters() PROJ_CONST_DECL;
456 
458  void _exportToWKT(io::WKTFormatter *formatter)
459  const override; // throw(io::FormattingException)
461 
462  PROJ_DLL static OperationMethodNNPtr
463  create(const util::PropertyMap &properties,
464  const std::vector<GeneralOperationParameterNNPtr> &parameters);
465 
466  PROJ_DLL static OperationMethodNNPtr
467  create(const util::PropertyMap &properties,
468  const std::vector<OperationParameterNNPtr> &parameters);
469 
470  PROJ_DLL bool
471  isEquivalentTo(const util::IComparable *other,
472  util::IComparable::Criterion criterion =
473  util::IComparable::Criterion::STRICT) const override;
474 
475  protected:
476  OperationMethod();
477  OperationMethod(const OperationMethod &other);
478  INLINED_MAKE_SHARED
479 
480  private:
481  PROJ_OPAQUE_PRIVATE_DATA
482  OperationMethod &operator=(const OperationMethod &other) = delete;
483 };
484 
485 // ---------------------------------------------------------------------------
486 
491  public:
493  PROJ_DLL explicit InvalidOperation(const char *message);
494  PROJ_DLL explicit InvalidOperation(const std::string &message);
495  PROJ_DLL InvalidOperation(const InvalidOperation &other);
496  PROJ_DLL ~InvalidOperation() override;
498 };
499 
500 // ---------------------------------------------------------------------------
501 
502 class SingleOperation;
504 using SingleOperationPtr = std::shared_ptr<SingleOperation>;
506 using SingleOperationNNPtr = util::nn<SingleOperationPtr>;
507 
513 class SingleOperation : virtual public CoordinateOperation {
514  public:
516  PROJ_DLL ~SingleOperation() override;
518 
519  PROJ_DLL const std::vector<GeneralParameterValueNNPtr> &
520  parameterValues() PROJ_CONST_DECL;
521  PROJ_DLL const OperationMethodNNPtr &method() PROJ_CONST_DECL;
522 
523  PROJ_DLL const ParameterValuePtr &
524  parameterValue(const std::string &paramName, int epsg_code = 0) const
525  noexcept;
526  PROJ_DLL const common::Measure &
527  parameterValueMeasure(const std::string &paramName, int epsg_code = 0) const
528  noexcept;
529 
530  PROJ_DLL static SingleOperationNNPtr createPROJBased(
531  const util::PropertyMap &properties, const std::string &PROJString,
532  const crs::CRSPtr &sourceCRS, const crs::CRSPtr &targetCRS,
533  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies =
534  std::vector<metadata::PositionalAccuracyNNPtr>());
535 
536  PROJ_DLL bool
537  isEquivalentTo(const util::IComparable *other,
538  util::IComparable::Criterion criterion =
539  util::IComparable::Criterion::STRICT) const override;
540 
541  PROJ_DLL std::set<GridDescription>
542  gridsNeeded(const io::DatabaseContextPtr &databaseContext) const override;
543 
544  PROJ_PRIVATE :
546  double
547  parameterValueNumeric(const std::string &paramName, int epsg_code,
548  const common::UnitOfMeasure &targetUnit) const
549  noexcept;
550  double parameterValueNumeric(const char *paramName, int epsg_code,
551  const common::UnitOfMeasure &targetUnit) const
552  noexcept;
553  double parameterValueNumericAsSI(const std::string &paramName,
554  int epsg_code) const noexcept;
555  double parameterValueNumericAsSI(const char *paramName, int epsg_code) const
556  noexcept;
558 
559  protected:
560  explicit SingleOperation(const OperationMethodNNPtr &methodIn);
561  SingleOperation(const SingleOperation &other);
562 
563  void
564  setParameterValues(const std::vector<GeneralParameterValueNNPtr> &values);
565 
566  void exportTransformationToWKT(io::WKTFormatter *formatter) const;
567 
568  bool exportToPROJStringGeneric(io::PROJStringFormatter *formatter) const;
569 
570  private:
571  PROJ_OPAQUE_PRIVATE_DATA
572  SingleOperation &operator=(const SingleOperation &other) = delete;
573 };
574 
575 // ---------------------------------------------------------------------------
576 
577 class Conversion;
579 using ConversionPtr = std::shared_ptr<Conversion>;
581 using ConversionNNPtr = util::nn<ConversionPtr>;
582 
786 class Conversion : public SingleOperation {
787  public:
789  PROJ_DLL ~Conversion() override;
791 
793  ConversionNNPtr shallowClone() const;
795 
796  PROJ_DLL CoordinateOperationNNPtr inverse() const override;
797 
799  void _exportToWKT(io::WKTFormatter *formatter)
800  const override; // throw(io::FormattingException)
802 
803  PROJ_DLL bool isUTM(int &zone, bool &north) const;
804 
805  PROJ_DLL ConversionNNPtr identify() const;
806 
807  PROJ_DLL static ConversionNNPtr
808  create(const util::PropertyMap &properties,
809  const OperationMethodNNPtr &methodIn,
810  const std::vector<GeneralParameterValueNNPtr>
811  &values); // throw InvalidOperation
812 
813  PROJ_DLL static ConversionNNPtr
814  create(const util::PropertyMap &propertiesConversion,
815  const util::PropertyMap &propertiesOperationMethod,
816  const std::vector<OperationParameterNNPtr> &parameters,
817  const std::vector<ParameterValueNNPtr>
818  &values); // throw InvalidOperation
819 
820  PROJ_DLL static ConversionNNPtr
821  createUTM(const util::PropertyMap &properties, int zone, bool north);
822 
823  PROJ_DLL static ConversionNNPtr createTransverseMercator(
824  const util::PropertyMap &properties, const common::Angle &centerLat,
825  const common::Angle &centerLong, const common::Scale &scale,
826  const common::Length &falseEasting,
827  const common::Length &falseNorthing);
828 
829  PROJ_DLL static ConversionNNPtr createGaussSchreiberTransverseMercator(
830  const util::PropertyMap &properties, const common::Angle &centerLat,
831  const common::Angle &centerLong, const common::Scale &scale,
832  const common::Length &falseEasting,
833  const common::Length &falseNorthing);
834 
835  PROJ_DLL static ConversionNNPtr createTransverseMercatorSouthOriented(
836  const util::PropertyMap &properties, const common::Angle &centerLat,
837  const common::Angle &centerLong, const common::Scale &scale,
838  const common::Length &falseEasting,
839  const common::Length &falseNorthing);
840 
841  PROJ_DLL static ConversionNNPtr
842  createTwoPointEquidistant(const util::PropertyMap &properties,
843  const common::Angle &latitudeFirstPoint,
844  const common::Angle &longitudeFirstPoint,
845  const common::Angle &latitudeSecondPoint,
846  const common::Angle &longitudeSeconPoint,
847  const common::Length &falseEasting,
848  const common::Length &falseNorthing);
849 
850  PROJ_DLL static ConversionNNPtr createTunisiaMappingGrid(
851  const util::PropertyMap &properties, const common::Angle &centerLat,
852  const common::Angle &centerLong, const common::Length &falseEasting,
853  const common::Length &falseNorthing);
854 
855  PROJ_DLL static ConversionNNPtr
856  createAlbersEqualArea(const util::PropertyMap &properties,
857  const common::Angle &latitudeFalseOrigin,
858  const common::Angle &longitudeFalseOrigin,
859  const common::Angle &latitudeFirstParallel,
860  const common::Angle &latitudeSecondParallel,
861  const common::Length &eastingFalseOrigin,
862  const common::Length &eastingNorthOrigin);
863 
864  PROJ_DLL static ConversionNNPtr createLambertConicConformal_1SP(
865  const util::PropertyMap &properties, const common::Angle &centerLat,
866  const common::Angle &centerLong, const common::Scale &scale,
867  const common::Length &falseEasting,
868  const common::Length &falseNorthing);
869 
870  PROJ_DLL static ConversionNNPtr
871  createLambertConicConformal_2SP(const util::PropertyMap &properties,
872  const common::Angle &latitudeFalseOrigin,
873  const common::Angle &longitudeFalseOrigin,
874  const common::Angle &latitudeFirstParallel,
875  const common::Angle &latitudeSecondParallel,
876  const common::Length &eastingFalseOrigin,
877  const common::Length &eastingNorthOrigin);
878 
879  PROJ_DLL static ConversionNNPtr createLambertConicConformal_2SP_Michigan(
880  const util::PropertyMap &properties,
881  const common::Angle &latitudeFalseOrigin,
882  const common::Angle &longitudeFalseOrigin,
883  const common::Angle &latitudeFirstParallel,
884  const common::Angle &latitudeSecondParallel,
885  const common::Length &eastingFalseOrigin,
886  const common::Length &eastingNorthOrigin,
887  const common::Scale &ellipsoidScalingFactor);
888 
889  PROJ_DLL static ConversionNNPtr createLambertConicConformal_2SP_Belgium(
890  const util::PropertyMap &properties,
891  const common::Angle &latitudeFalseOrigin,
892  const common::Angle &longitudeFalseOrigin,
893  const common::Angle &latitudeFirstParallel,
894  const common::Angle &latitudeSecondParallel,
895  const common::Length &eastingFalseOrigin,
896  const common::Length &eastingNorthOrigin);
897 
898  PROJ_DLL static ConversionNNPtr
899  createAzimuthalEquidistant(const util::PropertyMap &properties,
900  const common::Angle &latitudeNatOrigin,
901  const common::Angle &longitudeNatOrigin,
902  const common::Length &falseEasting,
903  const common::Length &falseNorthing);
904 
905  PROJ_DLL static ConversionNNPtr
906  createGuamProjection(const util::PropertyMap &properties,
907  const common::Angle &latitudeNatOrigin,
908  const common::Angle &longitudeNatOrigin,
909  const common::Length &falseEasting,
910  const common::Length &falseNorthing);
911 
912  PROJ_DLL static ConversionNNPtr
913  createBonne(const util::PropertyMap &properties,
914  const common::Angle &latitudeNatOrigin,
915  const common::Angle &longitudeNatOrigin,
916  const common::Length &falseEasting,
917  const common::Length &falseNorthing);
918 
919  PROJ_DLL static ConversionNNPtr createLambertCylindricalEqualAreaSpherical(
920  const util::PropertyMap &properties,
921  const common::Angle &latitudeFirstParallel,
922  const common::Angle &longitudeNatOrigin,
923  const common::Length &falseEasting,
924  const common::Length &falseNorthing);
925 
926  PROJ_DLL static ConversionNNPtr createLambertCylindricalEqualArea(
927  const util::PropertyMap &properties,
928  const common::Angle &latitudeFirstParallel,
929  const common::Angle &longitudeNatOrigin,
930  const common::Length &falseEasting,
931  const common::Length &falseNorthing);
932 
933  PROJ_DLL static ConversionNNPtr createCassiniSoldner(
934  const util::PropertyMap &properties, const common::Angle &centerLat,
935  const common::Angle &centerLong, const common::Length &falseEasting,
936  const common::Length &falseNorthing);
937 
938  PROJ_DLL static ConversionNNPtr
939  createEquidistantConic(const util::PropertyMap &properties,
940  const common::Angle &centerLat,
941  const common::Angle &centerLong,
942  const common::Angle &latitudeFirstParallel,
943  const common::Angle &latitudeSecondParallel,
944  const common::Length &falseEasting,
945  const common::Length &falseNorthing);
946 
947  PROJ_DLL static ConversionNNPtr
948  createEckertI(const util::PropertyMap &properties,
949  const common::Angle &centerLong,
950  const common::Length &falseEasting,
951  const common::Length &falseNorthing);
952 
953  PROJ_DLL static ConversionNNPtr
954  createEckertII(const util::PropertyMap &properties,
955  const common::Angle &centerLong,
956  const common::Length &falseEasting,
957  const common::Length &falseNorthing);
958 
959  PROJ_DLL static ConversionNNPtr
960  createEckertIII(const util::PropertyMap &properties,
961  const common::Angle &centerLong,
962  const common::Length &falseEasting,
963  const common::Length &falseNorthing);
964 
965  PROJ_DLL static ConversionNNPtr
966  createEckertIV(const util::PropertyMap &properties,
967  const common::Angle &centerLong,
968  const common::Length &falseEasting,
969  const common::Length &falseNorthing);
970 
971  PROJ_DLL static ConversionNNPtr
972  createEckertV(const util::PropertyMap &properties,
973  const common::Angle &centerLong,
974  const common::Length &falseEasting,
975  const common::Length &falseNorthing);
976 
977  PROJ_DLL static ConversionNNPtr
978  createEckertVI(const util::PropertyMap &properties,
979  const common::Angle &centerLong,
980  const common::Length &falseEasting,
981  const common::Length &falseNorthing);
982 
983  PROJ_DLL static ConversionNNPtr
984  createEquidistantCylindrical(const util::PropertyMap &properties,
985  const common::Angle &latitudeFirstParallel,
986  const common::Angle &longitudeNatOrigin,
987  const common::Length &falseEasting,
988  const common::Length &falseNorthing);
989 
990  PROJ_DLL static ConversionNNPtr createEquidistantCylindricalSpherical(
991  const util::PropertyMap &properties,
992  const common::Angle &latitudeFirstParallel,
993  const common::Angle &longitudeNatOrigin,
994  const common::Length &falseEasting,
995  const common::Length &falseNorthing);
996 
997  PROJ_DLL static ConversionNNPtr
998  createGall(const util::PropertyMap &properties,
999  const common::Angle &centerLong,
1000  const common::Length &falseEasting,
1001  const common::Length &falseNorthing);
1002 
1003  PROJ_DLL static ConversionNNPtr
1004  createGoodeHomolosine(const util::PropertyMap &properties,
1005  const common::Angle &centerLong,
1006  const common::Length &falseEasting,
1007  const common::Length &falseNorthing);
1008 
1009  PROJ_DLL static ConversionNNPtr
1010  createInterruptedGoodeHomolosine(const util::PropertyMap &properties,
1011  const common::Angle &centerLong,
1012  const common::Length &falseEasting,
1013  const common::Length &falseNorthing);
1014 
1015  PROJ_DLL static ConversionNNPtr createGeostationarySatelliteSweepX(
1016  const util::PropertyMap &properties, const common::Angle &centerLong,
1017  const common::Length &height, const common::Length &falseEasting,
1018  const common::Length &falseNorthing);
1019 
1020  PROJ_DLL static ConversionNNPtr createGeostationarySatelliteSweepY(
1021  const util::PropertyMap &properties, const common::Angle &centerLong,
1022  const common::Length &height, const common::Length &falseEasting,
1023  const common::Length &falseNorthing);
1024 
1025  PROJ_DLL static ConversionNNPtr createGnomonic(
1026  const util::PropertyMap &properties, const common::Angle &centerLat,
1027  const common::Angle &centerLong, const common::Length &falseEasting,
1028  const common::Length &falseNorthing);
1029 
1030  PROJ_DLL static ConversionNNPtr createHotineObliqueMercatorVariantA(
1031  const util::PropertyMap &properties,
1032  const common::Angle &latitudeProjectionCentre,
1033  const common::Angle &longitudeProjectionCentre,
1034  const common::Angle &azimuthInitialLine,
1035  const common::Angle &angleFromRectifiedToSkrewGrid,
1036  const common::Scale &scale, const common::Length &falseEasting,
1037  const common::Length &falseNorthing);
1038 
1039  PROJ_DLL static ConversionNNPtr createHotineObliqueMercatorVariantB(
1040  const util::PropertyMap &properties,
1041  const common::Angle &latitudeProjectionCentre,
1042  const common::Angle &longitudeProjectionCentre,
1043  const common::Angle &azimuthInitialLine,
1044  const common::Angle &angleFromRectifiedToSkrewGrid,
1045  const common::Scale &scale,
1046  const common::Length &eastingProjectionCentre,
1047  const common::Length &northingProjectionCentre);
1048 
1049  PROJ_DLL static ConversionNNPtr
1050  createHotineObliqueMercatorTwoPointNaturalOrigin(
1051  const util::PropertyMap &properties,
1052  const common::Angle &latitudeProjectionCentre,
1053  const common::Angle &latitudePoint1,
1054  const common::Angle &longitudePoint1,
1055  const common::Angle &latitudePoint2,
1056  const common::Angle &longitudePoint2, const common::Scale &scale,
1057  const common::Length &eastingProjectionCentre,
1058  const common::Length &northingProjectionCentre);
1059 
1060  PROJ_DLL static ConversionNNPtr createInternationalMapWorldPolyconic(
1061  const util::PropertyMap &properties, const common::Angle &centerLong,
1062  const common::Angle &latitudeFirstParallel,
1063  const common::Angle &latitudeSecondParallel,
1064  const common::Length &falseEasting,
1065  const common::Length &falseNorthing);
1066 
1067  PROJ_DLL static ConversionNNPtr createKrovakNorthOriented(
1068  const util::PropertyMap &properties,
1069  const common::Angle &latitudeProjectionCentre,
1070  const common::Angle &longitudeOfOrigin,
1071  const common::Angle &colatitudeConeAxis,
1072  const common::Angle &latitudePseudoStandardParallel,
1073  const common::Scale &scaleFactorPseudoStandardParallel,
1074  const common::Length &falseEasting,
1075  const common::Length &falseNorthing);
1076 
1077  PROJ_DLL static ConversionNNPtr
1078  createKrovak(const util::PropertyMap &properties,
1079  const common::Angle &latitudeProjectionCentre,
1080  const common::Angle &longitudeOfOrigin,
1081  const common::Angle &colatitudeConeAxis,
1082  const common::Angle &latitudePseudoStandardParallel,
1083  const common::Scale &scaleFactorPseudoStandardParallel,
1084  const common::Length &falseEasting,
1085  const common::Length &falseNorthing);
1086 
1087  PROJ_DLL static ConversionNNPtr
1088  createLambertAzimuthalEqualArea(const util::PropertyMap &properties,
1089  const common::Angle &latitudeNatOrigin,
1090  const common::Angle &longitudeNatOrigin,
1091  const common::Length &falseEasting,
1092  const common::Length &falseNorthing);
1093 
1094  PROJ_DLL static ConversionNNPtr createMillerCylindrical(
1095  const util::PropertyMap &properties, const common::Angle &centerLat,
1096  const common::Angle &centerLong, const common::Length &falseEasting,
1097  const common::Length &falseNorthing);
1098 
1099  PROJ_DLL static ConversionNNPtr createMercatorVariantA(
1100  const util::PropertyMap &properties, const common::Angle &centerLat,
1101  const common::Angle &centerLong, const common::Scale &scale,
1102  const common::Length &falseEasting,
1103  const common::Length &falseNorthing);
1104 
1105  PROJ_DLL static ConversionNNPtr
1106  createMercatorVariantB(const util::PropertyMap &properties,
1107  const common::Angle &latitudeFirstParallel,
1108  const common::Angle &centerLong,
1109  const common::Length &falseEasting,
1110  const common::Length &falseNorthing);
1111 
1112  PROJ_DLL static ConversionNNPtr createPopularVisualisationPseudoMercator(
1113  const util::PropertyMap &properties, const common::Angle &centerLat,
1114  const common::Angle &centerLong, const common::Length &falseEasting,
1115  const common::Length &falseNorthing);
1116 
1117  PROJ_DLL static ConversionNNPtr
1118  createMollweide(const util::PropertyMap &properties,
1119  const common::Angle &centerLong,
1120  const common::Length &falseEasting,
1121  const common::Length &falseNorthing);
1122 
1123  PROJ_DLL static ConversionNNPtr createNewZealandMappingGrid(
1124  const util::PropertyMap &properties, const common::Angle &centerLat,
1125  const common::Angle &centerLong, const common::Length &falseEasting,
1126  const common::Length &falseNorthing);
1127 
1128  PROJ_DLL static ConversionNNPtr createObliqueStereographic(
1129  const util::PropertyMap &properties, const common::Angle &centerLat,
1130  const common::Angle &centerLong, const common::Scale &scale,
1131  const common::Length &falseEasting,
1132  const common::Length &falseNorthing);
1133 
1134  PROJ_DLL static ConversionNNPtr createOrthographic(
1135  const util::PropertyMap &properties, const common::Angle &centerLat,
1136  const common::Angle &centerLong, const common::Length &falseEasting,
1137  const common::Length &falseNorthing);
1138 
1139  PROJ_DLL static ConversionNNPtr createAmericanPolyconic(
1140  const util::PropertyMap &properties, const common::Angle &centerLat,
1141  const common::Angle &centerLong, const common::Length &falseEasting,
1142  const common::Length &falseNorthing);
1143 
1144  PROJ_DLL static ConversionNNPtr createPolarStereographicVariantA(
1145  const util::PropertyMap &properties, const common::Angle &centerLat,
1146  const common::Angle &centerLong, const common::Scale &scale,
1147  const common::Length &falseEasting,
1148  const common::Length &falseNorthing);
1149 
1150  PROJ_DLL static ConversionNNPtr createPolarStereographicVariantB(
1151  const util::PropertyMap &properties,
1152  const common::Angle &latitudeStandardParallel,
1153  const common::Angle &longitudeOfOrigin,
1154  const common::Length &falseEasting,
1155  const common::Length &falseNorthing);
1156 
1157  PROJ_DLL static ConversionNNPtr
1158  createRobinson(const util::PropertyMap &properties,
1159  const common::Angle &centerLong,
1160  const common::Length &falseEasting,
1161  const common::Length &falseNorthing);
1162 
1163  PROJ_DLL static ConversionNNPtr
1164  createSinusoidal(const util::PropertyMap &properties,
1165  const common::Angle &centerLong,
1166  const common::Length &falseEasting,
1167  const common::Length &falseNorthing);
1168 
1169  PROJ_DLL static ConversionNNPtr createStereographic(
1170  const util::PropertyMap &properties, const common::Angle &centerLat,
1171  const common::Angle &centerLong, const common::Scale &scale,
1172  const common::Length &falseEasting,
1173  const common::Length &falseNorthing);
1174 
1175  PROJ_DLL static ConversionNNPtr
1176  createVanDerGrinten(const util::PropertyMap &properties,
1177  const common::Angle &centerLong,
1178  const common::Length &falseEasting,
1179  const common::Length &falseNorthing);
1180 
1181  PROJ_DLL static ConversionNNPtr
1182  createWagnerI(const util::PropertyMap &properties,
1183  const common::Angle &centerLong,
1184  const common::Length &falseEasting,
1185  const common::Length &falseNorthing);
1186 
1187  PROJ_DLL static ConversionNNPtr
1188  createWagnerII(const util::PropertyMap &properties,
1189  const common::Angle &centerLong,
1190  const common::Length &falseEasting,
1191  const common::Length &falseNorthing);
1192 
1193  PROJ_DLL static ConversionNNPtr
1194  createWagnerIII(const util::PropertyMap &properties,
1195  const common::Angle &latitudeTrueScale,
1196  const common::Angle &centerLong,
1197  const common::Length &falseEasting,
1198  const common::Length &falseNorthing);
1199 
1200  PROJ_DLL static ConversionNNPtr
1201  createWagnerIV(const util::PropertyMap &properties,
1202  const common::Angle &centerLong,
1203  const common::Length &falseEasting,
1204  const common::Length &falseNorthing);
1205 
1206  PROJ_DLL static ConversionNNPtr
1207  createWagnerV(const util::PropertyMap &properties,
1208  const common::Angle &centerLong,
1209  const common::Length &falseEasting,
1210  const common::Length &falseNorthing);
1211 
1212  PROJ_DLL static ConversionNNPtr
1213  createWagnerVI(const util::PropertyMap &properties,
1214  const common::Angle &centerLong,
1215  const common::Length &falseEasting,
1216  const common::Length &falseNorthing);
1217 
1218  PROJ_DLL static ConversionNNPtr
1219  createWagnerVII(const util::PropertyMap &properties,
1220  const common::Angle &centerLong,
1221  const common::Length &falseEasting,
1222  const common::Length &falseNorthing);
1223 
1224  PROJ_DLL static ConversionNNPtr createQuadrilateralizedSphericalCube(
1225  const util::PropertyMap &properties, const common::Angle &centerLat,
1226  const common::Angle &centerLong, const common::Length &falseEasting,
1227  const common::Length &falseNorthing);
1228 
1229  PROJ_DLL static ConversionNNPtr createSphericalCrossTrackHeight(
1230  const util::PropertyMap &properties, const common::Angle &pegPointLat,
1231  const common::Angle &pegPointLong, const common::Angle &pegPointHeading,
1232  const common::Length &pegPointHeight);
1233 
1234  PROJ_DLL static ConversionNNPtr
1235  createEqualEarth(const util::PropertyMap &properties,
1236  const common::Angle &centerLong,
1237  const common::Length &falseEasting,
1238  const common::Length &falseNorthing);
1239 
1240  PROJ_DLL static ConversionNNPtr
1241  createChangeVerticalUnit(const util::PropertyMap &properties,
1242  const common::Scale &factor);
1243 
1244  PROJ_DLL static ConversionNNPtr createAxisOrderReversal(bool is3D);
1245 
1246  PROJ_PRIVATE : void _exportToPROJString(io::PROJStringFormatter *formatter)
1247  const override; // throw(FormattingException)
1248 
1249  protected:
1250  Conversion(const OperationMethodNNPtr &methodIn,
1251  const std::vector<GeneralParameterValueNNPtr> &values);
1252  Conversion(const Conversion &other);
1253  INLINED_MAKE_SHARED
1254 
1255  PROJ_FRIEND(crs::ProjectedCRS);
1256  void addWKTExtensionNode(io::WKTFormatter *formatter) const;
1257 
1258  private:
1259  PROJ_OPAQUE_PRIVATE_DATA
1260  Conversion &operator=(const Conversion &other) = delete;
1261 
1262  static ConversionNNPtr
1263  create(const util::PropertyMap &properties, int method_epsg_code,
1264  const std::vector<ParameterValueNNPtr> &values);
1265 
1266  static ConversionNNPtr
1267  create(const util::PropertyMap &properties, const char *method_wkt2_name,
1268  const std::vector<ParameterValueNNPtr> &values);
1269 };
1270 
1271 // ---------------------------------------------------------------------------
1272 
1273 class Transformation;
1275 using TransformationPtr = std::shared_ptr<Transformation>;
1277 using TransformationNNPtr = util::nn<TransformationPtr>;
1278 
1294  public:
1296  PROJ_DLL ~Transformation() override;
1298 
1299  PROJ_DLL const crs::CRSNNPtr &sourceCRS() PROJ_CONST_DECL;
1300  PROJ_DLL const crs::CRSNNPtr &targetCRS() PROJ_CONST_DECL;
1301 
1302  PROJ_DLL CoordinateOperationNNPtr inverse() const override;
1303 
1304  PROJ_DLL std::vector<double>
1305  getTOWGS84Parameters() const; // throw(io::FormattingException)
1306 
1307  PROJ_DLL static TransformationNNPtr
1308  create(const util::PropertyMap &properties,
1309  const crs::CRSNNPtr &sourceCRSIn, const crs::CRSNNPtr &targetCRSIn,
1310  const crs::CRSPtr &interpolationCRSIn,
1311  const OperationMethodNNPtr &methodIn,
1312  const std::vector<GeneralParameterValueNNPtr> &values,
1313  const std::vector<metadata::PositionalAccuracyNNPtr>
1314  &accuracies); // throw InvalidOperation
1315 
1316  PROJ_DLL static TransformationNNPtr
1317  create(const util::PropertyMap &propertiesTransformation,
1318  const crs::CRSNNPtr &sourceCRSIn, const crs::CRSNNPtr &targetCRSIn,
1319  const crs::CRSPtr &interpolationCRSIn,
1320  const util::PropertyMap &propertiesOperationMethod,
1321  const std::vector<OperationParameterNNPtr> &parameters,
1322  const std::vector<ParameterValueNNPtr> &values,
1323  const std::vector<metadata::PositionalAccuracyNNPtr>
1324  &accuracies); // throw InvalidOperation
1325 
1326  PROJ_DLL static TransformationNNPtr createGeocentricTranslations(
1327  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1328  const crs::CRSNNPtr &targetCRSIn, double translationXMetre,
1329  double translationYMetre, double translationZMetre,
1330  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1331 
1332  PROJ_DLL static TransformationNNPtr createPositionVector(
1333  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1334  const crs::CRSNNPtr &targetCRSIn, double translationXMetre,
1335  double translationYMetre, double translationZMetre,
1336  double rotationXArcSecond, double rotationYArcSecond,
1337  double rotationZArcSecond, double scaleDifferencePPM,
1338  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1339 
1340  PROJ_DLL static TransformationNNPtr createCoordinateFrameRotation(
1341  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1342  const crs::CRSNNPtr &targetCRSIn, double translationXMetre,
1343  double translationYMetre, double translationZMetre,
1344  double rotationXArcSecond, double rotationYArcSecond,
1345  double rotationZArcSecond, double scaleDifferencePPM,
1346  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1347 
1348  PROJ_DLL static TransformationNNPtr createTimeDependentPositionVector(
1349  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1350  const crs::CRSNNPtr &targetCRSIn, double translationXMetre,
1351  double translationYMetre, double translationZMetre,
1352  double rotationXArcSecond, double rotationYArcSecond,
1353  double rotationZArcSecond, double scaleDifferencePPM,
1354  double rateTranslationX, double rateTranslationY,
1355  double rateTranslationZ, double rateRotationX, double rateRotationY,
1356  double rateRotationZ, double rateScaleDifference,
1357  double referenceEpochYear,
1358  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1359 
1360  PROJ_DLL static TransformationNNPtr
1361  createTimeDependentCoordinateFrameRotation(
1362  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1363  const crs::CRSNNPtr &targetCRSIn, double translationXMetre,
1364  double translationYMetre, double translationZMetre,
1365  double rotationXArcSecond, double rotationYArcSecond,
1366  double rotationZArcSecond, double scaleDifferencePPM,
1367  double rateTranslationX, double rateTranslationY,
1368  double rateTranslationZ, double rateRotationX, double rateRotationY,
1369  double rateRotationZ, double rateScaleDifference,
1370  double referenceEpochYear,
1371  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1372 
1373  PROJ_DLL static TransformationNNPtr createTOWGS84(
1374  const crs::CRSNNPtr &sourceCRSIn,
1375  const std::vector<double> &TOWGS84Parameters); // throw InvalidOperation
1376 
1377  PROJ_DLL static TransformationNNPtr createNTv2(
1378  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1379  const crs::CRSNNPtr &targetCRSIn, const std::string &filename,
1380  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1381 
1382  PROJ_DLL static TransformationNNPtr createMolodensky(
1383  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1384  const crs::CRSNNPtr &targetCRSIn, double translationXMetre,
1385  double translationYMetre, double translationZMetre,
1386  double semiMajorAxisDifferenceMetre, double flattingDifference,
1387  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1388 
1389  PROJ_DLL static TransformationNNPtr createAbridgedMolodensky(
1390  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1391  const crs::CRSNNPtr &targetCRSIn, double translationXMetre,
1392  double translationYMetre, double translationZMetre,
1393  double semiMajorAxisDifferenceMetre, double flattingDifference,
1394  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1395 
1396  PROJ_DLL static TransformationNNPtr
1397  createGravityRelatedHeightToGeographic3D(
1398  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1399  const crs::CRSNNPtr &targetCRSIn, const std::string &filename,
1400  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1401 
1402  PROJ_DLL static TransformationNNPtr createVERTCON(
1403  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1404  const crs::CRSNNPtr &targetCRSIn, const std::string &filename,
1405  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1406 
1407  PROJ_DLL static TransformationNNPtr createLongitudeRotation(
1408  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1409  const crs::CRSNNPtr &targetCRSIn, const common::Angle &offset);
1410 
1411  PROJ_DLL static TransformationNNPtr createGeographic2DOffsets(
1412  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1413  const crs::CRSNNPtr &targetCRSIn, const common::Angle &offsetLat,
1414  const common::Angle &offsetLon,
1415  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1416 
1417  PROJ_DLL static TransformationNNPtr createGeographic3DOffsets(
1418  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1419  const crs::CRSNNPtr &targetCRSIn, const common::Angle &offsetLat,
1420  const common::Angle &offsetLon, const common::Length &offsetHeight,
1421  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1422 
1423  PROJ_DLL static TransformationNNPtr createGeographic2DWithHeightOffsets(
1424  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1425  const crs::CRSNNPtr &targetCRSIn, const common::Angle &offsetLat,
1426  const common::Angle &offsetLon, const common::Length &offsetHeight,
1427  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1428 
1429  PROJ_DLL static TransformationNNPtr createVerticalOffset(
1430  const util::PropertyMap &properties, const crs::CRSNNPtr &sourceCRSIn,
1431  const crs::CRSNNPtr &targetCRSIn, const common::Length &offsetHeight,
1432  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1433 
1434  PROJ_DLL TransformationNNPtr substitutePROJAlternativeGridNames(
1435  io::DatabaseContextNNPtr databaseContext) const;
1436 
1437  PROJ_PRIVATE :
1439  const std::string &
1440  getNTv2Filename() const;
1441 
1442  const std::string &getHeightToGeographic3DFilename() const;
1443 
1444  bool isLongitudeRotation() const;
1445 
1446  void _exportToWKT(io::WKTFormatter *formatter)
1447  const override; // throw(io::FormattingException)
1448 
1450 
1451  protected:
1453  const crs::CRSNNPtr &sourceCRSIn, const crs::CRSNNPtr &targetCRSIn,
1454  const crs::CRSPtr &interpolationCRSIn,
1455  const OperationMethodNNPtr &methodIn,
1456  const std::vector<GeneralParameterValueNNPtr> &values,
1457  const std::vector<metadata::PositionalAccuracyNNPtr> &accuracies);
1458  INLINED_MAKE_SHARED
1459 
1460  void _exportToPROJString(io::PROJStringFormatter *formatter)
1461  const override; // throw(FormattingException)
1462 
1463  TransformationNNPtr inverseAsTransformation() const;
1464 
1465  private:
1466  PROJ_OPAQUE_PRIVATE_DATA
1467  Transformation(const Transformation &) = delete;
1468 };
1469 
1470 // ---------------------------------------------------------------------------
1471 
1472 class PointMotionOperation;
1474 using PointMotionOperationPtr = std::shared_ptr<PointMotionOperation>;
1476 using PointMotionOperationNNPtr = util::nn<PointMotionOperationPtr>;
1477 
1487  public:
1488  // TODO
1490  PROJ_DLL ~PointMotionOperation() override;
1492 
1493  private:
1494  PointMotionOperation(const PointMotionOperation &) = delete;
1495 };
1496 
1497 // ---------------------------------------------------------------------------
1498 
1499 class ConcatenatedOperation;
1501 using ConcatenatedOperationPtr = std::shared_ptr<ConcatenatedOperation>;
1503 using ConcatenatedOperationNNPtr = util::nn<ConcatenatedOperationPtr>;
1504 
1516  public:
1518  PROJ_DLL ~ConcatenatedOperation() override;
1520 
1521  PROJ_DLL const std::vector<CoordinateOperationNNPtr> &operations() const;
1522 
1523  PROJ_DLL CoordinateOperationNNPtr inverse() const override;
1524 
1526  void _exportToWKT(io::WKTFormatter *formatter)
1527  const override; // throw(io::FormattingException)
1529 
1530  PROJ_DLL bool
1531  isEquivalentTo(const util::IComparable *other,
1532  util::IComparable::Criterion criterion =
1533  util::IComparable::Criterion::STRICT) const override;
1534 
1535  PROJ_DLL static ConcatenatedOperationNNPtr
1536  create(const util::PropertyMap &properties,
1537  const std::vector<CoordinateOperationNNPtr> &operationsIn,
1538  const std::vector<metadata::PositionalAccuracyNNPtr>
1539  &accuracies); // throw InvalidOperation
1540 
1541  PROJ_DLL static CoordinateOperationNNPtr createComputeMetadata(
1542  const std::vector<CoordinateOperationNNPtr> &operationsIn,
1543  bool checkExtent); // throw InvalidOperation
1544 
1545  PROJ_DLL std::set<GridDescription>
1546  gridsNeeded(const io::DatabaseContextPtr &databaseContext) const override;
1547 
1548  protected:
1549  explicit ConcatenatedOperation(
1550  const std::vector<CoordinateOperationNNPtr> &operationsIn);
1551 
1552  void _exportToPROJString(io::PROJStringFormatter *formatter)
1553  const override; // throw(FormattingException)
1554 
1555  INLINED_MAKE_SHARED
1556 
1557  private:
1558  PROJ_OPAQUE_PRIVATE_DATA
1560  operator=(const ConcatenatedOperation &other) = delete;
1561 };
1562 
1563 // ---------------------------------------------------------------------------
1564 
1568  std::unique_ptr<CoordinateOperationContext>;
1570 using CoordinateOperationContextNNPtr = util::nn<CoordinateOperationContextPtr>;
1571 
1581  public:
1583  PROJ_DLL virtual ~CoordinateOperationContext();
1585 
1586  PROJ_DLL io::AuthorityFactoryPtr getAuthorityFactory() const;
1587 
1588  PROJ_DLL metadata::ExtentPtr getAreaOfInterest() const;
1589 
1590  PROJ_DLL void setAreaOfInterest(const metadata::ExtentPtr &extent);
1591 
1592  PROJ_DLL double getDesiredAccuracy() const;
1593 
1594  PROJ_DLL void setDesiredAccuracy(double accuracy);
1595 
1601  NONE,
1603  BOTH,
1606  INTERSECTION,
1609  SMALLEST,
1610  };
1611 
1612  PROJ_DLL void setSourceAndTargetCRSExtentUse(SourceTargetCRSExtentUse use);
1613 
1614  PROJ_DLL SourceTargetCRSExtentUse getSourceAndTargetCRSExtentUse() const;
1615 
1617  enum class SpatialCriterion {
1620  STRICT_CONTAINMENT,
1621 
1624  PARTIAL_INTERSECTION
1625  };
1626 
1627  PROJ_DLL void setSpatialCriterion(SpatialCriterion criterion);
1628 
1629  PROJ_DLL SpatialCriterion getSpatialCriterion() const;
1630 
1631  PROJ_DLL void setUsePROJAlternativeGridNames(bool usePROJNames);
1632 
1633  PROJ_DLL bool getUsePROJAlternativeGridNames() const;
1634 
1636  enum class GridAvailabilityUse {
1639  USE_FOR_SORTING,
1640 
1642  DISCARD_OPERATION_IF_MISSING_GRID,
1643 
1646  IGNORE_GRID_AVAILABILITY,
1647  };
1648 
1649  PROJ_DLL void setGridAvailabilityUse(GridAvailabilityUse use);
1650 
1651  PROJ_DLL GridAvailabilityUse getGridAvailabilityUse() const;
1652 
1653  PROJ_DLL void setAllowUseIntermediateCRS(bool use);
1654 
1655  PROJ_DLL bool getAllowUseIntermediateCRS() const;
1656 
1657  PROJ_DLL void
1658  setIntermediateCRS(const std::vector<std::pair<std::string, std::string>>
1659  &intermediateCRSAuthCodes);
1660 
1661  PROJ_DLL const std::vector<std::pair<std::string, std::string>> &
1662  getIntermediateCRS() const;
1663 
1664  PROJ_DLL static CoordinateOperationContextNNPtr
1665  create(const io::AuthorityFactoryPtr &authorityFactory,
1666  const metadata::ExtentPtr &extent, double accuracy);
1667 
1668  protected:
1670  INLINED_MAKE_UNIQUE
1671 
1672  private:
1673  PROJ_OPAQUE_PRIVATE_DATA
1674 };
1675 
1676 // ---------------------------------------------------------------------------
1677 
1681  std::unique_ptr<CoordinateOperationFactory>;
1683 using CoordinateOperationFactoryNNPtr = util::nn<CoordinateOperationFactoryPtr>;
1684 
1694  public:
1696  PROJ_DLL virtual ~CoordinateOperationFactory();
1698 
1699  PROJ_DLL CoordinateOperationPtr createOperation(
1700  const crs::CRSNNPtr &sourceCRS, const crs::CRSNNPtr &targetCRS) const;
1701 
1702  PROJ_DLL std::vector<CoordinateOperationNNPtr>
1703  createOperations(const crs::CRSNNPtr &sourceCRS,
1704  const crs::CRSNNPtr &targetCRS,
1705  const CoordinateOperationContextNNPtr &context) const;
1706 
1707  PROJ_DLL static CoordinateOperationFactoryNNPtr create();
1708 
1709  protected:
1711  INLINED_MAKE_UNIQUE
1712 
1713  private:
1714  PROJ_OPAQUE_PRIVATE_DATA
1715 };
1716 
1717 } // namespace operation
1718 
1719 NS_PROJ_END
1720 
1721 #endif // COORDINATEOPERATION_HH_INCLUDED
std::shared_ptr< ParameterValue > ParameterValuePtr
Definition: coordinateoperation.hpp:299
std::shared_ptr< GeneralOperationParameter > GeneralOperationParameterPtr
Definition: coordinateoperation.hpp:201
Interface for an object that can be compared to another.
Definition: util.hpp:292
util::nn< CoordinateOperationContextPtr > CoordinateOperationContextNNPtr
Definition: coordinateoperation.hpp:1570
util::nn< CoordinateOperationPtr > CoordinateOperationNNPtr
Definition: coordinateoperation.hpp:94
Abstract class modelling a parameter value (OperationParameter) or group of parameters.
Definition: coordinateoperation.hpp:179
A parameter value, ordered sequence of values, or reference to a file of parameter values...
Definition: coordinateoperation.hpp:382
std::shared_ptr< OperationParameter > OperationParameterPtr
Definition: coordinateoperation.hpp:209
std::shared_ptr< SingleOperation > SingleOperationPtr
Definition: coordinateoperation.hpp:504
std::shared_ptr< OperationMethod > OperationMethodPtr
Definition: coordinateoperation.hpp:432
Abstract class modelling a parameter value (OperationParameterValue) or group of parameter values...
Definition: coordinateoperation.hpp:256
A mathematical operation that describes the change of coordinate values within one coordinate referen...
Definition: coordinateoperation.hpp:1486
std::unique_ptr< CoordinateOperationContext > CoordinateOperationContextPtr
Definition: coordinateoperation.hpp:1568
Creates coordinate operations. This factory is capable to find coordinate transformations or conversi...
Definition: coordinateoperation.hpp:1693
Formatter to PROJ strings.
Definition: io.hpp:303
std::shared_ptr< AuthorityFactory > AuthorityFactoryPtr
Definition: io.hpp:668
Numeric value associated with a UnitOfMeasure.
Definition: common.hpp:136
Usage of a CRS-related object.
Definition: common.hpp:399
std::shared_ptr< CRS > CRSPtr
Definition: coordinateoperation.hpp:45
util::nn< OperationParameterValuePtr > OperationParameterValueNNPtr
Definition: coordinateoperation.hpp:373
Context in which a coordinate operation is to be used.
Definition: coordinateoperation.hpp:1580
Root exception class.
Definition: util.hpp:645
util::nn< GeneralOperationParameterPtr > GeneralOperationParameterNNPtr
Definition: coordinateoperation.hpp:203
Numeric value, with a linear unit of measure.
Definition: common.hpp:204
util::nn< PointMotionOperationPtr > PointMotionOperationNNPtr
Definition: coordinateoperation.hpp:1476
An ordered sequence of two or more single coordinate operations (SingleOperation).
Definition: coordinateoperation.hpp:1515
Grid description.
Definition: coordinateoperation.hpp:65
The value of the coordinate operation parameter.
Definition: coordinateoperation.hpp:310
Criterion
Comparison criterion.
Definition: util.hpp:299
std::shared_ptr< Extent > ExtentPtr
Definition: io.hpp:56
A mathematical operation on coordinates in which the parameter values are defined rather than empiric...
Definition: coordinateoperation.hpp:786
GridAvailabilityUse
Definition: coordinateoperation.hpp:1636
std::unique_ptr< CoordinateOperationFactory > CoordinateOperationFactoryPtr
Definition: coordinateoperation.hpp:1681
Abstract class modelling a single coordinate reference system that is defined through the application...
Definition: crs.hpp:433
util::nn< OperationMethodPtr > OperationMethodNNPtr
Definition: coordinateoperation.hpp:434
std::shared_ptr< CoordinateOperation > CoordinateOperationPtr
Definition: coordinateoperation.hpp:92
The definition of a parameter used by a coordinate operation method.
Definition: coordinateoperation.hpp:220
util::nn< DatabaseContextPtr > DatabaseContextNNPtr
Definition: io.hpp:128
Abstract class for a mathematical operation on coordinates.
Definition: coordinateoperation.hpp:118
The method (algorithm or procedure) used to perform the coordinate operation.
Definition: coordinateoperation.hpp:444
util::nn< CRSPtr > CRSNNPtr
Definition: coordinateoperation.hpp:46
util::nn< ParameterValuePtr > ParameterValueNNPtr
Definition: coordinateoperation.hpp:301
util::nn< CoordinateOperationFactoryPtr > CoordinateOperationFactoryNNPtr
Definition: coordinateoperation.hpp:1683
Builds object from an authority database.
Definition: io.hpp:680
Type
Definition: coordinateoperation.hpp:315
std::shared_ptr< DatabaseContext > DatabaseContextPtr
Definition: io.hpp:126
Wrapper of a std::map<std::string, BaseObjectNNPtr>
Definition: util.hpp:410
Class that can be derived from, to emulate Java&#39;s Object behaviour.
Definition: util.hpp:268
SpatialCriterion
Definition: coordinateoperation.hpp:1617
std::string shortName
Definition: coordinateoperation.hpp:66
A derived coordinate reference system which has a geodetic (usually geographic) coordinate reference ...
Definition: crs.hpp:497
Numeric value, with a angular unit of measure.
Definition: common.hpp:186
util::nn< TransformationPtr > TransformationNNPtr
Definition: coordinateoperation.hpp:1277
Interface for an object that can be exported to a PROJ string.
Definition: io.hpp:451
Numeric value, without a physical unit of measure.
Definition: common.hpp:168
std::shared_ptr< OperationParameterValue > OperationParameterValuePtr
Definition: coordinateoperation.hpp:371
Unit of measure.
Definition: common.hpp:60
util::nn< GeneralParameterValuePtr > GeneralParameterValueNNPtr
Definition: coordinateoperation.hpp:293
std::shared_ptr< PointMotionOperation > PointMotionOperationPtr
Definition: coordinateoperation.hpp:1474
std::shared_ptr< Conversion > ConversionPtr
Definition: coordinateoperation.hpp:579
std::shared_ptr< ConcatenatedOperation > ConcatenatedOperationPtr
Definition: coordinateoperation.hpp:1501
Formatter to WKT strings.
Definition: io.hpp:143
util::nn< SingleOperationPtr > SingleOperationNNPtr
Definition: coordinateoperation.hpp:506
std::shared_ptr< GeneralParameterValue > GeneralParameterValuePtr
Definition: coordinateoperation.hpp:291
std::shared_ptr< Transformation > TransformationPtr
Definition: coordinateoperation.hpp:1275
SourceTargetCRSExtentUse
Definition: coordinateoperation.hpp:1599
Interface for an object that can be exported to WKT.
Definition: io.hpp:423
Exception that can be thrown when an invalid operation is attempted to be constructed.
Definition: coordinateoperation.hpp:490
util::nn< OperationParameterPtr > OperationParameterNNPtr
Definition: coordinateoperation.hpp:211
util::nn< ConversionPtr > ConversionNNPtr
Definition: coordinateoperation.hpp:581
Loose transposition of std::optional available from C++17.
Definition: util.hpp:178
util::nn< ConcatenatedOperationPtr > ConcatenatedOperationNNPtr
Definition: coordinateoperation.hpp:1503
A single (not concatenated) coordinate operation (CoordinateOperation)
Definition: coordinateoperation.hpp:513
A mathematical operation on coordinates in which parameters are empirically derived from data contain...
Definition: coordinateoperation.hpp:1293
Identifications of a CRS-related object.
Definition: common.hpp:269