aboutsummaryrefslogtreecommitdiff
path: root/include/proj/internal/coordinateoperation_constants.hpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-11-14 17:40:42 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-11-14 22:48:29 +0100
commitd928db15d53805d9b728b440079756081961c536 (patch)
treee862a961d26bedb34c58e4f28ef0bdeedb5f3225 /include/proj/internal/coordinateoperation_constants.hpp
parent330e8bf686f9c4524075ca1ff50cbca6c9e091da (diff)
downloadPROJ-d928db15d53805d9b728b440079756081961c536.tar.gz
PROJ-d928db15d53805d9b728b440079756081961c536.zip
Implement RFC 2: Initial integration of "GDAL SRS barn" work
This work mostly consists of: - a C++ implementation of the ISO-19111:2018 / OGC Topic 2 "Referencing by coordinates" classes to represent Datums, Coordinate systems, CRSs (Coordinate Reference Systems) and Coordinate Operations. - methods to convert between this C++ modeling and WKT1, WKT2 and PROJ string representations of those objects - management and query of a SQLite3 database of CRS and Coordinate Operation definition - a C API binding part of those capabilities This is all-in-one squashed commit of the work of https://github.com/OSGeo/proj.4/pull/1040
Diffstat (limited to 'include/proj/internal/coordinateoperation_constants.hpp')
-rw-r--r--include/proj/internal/coordinateoperation_constants.hpp898
1 files changed, 898 insertions, 0 deletions
diff --git a/include/proj/internal/coordinateoperation_constants.hpp b/include/proj/internal/coordinateoperation_constants.hpp
new file mode 100644
index 00000000..e999b3a6
--- /dev/null
+++ b/include/proj/internal/coordinateoperation_constants.hpp
@@ -0,0 +1,898 @@
+/******************************************************************************
+ *
+ * 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 FROM_COORDINATE_OPERATION_CPP
+#error This file should only be included from coordinateoperation.cpp
+#endif
+
+#ifndef COORDINATEOPERATION_CONSTANTS_HH_INCLUDED
+#define COORDINATEOPERATION_CONSTANTS_HH_INCLUDED
+
+#include "coordinateoperation_internal.hpp"
+#include "proj_constants.h"
+
+//! @cond Doxygen_Suppress
+// ---------------------------------------------------------------------------
+
+// anonymous namespace
+namespace {
+
+using namespace ::NS_PROJ;
+using namespace ::NS_PROJ::operation;
+
+static const char *WKT1_LATITUDE_OF_ORIGIN = "latitude_of_origin";
+static const char *WKT1_CENTRAL_MERIDIAN = "central_meridian";
+static const char *WKT1_SCALE_FACTOR = "scale_factor";
+static const char *WKT1_FALSE_EASTING = "false_easting";
+static const char *WKT1_FALSE_NORTHING = "false_northing";
+static const char *WKT1_STANDARD_PARALLEL_1 = "standard_parallel_1";
+static const char *WKT1_STANDARD_PARALLEL_2 = "standard_parallel_2";
+static const char *WKT1_LATITUDE_OF_CENTER = "latitude_of_center";
+static const char *WKT1_LONGITUDE_OF_CENTER = "longitude_of_center";
+static const char *WKT1_AZIMUTH = "azimuth";
+static const char *WKT1_RECTIFIED_GRID_ANGLE = "rectified_grid_angle";
+
+static const char *lat_0 = "lat_0";
+static const char *lat_1 = "lat_1";
+static const char *lat_2 = "lat_2";
+static const char *lat_ts = "lat_ts";
+static const char *lon_0 = "lon_0";
+static const char *lon_1 = "lon_1";
+static const char *lon_2 = "lon_2";
+static const char *lonc = "lonc";
+static const char *alpha = "alpha";
+static const char *gamma = "gamma";
+static const char *k_0 = "k_0";
+static const char *k = "k";
+static const char *x_0 = "x_0";
+static const char *y_0 = "y_0";
+static const char *h = "h";
+
+static const ParamMapping paramLatitudeNatOrigin = {
+ EPSG_NAME_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN, WKT1_LATITUDE_OF_ORIGIN,
+ common::UnitOfMeasure::Type::ANGULAR, lat_0};
+
+static const ParamMapping paramLongitudeNatOrigin = {
+ EPSG_NAME_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, WKT1_CENTRAL_MERIDIAN,
+ common::UnitOfMeasure::Type::ANGULAR, lon_0};
+
+static const ParamMapping paramScaleFactor = {
+ EPSG_NAME_PARAMETER_SCALE_FACTOR_AT_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_SCALE_FACTOR_AT_NATURAL_ORIGIN, WKT1_SCALE_FACTOR,
+ common::UnitOfMeasure::Type::SCALE, k_0};
+
+static const ParamMapping paramFalseEasting = {
+ EPSG_NAME_PARAMETER_FALSE_EASTING, EPSG_CODE_PARAMETER_FALSE_EASTING,
+ WKT1_FALSE_EASTING, common::UnitOfMeasure::Type::LINEAR, x_0};
+
+static const ParamMapping paramFalseNorthing = {
+ EPSG_NAME_PARAMETER_FALSE_NORTHING, EPSG_CODE_PARAMETER_FALSE_NORTHING,
+ WKT1_FALSE_NORTHING, common::UnitOfMeasure::Type::LINEAR, y_0};
+
+static const ParamMapping paramLatitudeFalseOrigin = {
+ EPSG_NAME_PARAMETER_LATITUDE_FALSE_ORIGIN,
+ EPSG_CODE_PARAMETER_LATITUDE_FALSE_ORIGIN, WKT1_LATITUDE_OF_ORIGIN,
+ common::UnitOfMeasure::Type::ANGULAR, lat_0};
+
+static const ParamMapping paramLongitudeFalseOrigin = {
+ EPSG_NAME_PARAMETER_LONGITUDE_FALSE_ORIGIN,
+ EPSG_CODE_PARAMETER_LONGITUDE_FALSE_ORIGIN, WKT1_CENTRAL_MERIDIAN,
+ common::UnitOfMeasure::Type::ANGULAR, lon_0};
+
+static const ParamMapping paramFalseEastingOrigin = {
+ EPSG_NAME_PARAMETER_EASTING_FALSE_ORIGIN,
+ EPSG_CODE_PARAMETER_EASTING_FALSE_ORIGIN, WKT1_FALSE_EASTING,
+ common::UnitOfMeasure::Type::LINEAR, x_0};
+
+static const ParamMapping paramFalseNorthingOrigin = {
+ EPSG_NAME_PARAMETER_NORTHING_FALSE_ORIGIN,
+ EPSG_CODE_PARAMETER_NORTHING_FALSE_ORIGIN, WKT1_FALSE_NORTHING,
+ common::UnitOfMeasure::Type::LINEAR, y_0};
+
+static const ParamMapping paramLatitude1stStdParallel = {
+ EPSG_NAME_PARAMETER_LATITUDE_1ST_STD_PARALLEL,
+ EPSG_CODE_PARAMETER_LATITUDE_1ST_STD_PARALLEL, WKT1_STANDARD_PARALLEL_1,
+ common::UnitOfMeasure::Type::ANGULAR, lat_1};
+
+static const ParamMapping paramLatitude2ndStdParallel = {
+ EPSG_NAME_PARAMETER_LATITUDE_2ND_STD_PARALLEL,
+ EPSG_CODE_PARAMETER_LATITUDE_2ND_STD_PARALLEL, WKT1_STANDARD_PARALLEL_2,
+ common::UnitOfMeasure::Type::ANGULAR, lat_2};
+
+static const ParamMapping *const paramsNatOriginScale[] = {
+ &paramLatitudeNatOrigin, &paramLongitudeNatOrigin, &paramScaleFactor,
+ &paramFalseEasting, &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLatFirstPoint = {
+ "Latitude of 1st point", 0, "Latitude_Of_1st_Point",
+ common::UnitOfMeasure::Type::ANGULAR, lat_1};
+static const ParamMapping paramLongFirstPoint = {
+ "Longitude of 1st point", 0, "Longitude_Of_1st_Point",
+ common::UnitOfMeasure::Type::ANGULAR, lon_1};
+static const ParamMapping paramLatSecondPoint = {
+ "Latitude of 2nd point", 0, "Latitude_Of_2nd_Point",
+ common::UnitOfMeasure::Type::ANGULAR, lat_2};
+static const ParamMapping paramLongSecondPoint = {
+ "Longitude of 2nd point", 0, "Longitude_Of_2nd_Point",
+ common::UnitOfMeasure::Type::ANGULAR, lon_2};
+
+static const ParamMapping *const paramsTPEQD[] = {&paramLatFirstPoint,
+ &paramLongFirstPoint,
+ &paramLatSecondPoint,
+ &paramLongSecondPoint,
+ &paramFalseEasting,
+ &paramFalseNorthing,
+ nullptr};
+
+static const ParamMapping *const paramsTMG[] = {
+ &paramLatitudeFalseOrigin, &paramLongitudeFalseOrigin,
+ &paramFalseEastingOrigin, &paramFalseNorthingOrigin, nullptr};
+
+static const ParamMapping paramLatFalseOriginLatOfCenter = {
+ EPSG_NAME_PARAMETER_LATITUDE_FALSE_ORIGIN,
+ EPSG_CODE_PARAMETER_LATITUDE_FALSE_ORIGIN, WKT1_LATITUDE_OF_CENTER,
+ common::UnitOfMeasure::Type::ANGULAR, lat_0};
+
+static const ParamMapping paramLongFalseOriginLongOfCenter = {
+ EPSG_NAME_PARAMETER_LONGITUDE_FALSE_ORIGIN,
+ EPSG_CODE_PARAMETER_LONGITUDE_FALSE_ORIGIN, WKT1_LONGITUDE_OF_CENTER,
+ common::UnitOfMeasure::Type::ANGULAR, lon_0};
+
+static const ParamMapping *const paramsAEA[] = {
+ &paramLatFalseOriginLatOfCenter,
+ &paramLongFalseOriginLongOfCenter,
+ &paramLatitude1stStdParallel,
+ &paramLatitude2ndStdParallel,
+ &paramFalseEastingOrigin,
+ &paramFalseNorthingOrigin,
+ nullptr};
+
+static const ParamMapping *const paramsLCC2SP[] = {
+ &paramLatitudeFalseOrigin,
+ &paramLongitudeFalseOrigin,
+ &paramLatitude1stStdParallel,
+ &paramLatitude2ndStdParallel,
+ &paramFalseEastingOrigin,
+ &paramFalseNorthingOrigin,
+ nullptr,
+};
+
+static const ParamMapping paramEllipsoidScaleFactor = {
+ EPSG_NAME_PARAMETER_ELLIPSOID_SCALE_FACTOR,
+ EPSG_CODE_PARAMETER_ELLIPSOID_SCALE_FACTOR, nullptr,
+ common::UnitOfMeasure::Type::SCALE, k_0};
+
+static const ParamMapping *const paramsLCC2SPMichigan[] = {
+ &paramLatitudeFalseOrigin, &paramLongitudeFalseOrigin,
+ &paramLatitude1stStdParallel, &paramLatitude2ndStdParallel,
+ &paramFalseEastingOrigin, &paramFalseNorthingOrigin,
+ &paramEllipsoidScaleFactor, nullptr,
+};
+
+static const ParamMapping paramLatNatLatCenter = {
+ EPSG_NAME_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN, WKT1_LATITUDE_OF_CENTER,
+ common::UnitOfMeasure::Type::ANGULAR, lat_0};
+
+static const ParamMapping paramLonNatLonCenter = {
+ EPSG_NAME_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, WKT1_LONGITUDE_OF_CENTER,
+ common::UnitOfMeasure::Type::ANGULAR, lon_0};
+
+static const ParamMapping *const paramsAEQD[]{
+ &paramLatNatLatCenter, &paramLonNatLonCenter, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping *const paramsNatOrigin[] = {
+ &paramLatitudeNatOrigin, &paramLongitudeNatOrigin, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLatNatOriginLat1 = {
+ EPSG_NAME_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN, WKT1_STANDARD_PARALLEL_1,
+ common::UnitOfMeasure::Type::ANGULAR, lat_1};
+
+static const ParamMapping *const paramsBonne[] = {
+ &paramLatNatOriginLat1, &paramLongitudeNatOrigin, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLat1stParallelLatTs = {
+ EPSG_NAME_PARAMETER_LATITUDE_1ST_STD_PARALLEL,
+ EPSG_CODE_PARAMETER_LATITUDE_1ST_STD_PARALLEL, WKT1_STANDARD_PARALLEL_1,
+ common::UnitOfMeasure::Type::ANGULAR, lat_ts};
+
+static const ParamMapping *const paramsCEA[] = {
+ &paramLat1stParallelLatTs, &paramLongitudeNatOrigin, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping *const paramsEQDC[] = {&paramLatNatLatCenter,
+ &paramLonNatLonCenter,
+ &paramLatitude1stStdParallel,
+ &paramLatitude2ndStdParallel,
+ &paramFalseEasting,
+ &paramFalseNorthing,
+ nullptr};
+
+static const ParamMapping *const paramsLonNatOrigin[] = {
+ &paramLongitudeNatOrigin, &paramFalseEasting, &paramFalseNorthing, nullptr};
+
+static const ParamMapping *const paramsEqc[] = // same as paramsCEA
+ {&paramLat1stParallelLatTs, &paramLongitudeNatOrigin, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramSatelliteHeight = {
+ "Satellite Height", 0, "satellite_height",
+ common::UnitOfMeasure::Type::LINEAR, h};
+
+static const ParamMapping *const paramsGeos[] = {
+ &paramLongitudeNatOrigin, &paramSatelliteHeight, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLatCentreLatCenter = {
+ EPSG_NAME_PARAMETER_LATITUDE_PROJECTION_CENTRE,
+ EPSG_CODE_PARAMETER_LATITUDE_PROJECTION_CENTRE, WKT1_LATITUDE_OF_CENTER,
+ common::UnitOfMeasure::Type::ANGULAR, lat_0};
+
+static const ParamMapping paramLonCentreLonCenterLonc = {
+ EPSG_NAME_PARAMETER_LONGITUDE_PROJECTION_CENTRE,
+ EPSG_CODE_PARAMETER_LONGITUDE_PROJECTION_CENTRE, WKT1_LONGITUDE_OF_CENTER,
+ common::UnitOfMeasure::Type::ANGULAR, lonc};
+
+static const ParamMapping paramLatCentreLatOrigin = {
+ EPSG_NAME_PARAMETER_LATITUDE_PROJECTION_CENTRE,
+ EPSG_CODE_PARAMETER_LATITUDE_PROJECTION_CENTRE, WKT1_LATITUDE_OF_ORIGIN,
+ common::UnitOfMeasure::Type::ANGULAR, lat_0};
+
+static const ParamMapping paramAzimuth = {
+ EPSG_NAME_PARAMETER_AZIMUTH_INITIAL_LINE,
+ EPSG_CODE_PARAMETER_AZIMUTH_INITIAL_LINE, WKT1_AZIMUTH,
+ common::UnitOfMeasure::Type::ANGULAR, alpha};
+
+static const ParamMapping paramAngleToSkewGrid = {
+ EPSG_NAME_PARAMETER_ANGLE_RECTIFIED_TO_SKEW_GRID,
+ EPSG_CODE_PARAMETER_ANGLE_RECTIFIED_TO_SKEW_GRID, WKT1_RECTIFIED_GRID_ANGLE,
+ common::UnitOfMeasure::Type::ANGULAR, gamma};
+static const ParamMapping paramScaleFactorInitialLine = {
+ EPSG_NAME_PARAMETER_SCALE_FACTOR_INITIAL_LINE,
+ EPSG_CODE_PARAMETER_SCALE_FACTOR_INITIAL_LINE, WKT1_SCALE_FACTOR,
+ common::UnitOfMeasure::Type::SCALE, k};
+
+static const ParamMapping *const paramsHomVariantA[] = {
+ &paramLatCentreLatCenter,
+ &paramLonCentreLonCenterLonc,
+ &paramAzimuth,
+ &paramAngleToSkewGrid,
+ &paramScaleFactorInitialLine,
+ &paramFalseEasting,
+ &paramFalseNorthing,
+ nullptr};
+
+static const ParamMapping paramFalseEastingProjectionCentre = {
+ EPSG_NAME_PARAMETER_EASTING_PROJECTION_CENTRE,
+ EPSG_CODE_PARAMETER_EASTING_PROJECTION_CENTRE, WKT1_FALSE_EASTING,
+ common::UnitOfMeasure::Type::LINEAR, x_0};
+
+static const ParamMapping paramFalseNorthingProjectionCentre = {
+ EPSG_NAME_PARAMETER_NORTHING_PROJECTION_CENTRE,
+ EPSG_CODE_PARAMETER_NORTHING_PROJECTION_CENTRE, WKT1_FALSE_NORTHING,
+ common::UnitOfMeasure::Type::LINEAR, y_0};
+
+static const ParamMapping *const paramsHomVariantB[] = {
+ &paramLatCentreLatCenter,
+ &paramLonCentreLonCenterLonc,
+ &paramAzimuth,
+ &paramAngleToSkewGrid,
+ &paramScaleFactorInitialLine,
+ &paramFalseEastingProjectionCentre,
+ &paramFalseNorthingProjectionCentre,
+ nullptr};
+
+static const ParamMapping paramLatPoint1 = {
+ "Latitude of 1st point", 0, "latitude_of_point_1",
+ common::UnitOfMeasure::Type::ANGULAR, lat_1};
+
+static const ParamMapping paramLonPoint1 = {
+ "Longitude of 1st point", 0, "longitude_of_point_1",
+ common::UnitOfMeasure::Type::ANGULAR, lon_1};
+
+static const ParamMapping paramLatPoint2 = {
+ "Latitude of 2nd point", 0, "latitude_of_point_2",
+ common::UnitOfMeasure::Type::ANGULAR, lat_2};
+
+static const ParamMapping paramLonPoint2 = {
+ "Longitude of 2nd point", 0, "longitude_of_point_2",
+ common::UnitOfMeasure::Type::ANGULAR, lon_2};
+
+static const ParamMapping *const paramsHomTwoPoint[] = {
+ &paramLatCentreLatOrigin,
+ &paramLatPoint1,
+ &paramLonPoint1,
+ &paramLatPoint2,
+ &paramLonPoint2,
+ &paramScaleFactorInitialLine,
+ &paramFalseEastingProjectionCentre,
+ &paramFalseNorthingProjectionCentre,
+ nullptr};
+
+static const ParamMapping *const paramsIMWP[] = {
+ &paramLongitudeNatOrigin, &paramLatitude1stStdParallel,
+ &paramLatitude2ndStdParallel, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLonCentreLonCenter = {
+ EPSG_NAME_PARAMETER_LONGITUDE_OF_ORIGIN,
+ EPSG_CODE_PARAMETER_LONGITUDE_OF_ORIGIN, WKT1_LONGITUDE_OF_CENTER,
+ common::UnitOfMeasure::Type::ANGULAR, lon_0};
+
+static const ParamMapping paramColatitudeConeAxis = {
+ EPSG_NAME_PARAMETER_COLATITUDE_CONE_AXIS,
+ EPSG_CODE_PARAMETER_COLATITUDE_CONE_AXIS, WKT1_AZIMUTH,
+ common::UnitOfMeasure::Type::ANGULAR,
+ nullptr}; /* ignored by PROJ currently */
+
+static const ParamMapping paramLatitudePseudoStdParallel = {
+ EPSG_NAME_PARAMETER_LATITUDE_PSEUDO_STANDARD_PARALLEL,
+ EPSG_CODE_PARAMETER_LATITUDE_PSEUDO_STANDARD_PARALLEL,
+ "pseudo_standard_parallel_1", common::UnitOfMeasure::Type::ANGULAR,
+ nullptr}; /* ignored by PROJ currently */
+
+static const ParamMapping paramScaleFactorPseudoStdParallel = {
+ EPSG_NAME_PARAMETER_SCALE_FACTOR_PSEUDO_STANDARD_PARALLEL,
+ EPSG_CODE_PARAMETER_SCALE_FACTOR_PSEUDO_STANDARD_PARALLEL,
+ WKT1_SCALE_FACTOR, common::UnitOfMeasure::Type::SCALE,
+ k}; /* ignored by PROJ currently */
+
+static const ParamMapping *const krovakParameters[] = {
+ &paramLatCentreLatCenter,
+ &paramLonCentreLonCenter,
+ &paramColatitudeConeAxis,
+ &paramLatitudePseudoStdParallel,
+ &paramScaleFactorPseudoStdParallel,
+ &paramFalseEasting,
+ &paramFalseNorthing,
+ nullptr};
+
+static const ParamMapping *const paramsLaea[] = {
+ &paramLatNatLatCenter, &paramLonNatLonCenter, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping *const paramsMiller[] = {
+ &paramLonNatLonCenter, &paramFalseEasting, &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLatMerc1SP = {
+ EPSG_NAME_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN,
+ nullptr, // always set to zero, not to be exported in WKT1
+ common::UnitOfMeasure::Type::ANGULAR,
+ nullptr}; // always set to zero, not to be exported in PROJ strings
+
+static const ParamMapping paramScaleFactorK = {
+ EPSG_NAME_PARAMETER_SCALE_FACTOR_AT_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_SCALE_FACTOR_AT_NATURAL_ORIGIN, WKT1_SCALE_FACTOR,
+ common::UnitOfMeasure::Type::SCALE, k};
+
+static const ParamMapping *const paramsMerc1SP[] = {
+ &paramLatMerc1SP, &paramLongitudeNatOrigin, &paramScaleFactorK,
+ &paramFalseEasting, &paramFalseNorthing, nullptr};
+
+static const ParamMapping *const paramsMerc2SP[] = {
+ &paramLat1stParallelLatTs, &paramLongitudeNatOrigin, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping *const paramsObliqueStereo[] = {
+ &paramLatitudeNatOrigin, &paramLongitudeNatOrigin, &paramScaleFactorK,
+ &paramFalseEasting, &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLatStdParallel = {
+ EPSG_NAME_PARAMETER_LATITUDE_STD_PARALLEL,
+ EPSG_CODE_PARAMETER_LATITUDE_STD_PARALLEL, WKT1_LATITUDE_OF_ORIGIN,
+ common::UnitOfMeasure::Type::ANGULAR, lat_ts};
+
+static const ParamMapping paramsLonOrigin = {
+ EPSG_NAME_PARAMETER_LONGITUDE_OF_ORIGIN,
+ EPSG_CODE_PARAMETER_LONGITUDE_OF_ORIGIN, WKT1_CENTRAL_MERIDIAN,
+ common::UnitOfMeasure::Type::ANGULAR, lon_0};
+
+static const ParamMapping *const paramsPolarStereo[] = {
+ &paramLatStdParallel, &paramsLonOrigin, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping *const paramsLonNatOriginLongitudeCentre[] = {
+ &paramLonNatLonCenter, &paramFalseEasting, &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLatTrueScaleWag3 = {
+ "Latitude of true scale", 0, WKT1_LATITUDE_OF_ORIGIN,
+ common::UnitOfMeasure::Type::ANGULAR, lat_ts};
+
+static const ParamMapping *const paramsWag3[] = {
+ &paramLatTrueScaleWag3, &paramLongitudeNatOrigin, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramPegLat = {
+ "Peg point latitude", 0, "peg_point_latitude",
+ common::UnitOfMeasure::Type::ANGULAR, "plat_0"};
+
+static const ParamMapping paramPegLon = {
+ "Peg point longitude", 0, "peg_point_longitude",
+ common::UnitOfMeasure::Type::ANGULAR, "plon_0"};
+
+static const ParamMapping paramPegHeading = {
+ "Peg point heading", 0, "peg_point_heading",
+ common::UnitOfMeasure::Type::ANGULAR, "phdg_0"};
+
+static const ParamMapping paramPegHeight = {
+ "Peg point height", 0, "peg_point_height",
+ common::UnitOfMeasure::Type::LINEAR, "h_0"};
+
+static const ParamMapping *const paramsSch[] = {
+ &paramPegLat, &paramPegLon, &paramPegHeading, &paramPegHeight, nullptr};
+
+static const ParamMapping *const paramsWink1[] = {
+ &paramLongitudeNatOrigin, &paramLat1stParallelLatTs, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping *const paramsWink2[] = {
+ &paramLongitudeNatOrigin, &paramLatitude1stStdParallel, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLatLoxim = {
+ EPSG_NAME_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN, WKT1_LATITUDE_OF_ORIGIN,
+ common::UnitOfMeasure::Type::ANGULAR, lat_1};
+
+static const ParamMapping *const paramsLoxim[] = {
+ &paramLatLoxim, &paramLongitudeNatOrigin, &paramFalseEasting,
+ &paramFalseNorthing, nullptr};
+
+static const ParamMapping paramLonCentre = {
+ EPSG_NAME_PARAMETER_LONGITUDE_PROJECTION_CENTRE,
+ EPSG_CODE_PARAMETER_LONGITUDE_PROJECTION_CENTRE, nullptr,
+ common::UnitOfMeasure::Type::ANGULAR, lon_0};
+
+static const ParamMapping paramLabordeObliqueMercatorAzimuth = {
+ EPSG_NAME_PARAMETER_AZIMUTH_INITIAL_LINE,
+ EPSG_CODE_PARAMETER_AZIMUTH_INITIAL_LINE, nullptr,
+ common::UnitOfMeasure::Type::ANGULAR, "azi"};
+
+static const ParamMapping *const paramsLabordeObliqueMercator[] = {
+ &paramLatCentreLatOrigin,
+ &paramLonCentre,
+ &paramLabordeObliqueMercatorAzimuth,
+ &paramScaleFactorInitialLine,
+ &paramFalseEasting,
+ &paramFalseNorthing,
+ nullptr};
+
+static const MethodMapping methodMappings[] = {
+ {EPSG_NAME_METHOD_TRANSVERSE_MERCATOR, EPSG_CODE_METHOD_TRANSVERSE_MERCATOR,
+ "Transverse_Mercator", "tmerc", nullptr, paramsNatOriginScale},
+
+ {EPSG_NAME_METHOD_TRANSVERSE_MERCATOR_SOUTH_ORIENTATED,
+ EPSG_CODE_METHOD_TRANSVERSE_MERCATOR_SOUTH_ORIENTATED,
+ "Transverse_Mercator_South_Orientated", "tmerc", "axis=wsu",
+ paramsNatOriginScale},
+
+ {PROJ_WKT2_NAME_METHOD_TWO_POINT_EQUIDISTANT, 0, "Two_Point_Equidistant",
+ "tpeqd", nullptr, paramsTPEQD},
+
+ {EPSG_NAME_METHOD_TUNISIA_MAPPING_GRID,
+ EPSG_CODE_METHOD_TUNISIA_MAPPING_GRID, "Tunisia_Mapping_Grid", nullptr,
+ nullptr, // no proj equivalent
+ paramsTMG},
+
+ {EPSG_NAME_METHOD_ALBERS_EQUAL_AREA, EPSG_CODE_METHOD_ALBERS_EQUAL_AREA,
+ "Albers_Conic_Equal_Area", "aea", nullptr, paramsAEA},
+
+ {EPSG_NAME_METHOD_LAMBERT_CONIC_CONFORMAL_1SP,
+ EPSG_CODE_METHOD_LAMBERT_CONIC_CONFORMAL_1SP,
+ "Lambert_Conformal_Conic_1SP", "lcc", nullptr,
+ []() {
+ static const ParamMapping paramLatLCC1SP = {
+ EPSG_NAME_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN,
+ EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN,
+ WKT1_LATITUDE_OF_ORIGIN, common::UnitOfMeasure::Type::ANGULAR,
+ lat_1};
+
+ static const ParamMapping *const x[] = {
+ &paramLatLCC1SP, &paramLongitudeNatOrigin, &paramScaleFactor,
+ &paramFalseEasting, &paramFalseNorthing, nullptr,
+ };
+ return x;
+ }()},
+
+ {EPSG_NAME_METHOD_LAMBERT_CONIC_CONFORMAL_2SP,
+ EPSG_CODE_METHOD_LAMBERT_CONIC_CONFORMAL_2SP,
+ "Lambert_Conformal_Conic_2SP", "lcc", nullptr, paramsLCC2SP},
+
+ {EPSG_NAME_METHOD_LAMBERT_CONIC_CONFORMAL_2SP_MICHIGAN,
+ EPSG_CODE_METHOD_LAMBERT_CONIC_CONFORMAL_2SP_MICHIGAN,
+ nullptr, // no mapping to WKT1_GDAL
+ "lcc", nullptr, paramsLCC2SPMichigan},
+
+ {EPSG_NAME_METHOD_LAMBERT_CONIC_CONFORMAL_2SP_BELGIUM,
+ EPSG_CODE_METHOD_LAMBERT_CONIC_CONFORMAL_2SP_BELGIUM,
+ "Lambert_Conformal_Conic_2SP_Belgium", "lcc",
+ nullptr, // FIXME: this is what is done in GDAL, but the formula of
+ // LCC 2SP
+ // Belgium in the EPSG 7.2 guidance is difference from the regular
+ // LCC 2SP
+ paramsLCC2SP},
+
+ {EPSG_NAME_METHOD_MODIFIED_AZIMUTHAL_EQUIDISTANT,
+ EPSG_CODE_METHOD_MODIFIED_AZIMUTHAL_EQUIDISTANT, "Azimuthal_Equidistant",
+ "aeqd", nullptr, paramsAEQD},
+
+ {EPSG_NAME_METHOD_GUAM_PROJECTION, EPSG_CODE_METHOD_GUAM_PROJECTION,
+ nullptr, // no mapping to GDAL WKT1
+ "aeqd", "guam", paramsNatOrigin},
+
+ {EPSG_NAME_METHOD_BONNE, EPSG_CODE_METHOD_BONNE, "Bonne", "bonne", nullptr,
+ paramsBonne},
+
+ {EPSG_NAME_METHOD_LAMBERT_CYLINDRICAL_EQUAL_AREA_SPHERICAL,
+ EPSG_CODE_METHOD_LAMBERT_CYLINDRICAL_EQUAL_AREA_SPHERICAL,
+ "Cylindrical_Equal_Area", "cea", nullptr, paramsCEA},
+
+ {EPSG_NAME_METHOD_LAMBERT_CYLINDRICAL_EQUAL_AREA,
+ EPSG_CODE_METHOD_LAMBERT_CYLINDRICAL_EQUAL_AREA, "Cylindrical_Equal_Area",
+ "cea", nullptr, paramsCEA},
+
+ {EPSG_NAME_METHOD_CASSINI_SOLDNER, EPSG_CODE_METHOD_CASSINI_SOLDNER,
+ "Cassini_Soldner", "cass", nullptr, paramsNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_EQUIDISTANT_CONIC, 0, "Equidistant_Conic", "eqdc",
+ nullptr, paramsEQDC},
+
+ {PROJ_WKT2_NAME_METHOD_ECKERT_I, 0, "Eckert_I", "eck1", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_ECKERT_II, 0, "Eckert_II", "eck2", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_ECKERT_III, 0, "Eckert_III", "eck3", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_ECKERT_IV, 0, "Eckert_IV", "eck4", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_ECKERT_V, 0, "Eckert_V", "eck5", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_ECKERT_VI, 0, "Eckert_VI", "eck6", nullptr,
+ paramsLonNatOrigin},
+
+ {EPSG_NAME_METHOD_EQUIDISTANT_CYLINDRICAL,
+ EPSG_CODE_METHOD_EQUIDISTANT_CYLINDRICAL, "Equirectangular", "eqc",
+ nullptr, paramsEqc},
+
+ {EPSG_NAME_METHOD_EQUIDISTANT_CYLINDRICAL_SPHERICAL,
+ EPSG_CODE_METHOD_EQUIDISTANT_CYLINDRICAL_SPHERICAL, "Equirectangular",
+ "eqc", nullptr, paramsEqc},
+
+ {PROJ_WKT2_NAME_METHOD_GALL_STEREOGRAPHIC, 0, "Gall_Stereographic", "gall",
+ nullptr, paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_GOODE_HOMOLOSINE, 0, "Goode_Homolosine", "goode",
+ nullptr, paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_INTERRUPTED_GOODE_HOMOLOSINE, 0,
+ "Interrupted_Goode_Homolosine", "igh", nullptr, paramsLonNatOrigin},
+
+ // No WKT1 representation fr sweep=x
+ {PROJ_WKT2_NAME_METHOD_GEOSTATIONARY_SATELLITE_SWEEP_X, 0, nullptr, "geos",
+ "sweep=x", paramsGeos},
+
+ {PROJ_WKT2_NAME_METHOD_GEOSTATIONARY_SATELLITE_SWEEP_Y, 0,
+ "Geostationary_Satellite", "geos", nullptr, paramsGeos},
+
+ {PROJ_WKT2_NAME_METHOD_GAUSS_SCHREIBER_TRANSVERSE_MERCATOR, 0,
+ "Gauss_Schreiber_Transverse_Mercator", "gstmerc", nullptr,
+ paramsNatOriginScale},
+
+ {PROJ_WKT2_NAME_METHOD_GNOMONIC, 0, "Gnomonic", "gnom", nullptr,
+ paramsNatOrigin},
+
+ {EPSG_NAME_METHOD_HOTINE_OBLIQUE_MERCATOR_VARIANT_A,
+ EPSG_CODE_METHOD_HOTINE_OBLIQUE_MERCATOR_VARIANT_A,
+ "Hotine_Oblique_Mercator", "omerc", "no_uoff", paramsHomVariantA},
+
+ {EPSG_NAME_METHOD_HOTINE_OBLIQUE_MERCATOR_VARIANT_B,
+ EPSG_CODE_METHOD_HOTINE_OBLIQUE_MERCATOR_VARIANT_B,
+ "Hotine_Oblique_Mercator_Azimuth_Center", "omerc", nullptr,
+ paramsHomVariantB},
+
+ {PROJ_WKT2_NAME_METHOD_HOTINE_OBLIQUE_MERCATOR_TWO_POINT_NATURAL_ORIGIN, 0,
+ "Hotine_Oblique_Mercator_Two_Point_Natural_Origin", "omerc", nullptr,
+ paramsHomTwoPoint},
+
+ {PROJ_WKT2_NAME_INTERNATIONAL_MAP_WORLD_POLYCONIC, 0,
+ "International_Map_of_the_World_Polyconic", "imw_p", nullptr, paramsIMWP},
+
+ {EPSG_NAME_METHOD_KROVAK_NORTH_ORIENTED,
+ EPSG_CODE_METHOD_KROVAK_NORTH_ORIENTED, "Krovak", "krovak", nullptr,
+ krovakParameters},
+
+ {EPSG_NAME_METHOD_KROVAK, EPSG_CODE_METHOD_KROVAK, "Krovak", "krovak",
+ "axis=swu", krovakParameters},
+
+ {EPSG_NAME_METHOD_LAMBERT_AZIMUTHAL_EQUAL_AREA,
+ EPSG_CODE_METHOD_LAMBERT_AZIMUTHAL_EQUAL_AREA,
+ "Lambert_Azimuthal_Equal_Area", "laea", nullptr, paramsLaea},
+
+ {EPSG_NAME_METHOD_LAMBERT_AZIMUTHAL_EQUAL_AREA_SPHERICAL,
+ EPSG_CODE_METHOD_LAMBERT_AZIMUTHAL_EQUAL_AREA_SPHERICAL,
+ "Lambert_Azimuthal_Equal_Area", "laea", nullptr, paramsLaea},
+
+ {PROJ_WKT2_NAME_METHOD_MILLER_CYLINDRICAL, 0, "Miller_Cylindrical", "mill",
+ "R_A", paramsMiller},
+
+ {EPSG_NAME_METHOD_MERCATOR_VARIANT_A, EPSG_CODE_METHOD_MERCATOR_VARIANT_A,
+ "Mercator_1SP", "merc", nullptr, paramsMerc1SP},
+
+ {EPSG_NAME_METHOD_MERCATOR_VARIANT_B, EPSG_CODE_METHOD_MERCATOR_VARIANT_B,
+ "Mercator_2SP", "merc", nullptr, paramsMerc2SP},
+
+ {EPSG_NAME_METHOD_POPULAR_VISUALISATION_PSEUDO_MERCATOR,
+ EPSG_CODE_METHOD_POPULAR_VISUALISATION_PSEUDO_MERCATOR,
+ "Popular_Visualisation_Pseudo_Mercator", // particular case actually
+ // handled manually
+ "webmerc", nullptr, paramsNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_MOLLWEIDE, 0, "Mollweide", "moll", nullptr,
+ paramsLonNatOrigin},
+
+ {EPSG_NAME_METHOD_NZMG, EPSG_CODE_METHOD_NZMG, "New_Zealand_Map_Grid",
+ "nzmg", nullptr, paramsNatOrigin},
+
+ {
+ EPSG_NAME_METHOD_OBLIQUE_STEREOGRAPHIC,
+ EPSG_CODE_METHOD_OBLIQUE_STEREOGRAPHIC, "Oblique_Stereographic",
+ "sterea", nullptr, paramsObliqueStereo,
+ },
+
+ {EPSG_NAME_METHOD_ORTHOGRAPHIC, EPSG_CODE_METHOD_ORTHOGRAPHIC,
+ "Orthographic", "ortho", nullptr, paramsNatOrigin},
+
+ {EPSG_NAME_METHOD_AMERICAN_POLYCONIC, EPSG_CODE_METHOD_AMERICAN_POLYCONIC,
+ "Polyconic", "poly", nullptr, paramsNatOrigin},
+
+ {EPSG_NAME_METHOD_POLAR_STEREOGRAPHIC_VARIANT_A,
+ EPSG_CODE_METHOD_POLAR_STEREOGRAPHIC_VARIANT_A, "Polar_Stereographic",
+ "stere", nullptr, paramsObliqueStereo},
+
+ {EPSG_NAME_METHOD_POLAR_STEREOGRAPHIC_VARIANT_B,
+ EPSG_CODE_METHOD_POLAR_STEREOGRAPHIC_VARIANT_B, "Polar_Stereographic",
+ "stere", nullptr, paramsPolarStereo},
+
+ {PROJ_WKT2_NAME_METHOD_ROBINSON, 0, "Robinson", "robin", nullptr,
+ paramsLonNatOriginLongitudeCentre},
+
+ {PROJ_WKT2_NAME_METHOD_SINUSOIDAL, 0, "Sinusoidal", "sinu", nullptr,
+ paramsLonNatOriginLongitudeCentre},
+
+ {PROJ_WKT2_NAME_METHOD_STEREOGRAPHIC, 0, "Stereographic", "stere", nullptr,
+ paramsObliqueStereo},
+
+ {PROJ_WKT2_NAME_METHOD_VAN_DER_GRINTEN, 0, "VanDerGrinten", "vandg", "R_A",
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_WAGNER_I, 0, "Wagner_I", "wag1", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_WAGNER_II, 0, "Wagner_II", "wag2", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_WAGNER_III, 0, "Wagner_III", "wag3", nullptr,
+ paramsWag3},
+
+ {PROJ_WKT2_NAME_METHOD_WAGNER_IV, 0, "Wagner_IV", "wag4", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_WAGNER_V, 0, "Wagner_V", "wag5", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_WAGNER_VI, 0, "Wagner_VI", "wag6", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_WAGNER_VII, 0, "Wagner_VII", "wag7", nullptr,
+ paramsLonNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_QUADRILATERALIZED_SPHERICAL_CUBE, 0,
+ "Quadrilateralized_Spherical_Cube", "qsc", nullptr, paramsNatOrigin},
+
+ {PROJ_WKT2_NAME_METHOD_SPHERICAL_CROSS_TRACK_HEIGHT, 0,
+ "Spherical_Cross_Track_Height", "sch", nullptr, paramsSch},
+
+ // The following methods have just the WKT <--> PROJ string mapping, but
+ // no setter. Similarly to GDAL
+
+ {"Aitoff", 0, "Aitoff", "aitoff", nullptr, paramsLonNatOrigin},
+
+ {"Winkel I", 0, "Winkel_I", "wink1", nullptr, paramsWink1},
+
+ {"Winkel II", 0, "Winkel_II", "wink2", nullptr, paramsWink2},
+
+ {"Winkel Tripel", 0, "Winkel_Tripel", "wintri", nullptr, paramsWink2},
+
+ {"Craster Parabolic", 0, "Craster_Parabolic", "crast", nullptr,
+ paramsLonNatOrigin},
+
+ {"Loximuthal", 0, "Loximuthal", "loxim", nullptr, paramsLoxim},
+
+ {"Quartic Authalic", 0, "Quartic_Authalic", "qua_aut", nullptr,
+ paramsLonNatOrigin},
+
+ {EPSG_NAME_METHOD_EQUAL_EARTH, EPSG_CODE_METHOD_EQUAL_EARTH, nullptr,
+ "eqearth", nullptr, paramsLonNatOrigin},
+
+ {EPSG_NAME_METHOD_LABORDE_OBLIQUE_MERCATOR,
+ EPSG_CODE_METHOD_LABORDE_OBLIQUE_MERCATOR, nullptr, "labrd", nullptr,
+ paramsLabordeObliqueMercator},
+
+};
+
+#define METHOD_NAME_CODE(method) \
+ { EPSG_NAME_METHOD_##method, EPSG_CODE_METHOD_##method }
+
+static const struct MethodNameCode {
+ const char *name;
+ int epsg_code;
+} methodNameCodes[] = {
+ // Projection methods
+ METHOD_NAME_CODE(TRANSVERSE_MERCATOR),
+ METHOD_NAME_CODE(TRANSVERSE_MERCATOR_SOUTH_ORIENTATED),
+ METHOD_NAME_CODE(LAMBERT_CONIC_CONFORMAL_1SP), METHOD_NAME_CODE(NZMG),
+ METHOD_NAME_CODE(TUNISIA_MAPPING_GRID), METHOD_NAME_CODE(ALBERS_EQUAL_AREA),
+ METHOD_NAME_CODE(LAMBERT_CONIC_CONFORMAL_2SP),
+ METHOD_NAME_CODE(LAMBERT_CONIC_CONFORMAL_2SP_BELGIUM),
+ METHOD_NAME_CODE(LAMBERT_CONIC_CONFORMAL_2SP_MICHIGAN),
+ METHOD_NAME_CODE(MODIFIED_AZIMUTHAL_EQUIDISTANT),
+ METHOD_NAME_CODE(GUAM_PROJECTION), METHOD_NAME_CODE(BONNE),
+ METHOD_NAME_CODE(LAMBERT_CYLINDRICAL_EQUAL_AREA_SPHERICAL),
+ METHOD_NAME_CODE(LAMBERT_CYLINDRICAL_EQUAL_AREA),
+ METHOD_NAME_CODE(CASSINI_SOLDNER),
+ METHOD_NAME_CODE(EQUIDISTANT_CYLINDRICAL),
+ METHOD_NAME_CODE(EQUIDISTANT_CYLINDRICAL_SPHERICAL),
+ METHOD_NAME_CODE(HOTINE_OBLIQUE_MERCATOR_VARIANT_A),
+ METHOD_NAME_CODE(HOTINE_OBLIQUE_MERCATOR_VARIANT_B),
+ METHOD_NAME_CODE(KROVAK_NORTH_ORIENTED), METHOD_NAME_CODE(KROVAK),
+ METHOD_NAME_CODE(LAMBERT_AZIMUTHAL_EQUAL_AREA),
+ METHOD_NAME_CODE(POPULAR_VISUALISATION_PSEUDO_MERCATOR),
+ METHOD_NAME_CODE(MERCATOR_VARIANT_A), METHOD_NAME_CODE(MERCATOR_VARIANT_B),
+ METHOD_NAME_CODE(OBLIQUE_STEREOGRAPHIC),
+ METHOD_NAME_CODE(AMERICAN_POLYCONIC),
+ METHOD_NAME_CODE(POLAR_STEREOGRAPHIC_VARIANT_A),
+ METHOD_NAME_CODE(POLAR_STEREOGRAPHIC_VARIANT_B),
+ METHOD_NAME_CODE(EQUAL_EARTH), METHOD_NAME_CODE(LABORDE_OBLIQUE_MERCATOR),
+ // Other conversions
+ METHOD_NAME_CODE(CHANGE_VERTICAL_UNIT),
+ METHOD_NAME_CODE(AXIS_ORDER_REVERSAL_2D),
+ METHOD_NAME_CODE(AXIS_ORDER_REVERSAL_3D),
+ METHOD_NAME_CODE(GEOGRAPHIC_GEOCENTRIC),
+ // Transformations
+ METHOD_NAME_CODE(LONGITUDE_ROTATION),
+ METHOD_NAME_CODE(AFFINE_PARAMETRIC_TRANSFORMATION),
+ METHOD_NAME_CODE(COORDINATE_FRAME_GEOCENTRIC),
+ METHOD_NAME_CODE(COORDINATE_FRAME_GEOGRAPHIC_2D),
+ METHOD_NAME_CODE(COORDINATE_FRAME_GEOGRAPHIC_3D),
+ METHOD_NAME_CODE(POSITION_VECTOR_GEOCENTRIC),
+ METHOD_NAME_CODE(POSITION_VECTOR_GEOGRAPHIC_2D),
+ METHOD_NAME_CODE(POSITION_VECTOR_GEOGRAPHIC_3D),
+ METHOD_NAME_CODE(GEOCENTRIC_TRANSLATION_GEOCENTRIC),
+ METHOD_NAME_CODE(GEOCENTRIC_TRANSLATION_GEOGRAPHIC_2D),
+ METHOD_NAME_CODE(GEOCENTRIC_TRANSLATION_GEOGRAPHIC_3D),
+ METHOD_NAME_CODE(TIME_DEPENDENT_COORDINATE_FRAME_GEOCENTRIC),
+ METHOD_NAME_CODE(TIME_DEPENDENT_COORDINATE_FRAME_GEOGRAPHIC_2D),
+ METHOD_NAME_CODE(TIME_DEPENDENT_COORDINATE_FRAME_GEOGRAPHIC_3D),
+ METHOD_NAME_CODE(TIME_DEPENDENT_POSITION_VECTOR_GEOCENTRIC),
+ METHOD_NAME_CODE(TIME_DEPENDENT_POSITION_VECTOR_GEOGRAPHIC_2D),
+ METHOD_NAME_CODE(TIME_DEPENDENT_POSITION_VECTOR_GEOGRAPHIC_3D),
+ METHOD_NAME_CODE(MOLODENSKY_BADEKAS_CF_GEOCENTRIC),
+ METHOD_NAME_CODE(MOLODENSKY_BADEKAS_CF_GEOGRAPHIC_2D),
+ METHOD_NAME_CODE(MOLODENSKY_BADEKAS_CF_GEOGRAPHIC_3D),
+ METHOD_NAME_CODE(MOLODENSKY_BADEKAS_PV_GEOCENTRIC),
+ METHOD_NAME_CODE(MOLODENSKY_BADEKAS_PV_GEOGRAPHIC_2D),
+ METHOD_NAME_CODE(MOLODENSKY_BADEKAS_PV_GEOGRAPHIC_3D),
+ METHOD_NAME_CODE(MOLODENSKY), METHOD_NAME_CODE(ABRIDGED_MOLODENSKY),
+ METHOD_NAME_CODE(GEOGRAPHIC2D_OFFSETS),
+ METHOD_NAME_CODE(GEOGRAPHIC2D_WITH_HEIGHT_OFFSETS),
+ METHOD_NAME_CODE(GEOGRAPHIC3D_OFFSETS), METHOD_NAME_CODE(VERTICAL_OFFSET),
+ METHOD_NAME_CODE(NTV2), METHOD_NAME_CODE(NTV1), METHOD_NAME_CODE(NADCON),
+ METHOD_NAME_CODE(VERTCON),
+};
+
+#define PARAM_NAME_CODE(method) \
+ { EPSG_NAME_PARAMETER_##method, EPSG_CODE_PARAMETER_##method }
+
+static const struct ParamNameCode {
+ const char *name;
+ int epsg_code;
+} paramNameCodes[] = {
+ // Parameters of projection methods
+ PARAM_NAME_CODE(COLATITUDE_CONE_AXIS),
+ PARAM_NAME_CODE(LATITUDE_OF_NATURAL_ORIGIN),
+ PARAM_NAME_CODE(LONGITUDE_OF_NATURAL_ORIGIN),
+ PARAM_NAME_CODE(SCALE_FACTOR_AT_NATURAL_ORIGIN),
+ PARAM_NAME_CODE(FALSE_EASTING), PARAM_NAME_CODE(FALSE_NORTHING),
+ PARAM_NAME_CODE(LATITUDE_PROJECTION_CENTRE),
+ PARAM_NAME_CODE(LONGITUDE_PROJECTION_CENTRE),
+ PARAM_NAME_CODE(AZIMUTH_INITIAL_LINE),
+ PARAM_NAME_CODE(ANGLE_RECTIFIED_TO_SKEW_GRID),
+ PARAM_NAME_CODE(SCALE_FACTOR_INITIAL_LINE),
+ PARAM_NAME_CODE(EASTING_PROJECTION_CENTRE),
+ PARAM_NAME_CODE(NORTHING_PROJECTION_CENTRE),
+ PARAM_NAME_CODE(LATITUDE_PSEUDO_STANDARD_PARALLEL),
+ PARAM_NAME_CODE(SCALE_FACTOR_PSEUDO_STANDARD_PARALLEL),
+ PARAM_NAME_CODE(LATITUDE_FALSE_ORIGIN),
+ PARAM_NAME_CODE(LONGITUDE_FALSE_ORIGIN),
+ PARAM_NAME_CODE(LATITUDE_1ST_STD_PARALLEL),
+ PARAM_NAME_CODE(LATITUDE_2ND_STD_PARALLEL),
+ PARAM_NAME_CODE(EASTING_FALSE_ORIGIN),
+ PARAM_NAME_CODE(NORTHING_FALSE_ORIGIN),
+ PARAM_NAME_CODE(LATITUDE_STD_PARALLEL),
+ PARAM_NAME_CODE(LONGITUDE_OF_ORIGIN),
+ PARAM_NAME_CODE(ELLIPSOID_SCALE_FACTOR),
+ // Parameters of transformations
+ PARAM_NAME_CODE(SEMI_MAJOR_AXIS_DIFFERENCE),
+ PARAM_NAME_CODE(FLATTENING_DIFFERENCE),
+ PARAM_NAME_CODE(LATITUDE_LONGITUDE_DIFFERENCE_FILE),
+ PARAM_NAME_CODE(GEOID_CORRECTION_FILENAME),
+ PARAM_NAME_CODE(VERTICAL_OFFSET_FILE),
+ PARAM_NAME_CODE(LATITUDE_DIFFERENCE_FILE),
+ PARAM_NAME_CODE(LONGITUDE_DIFFERENCE_FILE),
+ PARAM_NAME_CODE(UNIT_CONVERSION_SCALAR), PARAM_NAME_CODE(LATITUDE_OFFSET),
+ PARAM_NAME_CODE(LONGITUDE_OFFSET), PARAM_NAME_CODE(VERTICAL_OFFSET),
+ PARAM_NAME_CODE(GEOID_UNDULATION), PARAM_NAME_CODE(A0), PARAM_NAME_CODE(A1),
+ PARAM_NAME_CODE(A2), PARAM_NAME_CODE(B0), PARAM_NAME_CODE(B1),
+ PARAM_NAME_CODE(B2), PARAM_NAME_CODE(X_AXIS_TRANSLATION),
+ PARAM_NAME_CODE(Y_AXIS_TRANSLATION), PARAM_NAME_CODE(Z_AXIS_TRANSLATION),
+ PARAM_NAME_CODE(X_AXIS_ROTATION), PARAM_NAME_CODE(Y_AXIS_ROTATION),
+ PARAM_NAME_CODE(Z_AXIS_ROTATION), PARAM_NAME_CODE(SCALE_DIFFERENCE),
+ PARAM_NAME_CODE(RATE_X_AXIS_TRANSLATION),
+ PARAM_NAME_CODE(RATE_Y_AXIS_TRANSLATION),
+ PARAM_NAME_CODE(RATE_Z_AXIS_TRANSLATION),
+ PARAM_NAME_CODE(RATE_X_AXIS_ROTATION),
+ PARAM_NAME_CODE(RATE_Y_AXIS_ROTATION),
+ PARAM_NAME_CODE(RATE_Z_AXIS_ROTATION),
+ PARAM_NAME_CODE(RATE_SCALE_DIFFERENCE), PARAM_NAME_CODE(REFERENCE_EPOCH),
+ PARAM_NAME_CODE(TRANSFORMATION_REFERENCE_EPOCH),
+ PARAM_NAME_CODE(ORDINATE_1_EVAL_POINT),
+ PARAM_NAME_CODE(ORDINATE_2_EVAL_POINT),
+ PARAM_NAME_CODE(ORDINATE_3_EVAL_POINT),
+};
+
+// end of anonymous namespace
+}
+
+// ---------------------------------------------------------------------------
+
+//! @endcond
+
+#endif // COORDINATEOPERATION_CONSTANTS_HH_INCLUDED