diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2018-11-28 14:52:56 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2018-11-29 12:10:13 +0100 |
| commit | cf855b24d2b901054bee90309cdc5df00dfb3085 (patch) | |
| tree | cfed6be67bd51c6e8cd198def30d840fe9f67a89 | |
| parent | 6d9a1a909886762cc99e1d8f289e2b60ea787bf7 (diff) | |
| download | PROJ-cf855b24d2b901054bee90309cdc5df00dfb3085.tar.gz PROJ-cf855b24d2b901054bee90309cdc5df00dfb3085.zip | |
C API extensions and renaming
- proj_obj_create_projected_XXXXX() are renamed to
proj_obj_create_conversion_snake_case() and just instanciate
a Conversion object
- Advanced manipulation functions are moved to a dedicated
section at bottom of proj.h
- New C API needed for GDAL OGRSpatialReference
| -rw-r--r-- | include/proj/coordinateoperation.hpp | 3 | ||||
| -rw-r--r-- | include/proj/coordinatesystem.hpp | 29 | ||||
| -rw-r--r-- | include/proj/crs.hpp | 11 | ||||
| -rwxr-xr-x | scripts/create_c_api_projections.py | 55 | ||||
| -rw-r--r-- | src/c_api.cpp | 3184 | ||||
| -rw-r--r-- | src/coordinateoperation.cpp | 52 | ||||
| -rw-r--r-- | src/coordinatesystem.cpp | 97 | ||||
| -rw-r--r-- | src/crs.cpp | 117 | ||||
| -rw-r--r-- | src/proj.h | 1024 | ||||
| -rw-r--r-- | src/proj_symbol_rename.h | 1 | ||||
| -rw-r--r-- | test/unit/test_c_api.cpp | 656 | ||||
| -rw-r--r-- | test/unit/test_crs.cpp | 133 |
12 files changed, 3742 insertions, 1620 deletions
diff --git a/include/proj/coordinateoperation.hpp b/include/proj/coordinateoperation.hpp index 4005176a..4dd85e96 100644 --- a/include/proj/coordinateoperation.hpp +++ b/include/proj/coordinateoperation.hpp @@ -1286,6 +1286,9 @@ class PROJ_GCC_DLL Conversion : public SingleOperation { PROJ_INTERNAL ConversionNNPtr shallowClone() const; + PROJ_INTERNAL ConversionNNPtr alterParametersLinearUnit( + const common::UnitOfMeasure &unit, bool convertToNewUnit) const; + //! @endcond protected: diff --git a/include/proj/coordinatesystem.hpp b/include/proj/coordinatesystem.hpp index 89c2f99c..a301adab 100644 --- a/include/proj/coordinatesystem.hpp +++ b/include/proj/coordinatesystem.hpp @@ -208,6 +208,9 @@ class PROJ_GCC_DLL CoordinateSystemAxis final PROJ_INTERNAL static CoordinateSystemAxisNNPtr createLONG_EAST(const common::UnitOfMeasure &unit); + PROJ_INTERNAL CoordinateSystemAxisNNPtr + alterUnit(const common::UnitOfMeasure &newUnit) const; + //! @endcond private: @@ -372,6 +375,13 @@ class PROJ_GCC_DLL EllipsoidalCS final : public CoordinateSystem { }; PROJ_INTERNAL AxisOrder axisOrder() const; + + PROJ_INTERNAL EllipsoidalCSNNPtr + alterAngularUnit(const common::UnitOfMeasure &angularUnit) const; + + PROJ_INTERNAL EllipsoidalCSNNPtr + alterLinearUnit(const common::UnitOfMeasure &linearUnit) const; + //! @endcond protected: @@ -416,6 +426,13 @@ class PROJ_GCC_DLL VerticalCS final : public CoordinateSystem { PROJ_DLL static VerticalCSNNPtr createGravityRelatedHeight(const common::UnitOfMeasure &unit); + PROJ_PRIVATE : + //! @cond Doxygen_Suppress + PROJ_INTERNAL VerticalCSNNPtr + alterUnit(const common::UnitOfMeasure &unit) const; + + //! @endcond + protected: PROJ_INTERNAL explicit VerticalCS(const CoordinateSystemAxisNNPtr &axisIn); INLINED_MAKE_SHARED @@ -460,11 +477,23 @@ class PROJ_GCC_DLL CartesianCS final : public CoordinateSystem { const CoordinateSystemAxisNNPtr &axis1, const CoordinateSystemAxisNNPtr &axis2, const CoordinateSystemAxisNNPtr &axis3); + PROJ_DLL static CartesianCSNNPtr createEastingNorthing(const common::UnitOfMeasure &unit); + + PROJ_DLL static CartesianCSNNPtr + createNorthingEasting(const common::UnitOfMeasure &unit); + PROJ_DLL static CartesianCSNNPtr createGeocentric(const common::UnitOfMeasure &unit); + PROJ_PRIVATE : + //! @cond Doxygen_Suppress + PROJ_INTERNAL CartesianCSNNPtr + alterUnit(const common::UnitOfMeasure &unit) const; + + //! @endcond + protected: PROJ_INTERNAL explicit CartesianCS( const std::vector<CoordinateSystemAxisNNPtr> &axisIn); diff --git a/include/proj/crs.hpp b/include/proj/crs.hpp index 10e0a639..bdb36cd4 100644 --- a/include/proj/crs.hpp +++ b/include/proj/crs.hpp @@ -108,8 +108,16 @@ class PROJ_GCC_DLL CRS : public common::ObjectUsage { PROJ_FOR_TEST CRSNNPtr shallowClone() const; + PROJ_FOR_TEST CRSNNPtr alterName(const std::string &newName) const; + PROJ_INTERNAL const std::string &getExtensionProj4() const noexcept; + PROJ_FOR_TEST CRSNNPtr + alterGeodeticCRS(const GeodeticCRSNNPtr &newGeodCRS) const; + + PROJ_FOR_TEST CRSNNPtr + alterCSLinearUnit(const common::UnitOfMeasure &unit) const; + //! @endcond protected: @@ -557,6 +565,9 @@ class PROJ_GCC_DLL ProjectedCRS final : public DerivedCRS, PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter) const override; // throw(io::FormattingException) + PROJ_FOR_TEST ProjectedCRSNNPtr alterParametersLinearUnit( + const common::UnitOfMeasure &unit, bool convertToNewUnit) const; + //! @endcond protected: diff --git a/scripts/create_c_api_projections.py b/scripts/create_c_api_projections.py index 5d10a16b..a56e99b3 100755 --- a/scripts/create_c_api_projections.py +++ b/scripts/create_c_api_projections.py @@ -56,6 +56,21 @@ cppfile.write("\n"); test_cppfile.write("/* BEGIN: Generated by scripts/create_c_api_projections.py*/\n") +def snake_casify(s): + out = '' + lastWasLowerAlpha = False + for c in s: + if c.isupper(): + if lastWasLowerAlpha: + out += '_' + out += c.lower() + lastWasLowerAlpha = False + else: + out += c + lastWasLowerAlpha = c.isalpha() + return out + + for sectiondef in compounddef.iter('sectiondef'): if sectiondef.attrib['kind'] == 'public-static-func': for func in sectiondef.iter('memberdef'): @@ -79,22 +94,31 @@ for sectiondef in compounddef.iter('sectiondef'): params.append((type, paramname)) shortName = name[len('create'):] + c_shortName = snake_casify(shortName) - decl = "proj_obj_create_projected_crs_" - decl += shortName + decl = "proj_obj_create_conversion_" + decl += c_shortName decl += "(\n" - decl += " PJ_OBJ* geodetic_crs, const char* crs_name,\n" + decl += " PJ_CONTEXT *ctx,\n" + has_output_params = False for param in params: + if has_output_params: + decl += ",\n" + if param[0] in ('int', 'bool'): - decl += " int " + param[1] + ",\n" + decl += " int " + param[1] else: - decl += " double " + param[1] + ",\n" + decl += " double " + param[1] + has_output_params = True + if has_angle: + if has_output_params: + decl += ",\n" decl += " const char* angUnitName, double angUnitConvFactor" - if has_linear: - decl += "," - decl += "\n" + has_output_params = True if has_linear: + if has_output_params: + decl += ",\n" decl += " const char* linearUnitName, double linearUnitConvFactor" decl += ")" @@ -113,9 +137,8 @@ for sectiondef in compounddef.iter('sectiondef'): cppfile.write(" * Angular parameters are expressed in (angUnitName, angUnitConvFactor).\n") cppfile.write(" */\n") cppfile.write("PJ_OBJ* " + decl + "{\n"); - if not has_linear: - cppfile.write(" const auto& linearUnit = UnitOfMeasure::METRE;\n") - else: + cppfile.write(" try {\n"); + if has_linear: cppfile.write(" UnitOfMeasure linearUnit(createLinearUnit(linearUnitName, linearUnitConvFactor));\n") if has_angle: cppfile.write(" UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor));\n") @@ -133,12 +156,16 @@ for sectiondef in compounddef.iter('sectiondef'): cppfile.write(", Scale(" + param[1] + ")") cppfile.write(");\n") - cppfile.write(" return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, linearUnit);\n") + cppfile.write(" return proj_obj_create_conversion(ctx, conv);\n") + cppfile.write(" } catch (const std::exception &e) {\n"); + cppfile.write(" proj_log_error(ctx, __FUNCTION__, e.what());\n") + cppfile.write(" }\n") + cppfile.write(" return nullptr;\n") cppfile.write("}\n") test_cppfile.write("{\n") - test_cppfile.write(" auto projCRS = proj_obj_create_projected_crs_" + shortName + "(\n") - test_cppfile.write(" geogCRS, nullptr") + test_cppfile.write(" auto projCRS = proj_obj_create_conversion_" + c_shortName + "(\n") + test_cppfile.write(" m_ctxt") for param in params: test_cppfile.write(", 0") if has_angle: diff --git a/src/c_api.cpp b/src/c_api.cpp index e74f4347..dc7bc3e6 100644 --- a/src/c_api.cpp +++ b/src/c_api.cpp @@ -96,10 +96,10 @@ struct PJ_OBJ { IdentifiedObjectNNPtr obj; // cached results - std::string lastWKT{}; - std::string lastPROJString{}; - bool gridsNeededAsked = false; - std::vector<GridDescription> gridsNeeded{}; + mutable std::string lastWKT{}; + mutable std::string lastPROJString{}; + mutable bool gridsNeededAsked = false; + mutable std::vector<GridDescription> gridsNeeded{}; explicit PJ_OBJ(PJ_CONTEXT *ctxIn, const IdentifiedObjectNNPtr &objIn) : ctx(ctxIn), obj(objIn) {} @@ -312,6 +312,29 @@ static const char *getOptionValue(const char *option, // --------------------------------------------------------------------------- +/** \brief "Clone" an object. + * + * Technically this just increases the reference counter on the object, since + * PJ_OBJ objects are immutable. + * + * The returned object must be unreferenced with proj_obj_unref() after use. + * It should be used by at most one thread at a time. + * + * @param obj Object to clone. Must not be NULL. + * @return Object that must be unreferenced with proj_obj_unref(), or NULL in + * case of error. + */ +PJ_OBJ *proj_obj_clone(const PJ_OBJ *obj) { + try { + return PJ_OBJ::create(obj->ctx, obj->obj); + } catch (const std::exception &e) { + proj_log_error(obj->ctx, __FUNCTION__, e.what()); + } + return nullptr; +} + +// --------------------------------------------------------------------------- + /** \brief Instanciate an object from a WKT string, PROJ string or object code * (like "EPSG:4326", "urn:ogc:def:crs:EPSG::4326", * "urn:ogc:def:coordinateOperation:EPSG::1671"). @@ -561,6 +584,10 @@ convertPJObjectTypeToObjectType(PJ_OBJ_TYPE type, bool &valid) { cppType = AuthorityFactory::ObjectType::COMPOUND_CRS; break; + case PJ_OBJ_TYPE_ENGINEERING_CRS: + valid = false; + break; + case PJ_OBJ_TYPE_TEMPORAL_CRS: valid = false; break; @@ -658,7 +685,7 @@ PJ_OBJ_LIST *proj_obj_create_from_name(PJ_CONTEXT *ctx, const char *auth_name, * @param obj Object (must not be NULL) * @return its type. */ -PJ_OBJ_TYPE proj_obj_get_type(PJ_OBJ *obj) { +PJ_OBJ_TYPE proj_obj_get_type(const PJ_OBJ *obj) { assert(obj); auto ptr = obj->obj.get(); if (dynamic_cast<Ellipsoid *>(ptr)) { @@ -715,6 +742,9 @@ PJ_OBJ_TYPE proj_obj_get_type(PJ_OBJ *obj) { if (dynamic_cast<TemporalCRS *>(ptr)) { return PJ_OBJ_TYPE_TEMPORAL_CRS; } + if (dynamic_cast<EngineeringCRS *>(ptr)) { + return PJ_OBJ_TYPE_ENGINEERING_CRS; + } if (dynamic_cast<BoundCRS *>(ptr)) { return PJ_OBJ_TYPE_BOUND_CRS; } @@ -745,7 +775,7 @@ PJ_OBJ_TYPE proj_obj_get_type(PJ_OBJ *obj) { * @param obj Object (must not be NULL) * @return TRUE if it is deprecated, FALSE otherwise */ -int proj_obj_is_deprecated(PJ_OBJ *obj) { +int proj_obj_is_deprecated(const PJ_OBJ *obj) { assert(obj); return obj->obj->isDeprecated(); } @@ -759,7 +789,7 @@ int proj_obj_is_deprecated(PJ_OBJ *obj) { * @param criterion Comparison criterion * @return TRUE if they are equivalent */ -int proj_obj_is_equivalent_to(PJ_OBJ *obj, PJ_OBJ *other, +int proj_obj_is_equivalent_to(const PJ_OBJ *obj, const PJ_OBJ *other, PJ_COMPARISON_CRITERION criterion) { assert(obj); assert(other); @@ -796,7 +826,7 @@ int proj_obj_is_equivalent_to(PJ_OBJ *obj, PJ_OBJ *other, * * @param obj Object (must not be NULL) */ -int proj_obj_is_crs(PJ_OBJ *obj) { +int proj_obj_is_crs(const PJ_OBJ *obj) { assert(obj); return dynamic_cast<CRS *>(obj->obj.get()) != nullptr; } @@ -810,7 +840,7 @@ int proj_obj_is_crs(PJ_OBJ *obj) { * @param obj Object (must not be NULL) * @return a string, or NULL in case of error or missing name. */ -const char *proj_obj_get_name(PJ_OBJ *obj) { +const char *proj_obj_get_name(const PJ_OBJ *obj) { assert(obj); const auto &desc = obj->obj->name()->description(); if (!desc.has_value()) { @@ -831,7 +861,7 @@ const char *proj_obj_get_name(PJ_OBJ *obj) { * @param index Index of the identifier. 0 = first identifier * @return a string, or NULL in case of error or missing name. */ -const char *proj_obj_get_id_auth_name(PJ_OBJ *obj, int index) { +const char *proj_obj_get_id_auth_name(const PJ_OBJ *obj, int index) { assert(obj); const auto &ids = obj->obj->identifiers(); if (static_cast<size_t>(index) >= ids.size()) { @@ -856,7 +886,7 @@ const char *proj_obj_get_id_auth_name(PJ_OBJ *obj, int index) { * @param index Index of the identifier. 0 = first identifier * @return a string, or NULL in case of error or missing name. */ -const char *proj_obj_get_id_code(PJ_OBJ *obj, int index) { +const char *proj_obj_get_id_code(const PJ_OBJ *obj, int index) { assert(obj); const auto &ids = obj->obj->identifiers(); if (static_cast<size_t>(index) >= ids.size()) { @@ -892,7 +922,7 @@ const char *proj_obj_get_id_code(PJ_OBJ *obj, int index) { * </ul> * @return a string, or NULL in case of error. */ -const char *proj_obj_as_wkt(PJ_OBJ *obj, PJ_WKT_TYPE type, +const char *proj_obj_as_wkt(const PJ_OBJ *obj, PJ_WKT_TYPE type, const char *const *options) { assert(obj); @@ -983,7 +1013,7 @@ const char *proj_obj_as_wkt(PJ_OBJ *obj, PJ_WKT_TYPE type, * use of etmerc by utm conversions) * @return a string, or NULL in case of error. */ -const char *proj_obj_as_proj_string(PJ_OBJ *obj, PJ_PROJ_STRING_TYPE type, +const char *proj_obj_as_proj_string(const PJ_OBJ *obj, PJ_PROJ_STRING_TYPE type, const char *const *options) { assert(obj); auto exportable = @@ -1049,7 +1079,7 @@ const char *proj_obj_as_proj_string(PJ_OBJ *obj, PJ_PROJ_STRING_TYPE type, * @return TRUE in case of success, FALSE in case of error or if the area * of use is unknown. */ -int proj_obj_get_area_of_use(PJ_OBJ *obj, double *p_west_lon_degree, +int proj_obj_get_area_of_use(const PJ_OBJ *obj, double *p_west_lon_degree, double *p_south_lat_degree, double *p_east_lon_degree, double *p_north_lat_degree, @@ -1111,7 +1141,8 @@ int proj_obj_get_area_of_use(PJ_OBJ *obj, double *p_west_lon_degree, // --------------------------------------------------------------------------- -static const GeodeticCRS *extractGeodeticCRS(PJ_OBJ *crs, const char *fname) { +static const GeodeticCRS *extractGeodeticCRS(const PJ_OBJ *crs, + const char *fname) { assert(crs); auto l_crs = dynamic_cast<const CRS *>(crs->obj.get()); if (!l_crs) { @@ -1137,7 +1168,7 @@ static const GeodeticCRS *extractGeodeticCRS(PJ_OBJ *crs, const char *fname) { * @return Object that must be unreferenced with proj_obj_unref(), or NULL * in case of error. */ -PJ_OBJ *proj_obj_crs_get_geodetic_crs(PJ_OBJ *crs) { +PJ_OBJ *proj_obj_crs_get_geodetic_crs(const PJ_OBJ *crs) { auto geodCRS = extractGeodeticCRS(crs, __FUNCTION__); if (!geodCRS) { return nullptr; @@ -1161,7 +1192,7 @@ PJ_OBJ *proj_obj_crs_get_geodetic_crs(PJ_OBJ *crs) { * @return Object that must be unreferenced with proj_obj_unref(), or NULL * in case of error. */ -PJ_OBJ *proj_obj_crs_get_sub_crs(PJ_OBJ *crs, int index) { +PJ_OBJ *proj_obj_crs_get_sub_crs(const PJ_OBJ *crs, int index) { assert(crs); auto l_crs = dynamic_cast<CompoundCRS *>(crs->obj.get()); if (!l_crs) { @@ -1177,6 +1208,54 @@ PJ_OBJ *proj_obj_crs_get_sub_crs(PJ_OBJ *crs, int index) { // --------------------------------------------------------------------------- +/** \brief Returns a BoundCRS + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param base_crs Base CRS (must not be NULL) + * @param hub_crs Hub CRS (must not be NULL) + * @param transformation Transformation (must not be NULL) + * @return Object that must be unreferenced with proj_obj_unref(), or NULL + * in case of error. + */ +PJ_OBJ *proj_obj_crs_create_bound_crs(const PJ_OBJ *base_crs, + const PJ_OBJ *hub_crs, + const PJ_OBJ *transformation) { + assert(base_crs); + assert(hub_crs); + assert(transformation); + auto l_base_crs = util::nn_dynamic_pointer_cast<CRS>(base_crs->obj); + if (!l_base_crs) { + proj_log_error(base_crs->ctx, __FUNCTION__, "base_crs is not a CRS"); + return nullptr; + } + auto l_hub_crs = util::nn_dynamic_pointer_cast<CRS>(hub_crs->obj); + if (!l_hub_crs) { + proj_log_error(base_crs->ctx, __FUNCTION__, "hub_crs is not a CRS"); + return nullptr; + } + auto l_transformation = + util::nn_dynamic_pointer_cast<Transformation>(transformation->obj); + if (!l_transformation) { + proj_log_error(base_crs->ctx, __FUNCTION__, + "transformation is not a CRS"); + return nullptr; + } + try { + return PJ_OBJ::create(base_crs->ctx, + BoundCRS::create(NN_NO_CHECK(l_base_crs), + NN_NO_CHECK(l_hub_crs), + NN_NO_CHECK(l_transformation))); + } catch (const std::exception &e) { + proj_log_error(base_crs->ctx, __FUNCTION__, e.what()); + return nullptr; + } +} + +// --------------------------------------------------------------------------- + /** \brief Returns potentially * a BoundCRS, with a transformation to EPSG:4326, wrapping this CRS * @@ -1191,7 +1270,7 @@ PJ_OBJ *proj_obj_crs_get_sub_crs(PJ_OBJ *crs, int index) { * @return Object that must be unreferenced with proj_obj_unref(), or NULL * in case of error. */ -PJ_OBJ *proj_obj_crs_create_bound_crs_to_WGS84(PJ_OBJ *crs) { +PJ_OBJ *proj_obj_crs_create_bound_crs_to_WGS84(const PJ_OBJ *crs) { assert(crs); auto l_crs = dynamic_cast<const CRS *>(crs->obj.get()); if (!l_crs) { @@ -1199,8 +1278,13 @@ PJ_OBJ *proj_obj_crs_create_bound_crs_to_WGS84(PJ_OBJ *crs) { return nullptr; } auto dbContext = getDBcontextNoException(crs->ctx, __FUNCTION__); - return PJ_OBJ::create(crs->ctx, - l_crs->createBoundCRSToWGS84IfPossible(dbContext)); + try { + return PJ_OBJ::create( + crs->ctx, l_crs->createBoundCRSToWGS84IfPossible(dbContext)); + } catch (const std::exception &e) { + proj_log_error(crs->ctx, __FUNCTION__, e.what()); + return nullptr; + } } // --------------------------------------------------------------------------- @@ -1215,7 +1299,7 @@ PJ_OBJ *proj_obj_crs_create_bound_crs_to_WGS84(PJ_OBJ *crs) { * @return Object that must be unreferenced with proj_obj_unref(), or NULL * in case of error. */ -PJ_OBJ *proj_obj_get_ellipsoid(PJ_OBJ *obj) { +PJ_OBJ *proj_obj_get_ellipsoid(const PJ_OBJ *obj) { auto ptr = obj->obj.get(); if (dynamic_cast<const CRS *>(ptr)) { auto geodCRS = extractGeodeticCRS(obj, __FUNCTION__); @@ -1245,7 +1329,7 @@ PJ_OBJ *proj_obj_get_ellipsoid(PJ_OBJ *obj) { * @return Object that must be unreferenced with proj_obj_unref(), or NULL * in case of error. */ -PJ_OBJ *proj_obj_crs_get_horizontal_datum(PJ_OBJ *crs) { +PJ_OBJ *proj_obj_crs_get_horizontal_datum(const PJ_OBJ *crs) { auto geodCRS = extractGeodeticCRS(crs, __FUNCTION__); if (!geodCRS) { return nullptr; @@ -1279,7 +1363,7 @@ PJ_OBJ *proj_obj_crs_get_horizontal_datum(PJ_OBJ *crs) { * flattening. or NULL * @return TRUE in case of success. */ -int proj_obj_ellipsoid_get_parameters(PJ_OBJ *ellipsoid, +int proj_obj_ellipsoid_get_parameters(const PJ_OBJ *ellipsoid, double *pSemiMajorMetre, double *pSemiMinorMetre, int *pIsSemiMinorComputed, @@ -1320,7 +1404,7 @@ int proj_obj_ellipsoid_get_parameters(PJ_OBJ *ellipsoid, * in case of error. */ -PJ_OBJ *proj_obj_get_prime_meridian(PJ_OBJ *obj) { +PJ_OBJ *proj_obj_get_prime_meridian(const PJ_OBJ *obj) { auto ptr = obj->obj.get(); if (dynamic_cast<CRS *>(ptr)) { auto geodCRS = extractGeodeticCRS(obj, __FUNCTION__); @@ -1351,7 +1435,7 @@ PJ_OBJ *proj_obj_get_prime_meridian(PJ_OBJ *obj) { * or NULL * @return TRUE in case of success. */ -int proj_obj_prime_meridian_get_parameters(PJ_OBJ *prime_meridian, +int proj_obj_prime_meridian_get_parameters(const PJ_OBJ *prime_meridian, double *pLongitude, double *pLongitudeUnitConvFactor, const char **pLongitudeUnitName) { @@ -1389,7 +1473,7 @@ int proj_obj_prime_meridian_get_parameters(PJ_OBJ *prime_meridian, * @return Object that must be unreferenced with proj_obj_unref(), or NULL * in case of error, or missing source CRS. */ -PJ_OBJ *proj_obj_get_source_crs(PJ_OBJ *obj) { +PJ_OBJ *proj_obj_get_source_crs(const PJ_OBJ *obj) { assert(obj); auto ptr = obj->obj.get(); auto boundCRS = dynamic_cast<const BoundCRS *>(ptr); @@ -1426,7 +1510,7 @@ PJ_OBJ *proj_obj_get_source_crs(PJ_OBJ *obj) { * @return Object that must be unreferenced with proj_obj_unref(), or NULL * in case of error, or missing target CRS. */ -PJ_OBJ *proj_obj_get_target_crs(PJ_OBJ *obj) { +PJ_OBJ *proj_obj_get_target_crs(const PJ_OBJ *obj) { assert(obj); auto ptr = obj->obj.get(); auto boundCRS = dynamic_cast<const BoundCRS *>(ptr); @@ -1478,7 +1562,7 @@ PJ_OBJ *proj_obj_get_target_crs(PJ_OBJ *obj) { * released with proj_free_int_list(). * @return a list of matching reference CRS, or nullptr in case of error. */ -PJ_OBJ_LIST *proj_obj_identify(PJ_OBJ *obj, const char *auth_name, +PJ_OBJ_LIST *proj_obj_identify(const PJ_OBJ *obj, const char *auth_name, const char *const *options, int **confidence) { assert(obj); (void)options; @@ -1629,7 +1713,8 @@ void proj_free_string_list(PROJ_STRING_LIST list) { * @return Object of type SingleOperation that must be unreferenced with * proj_obj_unref(), or NULL in case of error. */ -PJ_OBJ *proj_obj_crs_get_coordoperation(PJ_OBJ *crs, const char **pMethodName, +PJ_OBJ *proj_obj_crs_get_coordoperation(const PJ_OBJ *crs, + const char **pMethodName, const char **pMethodAuthorityName, const char **pMethodCode) { assert(crs); @@ -1682,8 +1767,9 @@ static PropertyMap createPropertyMapName(const char *name) { // --------------------------------------------------------------------------- static UnitOfMeasure createLinearUnit(const char *name, double convFactor) { - return name == nullptr ? UnitOfMeasure::METRE - : UnitOfMeasure(name, convFactor); + return name == nullptr + ? UnitOfMeasure::METRE + : UnitOfMeasure(name, convFactor, UnitOfMeasure::Type::LINEAR); } // --------------------------------------------------------------------------- @@ -1693,21 +1779,55 @@ static UnitOfMeasure createAngularUnit(const char *name, double convFactor) { ? UnitOfMeasure::DEGREE : ci_equal(name, "grad") ? UnitOfMeasure::GRAD - : UnitOfMeasure(name, convFactor)) + : UnitOfMeasure(name, convFactor, + UnitOfMeasure::Type::ANGULAR)) : UnitOfMeasure::DEGREE; } + +// --------------------------------------------------------------------------- + +static GeodeticReferenceFrameNNPtr createGeodeticReferenceFrame( + PJ_CONTEXT *ctx, const char *datumName, const char *ellipsoidName, + double semiMajorMetre, double invFlattening, const char *primeMeridianName, + double primeMeridianOffset, const char *angularUnits, + double angularUnitsConv) { + const UnitOfMeasure angUnit( + createAngularUnit(angularUnits, angularUnitsConv)); + auto dbContext = getDBcontext(ctx); + auto body = Ellipsoid::guessBodyName(dbContext, semiMajorMetre); + auto ellpsName = createPropertyMapName(ellipsoidName); + auto ellps = + invFlattening != 0.0 + ? Ellipsoid::createFlattenedSphere( + ellpsName, Length(semiMajorMetre), Scale(invFlattening), body) + : Ellipsoid::createSphere(ellpsName, Length(semiMajorMetre), body); + auto pm = PrimeMeridian::create( + PropertyMap().set(common::IdentifiedObject::NAME_KEY, + primeMeridianName ? primeMeridianName + : primeMeridianOffset == 0.0 + ? (ellps->celestialBody() == + Ellipsoid::EARTH + ? "Greenwich" + : "Reference meridian") + : "unnamed"), + Angle(primeMeridianOffset, angUnit)); + return GeodeticReferenceFrame::create(createPropertyMapName(datumName), + ellps, util::optional<std::string>(), + pm); +} + //! @endcond // --------------------------------------------------------------------------- -/** \brief Create a GeographicCRS 2D from its definition. +/** \brief Create a GeographicCRS. * * The returned object must be unreferenced with proj_obj_unref() after * use. * It should be used by at most one thread at a time. * * @param ctx PROJ context, or NULL for default context - * @param geogName Name of the GeographicCRS. Or NULL + * @param crsName Name of the GeographicCRS. Or NULL * @param datumName Name of the GeodeticReferenceFrame. Or NULL * @param ellipsoidName Name of the Ellipsoid. Or NULL * @param semiMajorMetre Ellipsoid semi-major axis, in metres. @@ -1715,52 +1835,34 @@ static UnitOfMeasure createAngularUnit(const char *name, double convFactor) { * @param primeMeridianName Name of the PrimeMeridian. Or NULL * @param primeMeridianOffset Offset of the prime meridian, expressed in the * specified angular units. - * @param angularUnits Name of the angular units. Or NULL for Degree - * @param angularUnitsConv Conversion factor from the angular unit to radian. Or + * @param pmAngularUnits Name of the angular units. Or NULL for Degree + * @param pmAngularUnitsConv Conversion factor from the angular unit to radian. + * Or * 0 for Degree if angularUnits == NULL. Otherwise should be not NULL - * @param latLongOrder TRUE for Latitude Longitude axis order. + * @param ellipsoidalCS Coordinate system. Must not be NULL. * * @return Object of type GeographicCRS that must be unreferenced with * proj_obj_unref(), or NULL in case of error. */ PJ_OBJ *proj_obj_create_geographic_crs( - PJ_CONTEXT *ctx, const char *geogName, const char *datumName, + PJ_CONTEXT *ctx, const char *crsName, const char *datumName, const char *ellipsoidName, double semiMajorMetre, double invFlattening, const char *primeMeridianName, double primeMeridianOffset, - const char *angularUnits, double angularUnitsConv, int latLongOrder) { + const char *pmAngularUnits, double pmAngularUnitsConv, + PJ_OBJ *ellipsoidalCS) { SANITIZE_CTX(ctx); + auto cs = util::nn_dynamic_pointer_cast<EllipsoidalCS>(ellipsoidalCS->obj); + if (!cs) { + return nullptr; + } try { - const UnitOfMeasure angUnit( - createAngularUnit(angularUnits, angularUnitsConv)); - auto dbContext = getDBcontext(ctx); - auto body = Ellipsoid::guessBodyName(dbContext, semiMajorMetre); - auto ellpsName = createPropertyMapName(ellipsoidName); - auto ellps = - invFlattening != 0.0 - ? Ellipsoid::createFlattenedSphere(ellpsName, - Length(semiMajorMetre), - Scale(invFlattening), body) - : Ellipsoid::createSphere(ellpsName, Length(semiMajorMetre), - body); - auto pm = PrimeMeridian::create( - PropertyMap().set( - common::IdentifiedObject::NAME_KEY, - primeMeridianName - ? primeMeridianName - : primeMeridianOffset == 0.0 - ? (ellps->celestialBody() == Ellipsoid::EARTH - ? "Greenwich" - : "Reference meridian") - : "unnamed"), - Angle(primeMeridianOffset, angUnit)); - auto datum = GeodeticReferenceFrame::create( - createPropertyMapName(datumName), ellps, - util::optional<std::string>(), pm); - auto geogCRS = GeographicCRS::create( - createPropertyMapName(geogName), datum, - latLongOrder ? cs::EllipsoidalCS::createLatitudeLongitude(angUnit) - : cs::EllipsoidalCS::createLongitudeLatitude(angUnit)); + auto datum = createGeodeticReferenceFrame( + ctx, datumName, ellipsoidName, semiMajorMetre, invFlattening, + primeMeridianName, primeMeridianOffset, pmAngularUnits, + pmAngularUnitsConv); + auto geogCRS = GeographicCRS::create(createPropertyMapName(crsName), + datum, NN_NO_CHECK(cs)); return PJ_OBJ::create(ctx, geogCRS); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); @@ -1770,22 +1872,775 @@ PJ_OBJ *proj_obj_create_geographic_crs( // --------------------------------------------------------------------------- +/** \brief Create a GeographicCRS. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param crsName Name of the GeographicCRS. Or NULL + * @param datum Datum. Must not be NULL. + * @param ellipsoidalCS Coordinate system. Must not be NULL. + * + * @return Object of type GeographicCRS that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ +PJ_OBJ *proj_obj_create_geographic_crs_from_datum(const char *crsName, + PJ_OBJ *datum, + PJ_OBJ *ellipsoidalCS) { + + auto l_datum = + util::nn_dynamic_pointer_cast<GeodeticReferenceFrame>(datum->obj); + if (!l_datum) { + proj_log_error(datum->ctx, __FUNCTION__, + "datum is not a GeodeticReferenceFrame"); + return nullptr; + } + auto cs = util::nn_dynamic_pointer_cast<EllipsoidalCS>(ellipsoidalCS->obj); + if (!cs) { + return nullptr; + } + try { + auto geogCRS = + GeographicCRS::create(createPropertyMapName(crsName), + NN_NO_CHECK(l_datum), NN_NO_CHECK(cs)); + return PJ_OBJ::create(datum->ctx, geogCRS); + } catch (const std::exception &e) { + proj_log_error(datum->ctx, __FUNCTION__, e.what()); + } + return nullptr; +} + +// --------------------------------------------------------------------------- + +/** \brief Create a GeodeticCRS of geocentric type. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param ctx PROJ context, or NULL for default context + * @param crsName Name of the GeographicCRS. Or NULL + * @param datumName Name of the GeodeticReferenceFrame. Or NULL + * @param ellipsoidName Name of the Ellipsoid. Or NULL + * @param semiMajorMetre Ellipsoid semi-major axis, in metres. + * @param invFlattening Ellipsoid inverse flattening. Or 0 for a sphere. + * @param primeMeridianName Name of the PrimeMeridian. Or NULL + * @param primeMeridianOffset Offset of the prime meridian, expressed in the + * specified angular units. + * @param angularUnits Name of the angular units. Or NULL for Degree + * @param angularUnitsConv Conversion factor from the angular unit to radian. Or + * 0 for Degree if angularUnits == NULL. Otherwise should be not NULL + * @param linearUnits Name of the linear units. Or NULL for Metre + * @param linearUnitsConv Conversion factor from the linear unit to metre. Or + * 0 for Metre if linearUnits == NULL. Otherwise should be not NULL + * + * @return Object of type GeodeticCRS that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ +PJ_OBJ *proj_obj_create_geocentric_crs( + PJ_CONTEXT *ctx, const char *crsName, const char *datumName, + const char *ellipsoidName, double semiMajorMetre, double invFlattening, + const char *primeMeridianName, double primeMeridianOffset, + const char *angularUnits, double angularUnitsConv, const char *linearUnits, + double linearUnitsConv) { + + SANITIZE_CTX(ctx); + try { + const UnitOfMeasure linearUnit( + createLinearUnit(linearUnits, linearUnitsConv)); + auto datum = createGeodeticReferenceFrame( + ctx, datumName, ellipsoidName, semiMajorMetre, invFlattening, + primeMeridianName, primeMeridianOffset, angularUnits, + angularUnitsConv); + + auto geodCRS = + GeodeticCRS::create(createPropertyMapName(crsName), datum, + cs::CartesianCS::createGeocentric(linearUnit)); + return PJ_OBJ::create(ctx, geodCRS); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; +} + +// --------------------------------------------------------------------------- + +/** \brief Create a GeodeticCRS of geocentric type. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param crsName Name of the GeographicCRS. Or NULL + * @param datum Datum. Must not be NULL. + * @param linearUnits Name of the linear units. Or NULL for Metre + * @param linearUnitsConv Conversion factor from the linear unit to metre. Or + * 0 for Metre if linearUnits == NULL. Otherwise should be not NULL + * + * @return Object of type GeodeticCRS that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ +PJ_OBJ *proj_obj_create_geocentric_crs_from_datum(const char *crsName, + const PJ_OBJ *datum, + const char *linearUnits, + double linearUnitsConv) { + try { + const UnitOfMeasure linearUnit( + createLinearUnit(linearUnits, linearUnitsConv)); + auto l_datum = + util::nn_dynamic_pointer_cast<GeodeticReferenceFrame>(datum->obj); + if (!l_datum) { + proj_log_error(datum->ctx, __FUNCTION__, + "datum is not a GeodeticReferenceFrame"); + return nullptr; + } + auto geodCRS = GeodeticCRS::create( + createPropertyMapName(crsName), NN_NO_CHECK(l_datum), + cs::CartesianCS::createGeocentric(linearUnit)); + return PJ_OBJ::create(datum->ctx, geodCRS); + } catch (const std::exception &e) { + proj_log_error(datum->ctx, __FUNCTION__, e.what()); + } + return nullptr; +} + +// --------------------------------------------------------------------------- + +/** \brief Return a copy of the object with its name changed + * + * Currently, only implemented on CRS objects. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param obj Object of type CRS. Must not be NULL + * @param name New name. Must not be NULL + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ +PJ_OBJ PROJ_DLL *proj_obj_alter_name(const PJ_OBJ *obj, const char *name) { + auto crs = dynamic_cast<const CRS *>(obj->obj.get()); + if (!crs) { + return nullptr; + } + try { + return PJ_OBJ::create(obj->ctx, crs->alterName(name)); + } catch (const std::exception &e) { + proj_log_error(obj->ctx, __FUNCTION__, e.what()); + } + return nullptr; +} + +// --------------------------------------------------------------------------- + +/** \brief Return a copy of the CRS with its geodetic CRS changed + * + * Currently, when obj is a GeodeticCRS, it returns a clone of newGeodCRS + * When obj is a ProjectedCRS, it replaces its base CRS with newGeodCRS. + * When obj is a CompoundCRS, it replaces the GeodeticCRS part of the horizontal + * CRS with newGeodCRS. + * In other cases, it returns a clone of obj. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param obj Object of type CRS. Must not be NULL + * @param newGeodCRS Object of type GeodeticCRS. Must not be NULL + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ +PJ_OBJ *proj_obj_crs_alter_geodetic_crs(const PJ_OBJ *obj, + const PJ_OBJ *newGeodCRS) { + auto l_newGeodCRS = + util::nn_dynamic_pointer_cast<GeodeticCRS>(newGeodCRS->obj); + if (!l_newGeodCRS) { + proj_log_error(obj->ctx, __FUNCTION__, + "newGeodCRS is not a GeodeticCRS"); + return nullptr; + } + + auto crs = dynamic_cast<const CRS *>(obj->obj.get()); + if (!crs) { + proj_log_error(obj->ctx, __FUNCTION__, "obj is not a CRS"); + return nullptr; + } + + try { + return PJ_OBJ::create(obj->ctx, + crs->alterGeodeticCRS(NN_NO_CHECK(l_newGeodCRS))); + } catch (const std::exception &e) { + proj_log_error(obj->ctx, __FUNCTION__, e.what()); + return nullptr; + } +} + +// --------------------------------------------------------------------------- + +/** \brief Return a copy of the CRS with its angular units changed + * + * The CRS must be or contain a GeographicCRS. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param obj Object of type CRS. Must not be NULL + * @param angularUnits Name of the angular units. Or NULL for Degree + * @param angularUnitsConv Conversion factor from the angular unit to radian. Or + * 0 for Degree if angularUnits == NULL. Otherwise should be not NULL + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ +PJ_OBJ *proj_obj_crs_alter_cs_angular_unit(const PJ_OBJ *obj, + const char *angularUnits, + double angularUnitsConv) { + + auto geodCRS = proj_obj_crs_get_geodetic_crs(obj); + if (!geodCRS) { + return nullptr; + } + auto geogCRS = dynamic_cast<const GeographicCRS *>(geodCRS->obj.get()); + if (!geogCRS) { + proj_obj_unref(geodCRS); + return nullptr; + } + + PJ_OBJ *geogCRSAltered = nullptr; + try { + const UnitOfMeasure angUnit( + createAngularUnit(angularUnits, angularUnitsConv)); + geogCRSAltered = PJ_OBJ::create( + obj->ctx, + GeographicCRS::create( + createPropertyMapName(proj_obj_get_name(geodCRS)), + geogCRS->datum(), geogCRS->datumEnsemble(), + geogCRS->coordinateSystem()->alterAngularUnit(angUnit))); + proj_obj_unref(geodCRS); + } catch (const std::exception &e) { + proj_log_error(obj->ctx, __FUNCTION__, e.what()); + proj_obj_unref(geodCRS); + return nullptr; + } + + auto ret = proj_obj_crs_alter_geodetic_crs(obj, geogCRSAltered); + proj_obj_unref(geogCRSAltered); + return ret; +} + +// --------------------------------------------------------------------------- + +/** \brief Return a copy of the CRS with the linear units of its coordinate + * system changed + * + * The CRS must be or contain a ProjectedCRS, VerticalCRS or a GeocentricCRS. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param obj Object of type CRS. Must not be NULL + * @param linearUnits Name of the linear units. Or NULL for Metre + * @param linearUnitsConv Conversion factor from the linear unit to metre. Or + * 0 for Metre if linearUnits == NULL. Otherwise should be not NULL + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ +PJ_OBJ *proj_obj_crs_alter_cs_linear_unit(const PJ_OBJ *obj, + const char *linearUnits, + double linearUnitsConv) { + auto crs = dynamic_cast<const CRS *>(obj->obj.get()); + if (!crs) { + return nullptr; + } + + try { + const UnitOfMeasure linearUnit( + createLinearUnit(linearUnits, linearUnitsConv)); + return PJ_OBJ::create(obj->ctx, crs->alterCSLinearUnit(linearUnit)); + } catch (const std::exception &e) { + proj_log_error(obj->ctx, __FUNCTION__, e.what()); + return nullptr; + } +} + +// --------------------------------------------------------------------------- + +/** \brief Return a copy of the CRS with the lineaer units of the parameters + * of its conversion modified. + * + * The CRS must be or contain a ProjectedCRS, VerticalCRS or a GeocentricCRS. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param obj Object of type ProjectedCRS. Must not be NULL + * @param linearUnits Name of the linear units. Or NULL for Metre + * @param linearUnitsConv Conversion factor from the linear unit to metre. Or + * 0 for Metre if linearUnits == NULL. Otherwise should be not NULL + * @param convertToNewUnit TRUE if exisiting values should be converted from + * their current unit to the new unit. If FALSE, their value will be left + * unchanged and the unit overriden (so the resulting CRS will not be + * equivalent to the original one for reprojection purposes). + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ +PJ_OBJ *proj_obj_crs_alter_parameters_linear_unit(const PJ_OBJ *obj, + const char *linearUnits, + double linearUnitsConv, + int convertToNewUnit) { + auto crs = dynamic_cast<const ProjectedCRS *>(obj->obj.get()); + if (!crs) { + return nullptr; + } + + try { + const UnitOfMeasure linearUnit( + createLinearUnit(linearUnits, linearUnitsConv)); + return PJ_OBJ::create( + obj->ctx, crs->alterParametersLinearUnit(linearUnit, + convertToNewUnit == TRUE)); + } catch (const std::exception &e) { + proj_log_error(obj->ctx, __FUNCTION__, e.what()); + return nullptr; + } +} + +// --------------------------------------------------------------------------- + +/** \brief Instanciate a EngineeringCRS with just a name + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param ctx PROJ context, or NULL for default context + * @param crsName CRS name. Or NULL. + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ +PJ_OBJ PROJ_DLL *proj_obj_create_engineering_crs(PJ_CONTEXT *ctx, + const char *crsName) { + try { + return PJ_OBJ::create( + ctx, EngineeringCRS::create( + createPropertyMapName(crsName), + EngineeringDatum::create(PropertyMap()), + CartesianCS::createEastingNorthing(UnitOfMeasure::METRE))); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + return nullptr; + } +} + +// --------------------------------------------------------------------------- + +/** \brief Instanciate a Conversion + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param ctx PROJ context, or NULL for default context + * @param name Conversion name. Or NULL. + * @param auth_name Conversion authority name. Or NULL. + * @param code Conversion code. Or NULL. + * @param method_name Method name. Or NULL. + * @param method_auth_name Method authority name. Or NULL. + * @param method_code Method code. Or NULL. + * @param param_count Number of parameters (size of params argument) + * @param params Parameter descriptions (array of size param_count) + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ + +PJ_OBJ *proj_obj_create_conversion(PJ_CONTEXT *ctx, const char *name, + const char *auth_name, const char *code, + const char *method_name, + const char *method_auth_name, + const char *method_code, int param_count, + const PJ_PARAM_DESCRIPTION *params) { + try { + PropertyMap propConv; + propConv.set(common::IdentifiedObject::NAME_KEY, + name ? name : "unnamed"); + if (auth_name && code) { + propConv.set(metadata::Identifier::CODESPACE_KEY, auth_name) + .set(metadata::Identifier::CODE_KEY, code); + } + PropertyMap propMethod; + propMethod.set(common::IdentifiedObject::NAME_KEY, + method_name ? method_name : "unnamed"); + if (method_auth_name && method_code) { + propMethod + .set(metadata::Identifier::CODESPACE_KEY, method_auth_name) + .set(metadata::Identifier::CODE_KEY, method_code); + } + std::vector<OperationParameterNNPtr> parameters; + std::vector<ParameterValueNNPtr> values; + for (int i = 0; i < param_count; i++) { + PropertyMap propParam; + propParam.set(common::IdentifiedObject::NAME_KEY, + params[i].name ? params[i].name : "unnamed"); + if (params[i].auth_name && params[i].code) { + propParam + .set(metadata::Identifier::CODESPACE_KEY, + params[i].auth_name) + .set(metadata::Identifier::CODE_KEY, params[i].code); + } + parameters.emplace_back(OperationParameter::create(propParam)); + auto unit_type = UnitOfMeasure::Type::UNKNOWN; + switch (params[i].unit_type) { + case PJ_UT_ANGULAR: + unit_type = UnitOfMeasure::Type::ANGULAR; + break; + case PJ_UT_LINEAR: + unit_type = UnitOfMeasure::Type::LINEAR; + break; + case PJ_UT_SCALE: + unit_type = UnitOfMeasure::Type::SCALE; + break; + case PJ_UT_TIME: + unit_type = UnitOfMeasure::Type::TIME; + break; + case PJ_UT_PARAMETRIC: + unit_type = UnitOfMeasure::Type::PARAMETRIC; + break; + } + + Measure measure( + params[i].value, + params[i].unit_type == PJ_UT_ANGULAR + ? createAngularUnit(params[i].unit_name, + params[i].unit_conv_factor) + : params[i].unit_type == PJ_UT_LINEAR + ? createLinearUnit(params[i].unit_name, + params[i].unit_conv_factor) + : UnitOfMeasure( + params[i].unit_name ? params[i].unit_name + : "unnamed", + params[i].unit_conv_factor, unit_type)); + values.emplace_back(ParameterValue::create(measure)); + } + return PJ_OBJ::create( + ctx, Conversion::create(propConv, propMethod, parameters, values)); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + return nullptr; + } +} + +// --------------------------------------------------------------------------- + //! @cond Doxygen_Suppress -static PJ_OBJ *proj_obj_create_projected_crs(PJ_OBJ *geodetic_crs, - const char *crs_name, - const ConversionNNPtr &conv, - const UnitOfMeasure &linearUnit) { - assert(geodetic_crs); - auto geogCRS = +static CoordinateSystemAxisNNPtr createAxis(const PJ_AXIS_DESCRIPTION &axis) { + const auto dir = + axis.direction ? AxisDirection::valueOf(axis.direction) : nullptr; + if (dir == nullptr) + throw Exception("invalid value for axis direction"); + auto unit_type = UnitOfMeasure::Type::UNKNOWN; + switch (axis.unit_type) { + case PJ_UT_ANGULAR: + unit_type = UnitOfMeasure::Type::ANGULAR; + break; + case PJ_UT_LINEAR: + unit_type = UnitOfMeasure::Type::LINEAR; + break; + case PJ_UT_SCALE: + unit_type = UnitOfMeasure::Type::SCALE; + break; + case PJ_UT_TIME: + unit_type = UnitOfMeasure::Type::TIME; + break; + case PJ_UT_PARAMETRIC: + unit_type = UnitOfMeasure::Type::PARAMETRIC; + break; + } + auto unit = + axis.unit_type == PJ_UT_ANGULAR + ? createAngularUnit(axis.unit_name, axis.unit_conv_factor) + : axis.unit_type == PJ_UT_LINEAR + ? createLinearUnit(axis.unit_name, axis.unit_conv_factor) + : UnitOfMeasure(axis.unit_name ? axis.unit_name : "unnamed", + axis.unit_conv_factor, unit_type); + + return CoordinateSystemAxis::create( + createPropertyMapName(axis.name), + axis.abbreviation ? axis.abbreviation : std::string(), *dir, unit); +} + +//! @endcond + +// --------------------------------------------------------------------------- + +/** \brief Instanciate a CoordinateSystem. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param ctx PROJ context, or NULL for default context + * @param type Coordinate system type. + * @param axis_count Number of axis + * @param axis Axis description (array of size axis_count) + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ + +PJ_OBJ *proj_obj_create_cs(PJ_CONTEXT *ctx, PJ_COORDINATE_SYSTEM_TYPE type, + int axis_count, const PJ_AXIS_DESCRIPTION *axis) { + try { + switch (type) { + case PJ_CS_TYPE_UNKNOWN: + return nullptr; + + case PJ_CS_TYPE_CARTESIAN: { + if (axis_count == 2) { + return PJ_OBJ::create( + ctx, CartesianCS::create(PropertyMap(), createAxis(axis[0]), + createAxis(axis[1]))); + } else if (axis_count == 3) { + return PJ_OBJ::create( + ctx, CartesianCS::create(PropertyMap(), createAxis(axis[0]), + createAxis(axis[1]), + createAxis(axis[2]))); + } + break; + } + + case PJ_CS_TYPE_ELLIPSOIDAL: { + if (axis_count == 2) { + return PJ_OBJ::create( + ctx, + EllipsoidalCS::create(PropertyMap(), createAxis(axis[0]), + createAxis(axis[1]))); + } else if (axis_count == 3) { + return PJ_OBJ::create( + ctx, EllipsoidalCS::create( + PropertyMap(), createAxis(axis[0]), + createAxis(axis[1]), createAxis(axis[2]))); + } + break; + } + + case PJ_CS_TYPE_VERTICAL: { + if (axis_count == 1) { + return PJ_OBJ::create( + ctx, + VerticalCS::create(PropertyMap(), createAxis(axis[0]))); + } + break; + } + + case PJ_CS_TYPE_SPHERICAL: { + if (axis_count == 3) { + return PJ_OBJ::create( + ctx, EllipsoidalCS::create( + PropertyMap(), createAxis(axis[0]), + createAxis(axis[1]), createAxis(axis[2]))); + } + break; + } + + case PJ_CS_TYPE_PARAMETRIC: { + if (axis_count == 1) { + return PJ_OBJ::create( + ctx, + ParametricCS::create(PropertyMap(), createAxis(axis[0]))); + } + break; + } + + case PJ_CS_TYPE_ORDINAL: { + std::vector<CoordinateSystemAxisNNPtr> axisVector; + for (int i = 0; i < axis_count; i++) { + axisVector.emplace_back(createAxis(axis[i])); + } + + return PJ_OBJ::create(ctx, + OrdinalCS::create(PropertyMap(), axisVector)); + } + + case PJ_CS_TYPE_DATETIMETEMPORAL: { + if (axis_count == 1) { + return PJ_OBJ::create( + ctx, DateTimeTemporalCS::create(PropertyMap(), + createAxis(axis[0]))); + } + break; + } + + case PJ_CS_TYPE_TEMPORALCOUNT: { + if (axis_count == 1) { + return PJ_OBJ::create( + ctx, TemporalCountCS::create(PropertyMap(), + createAxis(axis[0]))); + } + break; + } + + case PJ_CS_TYPE_TEMPORALMEASURE: { + if (axis_count == 1) { + return PJ_OBJ::create( + ctx, TemporalMeasureCS::create(PropertyMap(), + createAxis(axis[0]))); + } + break; + } + } + + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + return nullptr; + } + proj_log_error(ctx, __FUNCTION__, "Wrong value for axis_count"); + return nullptr; +} + +// --------------------------------------------------------------------------- + +/** \brief Instanciate a CartesiansCS 2D + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param ctx PROJ context, or NULL for default context + * @param type Coordinate system type. + * @param unit_name Unit name. + * @param unit_conv_factor Unit conversion factor to SI. + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ + +PJ_OBJ *proj_obj_create_cartesian_2D_cs(PJ_CONTEXT *ctx, + PJ_CARTESIAN_CS_2D_TYPE type, + const char *unit_name, + double unit_conv_factor) { + try { + switch (type) { + case PJ_CART2D_EASTING_NORTHING: + return PJ_OBJ::create( + ctx, CartesianCS::createEastingNorthing( + createLinearUnit(unit_name, unit_conv_factor))); + + case PJ_CART2D_NORTHING_EASTING: + return PJ_OBJ::create( + ctx, CartesianCS::createNorthingEasting( + createLinearUnit(unit_name, unit_conv_factor))); + } + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; +} + +// --------------------------------------------------------------------------- + +/** \brief Instanciate a Ellipsoidal 2D + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param ctx PROJ context, or NULL for default context + * @param type Coordinate system type. + * @param unit_name Unit name. + * @param unit_conv_factor Unit conversion factor to SI. + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ + +PJ_OBJ *proj_obj_create_ellipsoidal_2D_cs(PJ_CONTEXT *ctx, + PJ_ELLIPSOIDAL_CS_2D_TYPE type, + const char *unit_name, + double unit_conv_factor) { + try { + switch (type) { + case PJ_ELLPS2D_LONGITUDE_LATITUDE: + return PJ_OBJ::create( + ctx, EllipsoidalCS::createLongitudeLatitude( + createAngularUnit(unit_name, unit_conv_factor))); + + case PJ_ELLPS2D_LATITUDE_LONGITUDE: + return PJ_OBJ::create( + ctx, EllipsoidalCS::createLatitudeLongitude( + createAngularUnit(unit_name, unit_conv_factor))); + } + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; +} + +// --------------------------------------------------------------------------- + +/** \brief Instanciate a ProjectedCRS + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param crs_name CRS name. Or NULL + * @param geodetic_crs Base GeodeticCRS. Must not be NULL. + * @param conversion Conversion. Must not be NULL. + * @param coordinate_system Cartesian coordinate system. Must not be NULL. + * + * @return Object that must be unreferenced with + * proj_obj_unref(), or NULL in case of error. + */ + +PJ_OBJ *proj_obj_create_projected_crs(const char *crs_name, + const PJ_OBJ *geodetic_crs, + const PJ_OBJ *conversion, + const PJ_OBJ *coordinate_system) { + auto geodCRS = util::nn_dynamic_pointer_cast<GeodeticCRS>(geodetic_crs->obj); - if (!geogCRS) { + if (!geodCRS) { return nullptr; } - auto crs = ProjectedCRS::create( - createPropertyMapName(crs_name), NN_NO_CHECK(geogCRS), conv, - cs::CartesianCS::createEastingNorthing(linearUnit)); - return PJ_OBJ::create(geodetic_crs->ctx, crs); + auto conv = util::nn_dynamic_pointer_cast<Conversion>(conversion->obj); + if (!conv) { + return nullptr; + } + auto cs = + util::nn_dynamic_pointer_cast<CartesianCS>(coordinate_system->obj); + if (!cs) { + return nullptr; + } + try { + return PJ_OBJ::create( + geodetic_crs->ctx, + ProjectedCRS::create(createPropertyMapName(crs_name), + NN_NO_CHECK(geodCRS), NN_NO_CHECK(conv), + NN_NO_CHECK(cs))); + } catch (const std::exception &e) { + proj_log_error(geodetic_crs->ctx, __FUNCTION__, e.what()); + } + return nullptr; +} + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress + +static PJ_OBJ *proj_obj_create_conversion(PJ_CONTEXT *ctx, + const ConversionNNPtr &conv) { + return PJ_OBJ::create(ctx, conv); } //! @endcond @@ -1801,13 +2656,14 @@ static PJ_OBJ *proj_obj_create_projected_crs(PJ_OBJ *geodetic_crs, * * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_UTM(PJ_OBJ *geodetic_crs, - const char *crs_name, int zone, - int north) { - const auto &linearUnit = UnitOfMeasure::METRE; - auto conv = Conversion::createUTM(PropertyMap(), zone, north != 0); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_utm(PJ_CONTEXT *ctx, int zone, int north) { + try { + auto conv = Conversion::createUTM(PropertyMap(), zone, north != 0); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -1819,20 +2675,26 @@ PJ_OBJ *proj_obj_create_projected_crs_UTM(PJ_OBJ *geodetic_crs, * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_TransverseMercator( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double scale, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createTransverseMercator( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Scale(scale), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_transverse_mercator( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createTransverseMercator( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Scale(scale), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -1845,20 +2707,26 @@ PJ_OBJ *proj_obj_create_projected_crs_TransverseMercator( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_GaussSchreiberTransverseMercator( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double scale, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createGaussSchreiberTransverseMercator( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Scale(scale), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_gauss_schreiber_transverse_mercator( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createGaussSchreiberTransverseMercator( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Scale(scale), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -1871,20 +2739,26 @@ PJ_OBJ *proj_obj_create_projected_crs_GaussSchreiberTransverseMercator( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_TransverseMercatorSouthOriented( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double scale, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createTransverseMercatorSouthOriented( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Scale(scale), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_transverse_mercator_south_oriented( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createTransverseMercatorSouthOriented( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Scale(scale), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -1896,23 +2770,28 @@ PJ_OBJ *proj_obj_create_projected_crs_TransverseMercatorSouthOriented( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_TwoPointEquidistant( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFirstPoint, - double longitudeFirstPoint, double latitudeSecondPoint, - double longitudeSeconPoint, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_two_point_equidistant( + PJ_CONTEXT *ctx, double latitudeFirstPoint, double longitudeFirstPoint, + double latitudeSecondPoint, double longitudeSeconPoint, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createTwoPointEquidistant( - PropertyMap(), Angle(latitudeFirstPoint, angUnit), - Angle(longitudeFirstPoint, angUnit), - Angle(latitudeSecondPoint, angUnit), - Angle(longitudeSeconPoint, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createTwoPointEquidistant( + PropertyMap(), Angle(latitudeFirstPoint, angUnit), + Angle(longitudeFirstPoint, angUnit), + Angle(latitudeSecondPoint, angUnit), + Angle(longitudeSeconPoint, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -1924,19 +2803,24 @@ PJ_OBJ *proj_obj_create_projected_crs_TwoPointEquidistant( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_TunisiaMappingGrid( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_tunisia_mapping_grid( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createTunisiaMappingGrid( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createTunisiaMappingGrid( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -1948,25 +2832,29 @@ PJ_OBJ *proj_obj_create_projected_crs_TunisiaMappingGrid( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_AlbersEqualArea( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFalseOrigin, - double longitudeFalseOrigin, double latitudeFirstParallel, - double latitudeSecondParallel, double eastingFalseOrigin, - double northingFalseOrigin, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createAlbersEqualArea( - PropertyMap(), Angle(latitudeFalseOrigin, angUnit), - Angle(longitudeFalseOrigin, angUnit), - Angle(latitudeFirstParallel, angUnit), - Angle(latitudeSecondParallel, angUnit), - Length(eastingFalseOrigin, linearUnit), - Length(northingFalseOrigin, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_albers_equal_area( + PJ_CONTEXT *ctx, double latitudeFalseOrigin, double longitudeFalseOrigin, + double latitudeFirstParallel, double latitudeSecondParallel, + double eastingFalseOrigin, double northingFalseOrigin, + const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createAlbersEqualArea( + PropertyMap(), Angle(latitudeFalseOrigin, angUnit), + Angle(longitudeFalseOrigin, angUnit), + Angle(latitudeFirstParallel, angUnit), + Angle(latitudeSecondParallel, angUnit), + Length(eastingFalseOrigin, linearUnit), + Length(northingFalseOrigin, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -1978,20 +2866,26 @@ PJ_OBJ *proj_obj_create_projected_crs_AlbersEqualArea( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_LambertConicConformal_1SP( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double scale, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createLambertConicConformal_1SP( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Scale(scale), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_lambert_conic_conformal_1sp( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createLambertConicConformal_1SP( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Scale(scale), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2003,25 +2897,29 @@ PJ_OBJ *proj_obj_create_projected_crs_LambertConicConformal_1SP( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_LambertConicConformal_2SP( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFalseOrigin, - double longitudeFalseOrigin, double latitudeFirstParallel, - double latitudeSecondParallel, double eastingFalseOrigin, - double northingFalseOrigin, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createLambertConicConformal_2SP( - PropertyMap(), Angle(latitudeFalseOrigin, angUnit), - Angle(longitudeFalseOrigin, angUnit), - Angle(latitudeFirstParallel, angUnit), - Angle(latitudeSecondParallel, angUnit), - Length(eastingFalseOrigin, linearUnit), - Length(northingFalseOrigin, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_lambert_conic_conformal_2sp( + PJ_CONTEXT *ctx, double latitudeFalseOrigin, double longitudeFalseOrigin, + double latitudeFirstParallel, double latitudeSecondParallel, + double eastingFalseOrigin, double northingFalseOrigin, + const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createLambertConicConformal_2SP( + PropertyMap(), Angle(latitudeFalseOrigin, angUnit), + Angle(longitudeFalseOrigin, angUnit), + Angle(latitudeFirstParallel, angUnit), + Angle(latitudeSecondParallel, angUnit), + Length(eastingFalseOrigin, linearUnit), + Length(northingFalseOrigin, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2034,25 +2932,31 @@ PJ_OBJ *proj_obj_create_projected_crs_LambertConicConformal_2SP( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_LambertConicConformal_2SP_Michigan( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFalseOrigin, - double longitudeFalseOrigin, double latitudeFirstParallel, - double latitudeSecondParallel, double eastingFalseOrigin, - double northingFalseOrigin, double ellipsoidScalingFactor, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createLambertConicConformal_2SP_Michigan( - PropertyMap(), Angle(latitudeFalseOrigin, angUnit), - Angle(longitudeFalseOrigin, angUnit), - Angle(latitudeFirstParallel, angUnit), - Angle(latitudeSecondParallel, angUnit), - Length(eastingFalseOrigin, linearUnit), - Length(northingFalseOrigin, linearUnit), Scale(ellipsoidScalingFactor)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_lambert_conic_conformal_2sp_michigan( + PJ_CONTEXT *ctx, double latitudeFalseOrigin, double longitudeFalseOrigin, + double latitudeFirstParallel, double latitudeSecondParallel, + double eastingFalseOrigin, double northingFalseOrigin, + double ellipsoidScalingFactor, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createLambertConicConformal_2SP_Michigan( + PropertyMap(), Angle(latitudeFalseOrigin, angUnit), + Angle(longitudeFalseOrigin, angUnit), + Angle(latitudeFirstParallel, angUnit), + Angle(latitudeSecondParallel, angUnit), + Length(eastingFalseOrigin, linearUnit), + Length(northingFalseOrigin, linearUnit), + Scale(ellipsoidScalingFactor)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2065,25 +2969,29 @@ PJ_OBJ *proj_obj_create_projected_crs_LambertConicConformal_2SP_Michigan( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_LambertConicConformal_2SP_Belgium( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFalseOrigin, - double longitudeFalseOrigin, double latitudeFirstParallel, - double latitudeSecondParallel, double eastingFalseOrigin, - double northingFalseOrigin, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createLambertConicConformal_2SP_Belgium( - PropertyMap(), Angle(latitudeFalseOrigin, angUnit), - Angle(longitudeFalseOrigin, angUnit), - Angle(latitudeFirstParallel, angUnit), - Angle(latitudeSecondParallel, angUnit), - Length(eastingFalseOrigin, linearUnit), - Length(northingFalseOrigin, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_lambert_conic_conformal_2sp_belgium( + PJ_CONTEXT *ctx, double latitudeFalseOrigin, double longitudeFalseOrigin, + double latitudeFirstParallel, double latitudeSecondParallel, + double eastingFalseOrigin, double northingFalseOrigin, + const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createLambertConicConformal_2SP_Belgium( + PropertyMap(), Angle(latitudeFalseOrigin, angUnit), + Angle(longitudeFalseOrigin, angUnit), + Angle(latitudeFirstParallel, angUnit), + Angle(latitudeSecondParallel, angUnit), + Length(eastingFalseOrigin, linearUnit), + Length(northingFalseOrigin, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2095,20 +3003,26 @@ PJ_OBJ *proj_obj_create_projected_crs_LambertConicConformal_2SP_Belgium( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_AzimuthalEquidistant( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeNatOrigin, - double longitudeNatOrigin, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createAzimuthalEquidistant( - PropertyMap(), Angle(latitudeNatOrigin, angUnit), - Angle(longitudeNatOrigin, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_azimuthal_equidistant( + PJ_CONTEXT *ctx, double latitudeNatOrigin, double longitudeNatOrigin, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createAzimuthalEquidistant( + PropertyMap(), Angle(latitudeNatOrigin, angUnit), + Angle(longitudeNatOrigin, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2120,20 +3034,26 @@ PJ_OBJ *proj_obj_create_projected_crs_AzimuthalEquidistant( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_GuamProjection( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeNatOrigin, - double longitudeNatOrigin, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createGuamProjection( - PropertyMap(), Angle(latitudeNatOrigin, angUnit), - Angle(longitudeNatOrigin, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_guam_projection( + PJ_CONTEXT *ctx, double latitudeNatOrigin, double longitudeNatOrigin, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createGuamProjection( + PropertyMap(), Angle(latitudeNatOrigin, angUnit), + Angle(longitudeNatOrigin, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2145,20 +3065,26 @@ PJ_OBJ *proj_obj_create_projected_crs_GuamProjection( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_Bonne( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeNatOrigin, - double longitudeNatOrigin, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createBonne( - PropertyMap(), Angle(latitudeNatOrigin, angUnit), - Angle(longitudeNatOrigin, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_bonne( + PJ_CONTEXT *ctx, double latitudeNatOrigin, double longitudeNatOrigin, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createBonne(PropertyMap(), + Angle(latitudeNatOrigin, angUnit), + Angle(longitudeNatOrigin, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2171,20 +3097,26 @@ PJ_OBJ *proj_obj_create_projected_crs_Bonne( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_LambertCylindricalEqualAreaSpherical( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFirstParallel, - double longitudeNatOrigin, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createLambertCylindricalEqualAreaSpherical( - PropertyMap(), Angle(latitudeFirstParallel, angUnit), - Angle(longitudeNatOrigin, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_lambert_cylindrical_equal_area_spherical( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double longitudeNatOrigin, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createLambertCylindricalEqualAreaSpherical( + PropertyMap(), Angle(latitudeFirstParallel, angUnit), + Angle(longitudeNatOrigin, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2196,20 +3128,26 @@ PJ_OBJ *proj_obj_create_projected_crs_LambertCylindricalEqualAreaSpherical( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_LambertCylindricalEqualArea( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFirstParallel, - double longitudeNatOrigin, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createLambertCylindricalEqualArea( - PropertyMap(), Angle(latitudeFirstParallel, angUnit), - Angle(longitudeNatOrigin, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_lambert_cylindrical_equal_area( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double longitudeNatOrigin, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createLambertCylindricalEqualArea( + PropertyMap(), Angle(latitudeFirstParallel, angUnit), + Angle(longitudeNatOrigin, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2221,19 +3159,24 @@ PJ_OBJ *proj_obj_create_projected_crs_LambertCylindricalEqualArea( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_CassiniSoldner( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_cassini_soldner( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createCassiniSoldner( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createCassiniSoldner( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2245,22 +3188,28 @@ PJ_OBJ *proj_obj_create_projected_crs_CassiniSoldner( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EquidistantConic( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double latitudeFirstParallel, - double latitudeSecondParallel, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEquidistantConic( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Angle(latitudeFirstParallel, angUnit), - Angle(latitudeSecondParallel, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_equidistant_conic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, + double latitudeFirstParallel, double latitudeSecondParallel, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createEquidistantConic( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Angle(latitudeFirstParallel, angUnit), + Angle(latitudeSecondParallel, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2272,19 +3221,24 @@ PJ_OBJ *proj_obj_create_projected_crs_EquidistantConic( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EckertI( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEckertI( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_eckert_i( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = + Conversion::createEckertI(PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2296,19 +3250,24 @@ PJ_OBJ *proj_obj_create_projected_crs_EckertI( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EckertII( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEckertII( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_eckert_ii( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createEckertII( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2320,19 +3279,24 @@ PJ_OBJ *proj_obj_create_projected_crs_EckertII( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EckertIII( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEckertIII( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_eckert_iii( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createEckertIII( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2344,19 +3308,24 @@ PJ_OBJ *proj_obj_create_projected_crs_EckertIII( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EckertIV( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEckertIV( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_eckert_iv( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createEckertIV( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2368,19 +3337,24 @@ PJ_OBJ *proj_obj_create_projected_crs_EckertIV( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EckertV( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEckertV( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_eckert_v( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = + Conversion::createEckertV(PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2392,19 +3366,24 @@ PJ_OBJ *proj_obj_create_projected_crs_EckertV( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EckertVI( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEckertVI( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_eckert_vi( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createEckertVI( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2416,20 +3395,26 @@ PJ_OBJ *proj_obj_create_projected_crs_EckertVI( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EquidistantCylindrical( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFirstParallel, - double longitudeNatOrigin, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEquidistantCylindrical( - PropertyMap(), Angle(latitudeFirstParallel, angUnit), - Angle(longitudeNatOrigin, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_equidistant_cylindrical( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double longitudeNatOrigin, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createEquidistantCylindrical( + PropertyMap(), Angle(latitudeFirstParallel, angUnit), + Angle(longitudeNatOrigin, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2442,20 +3427,26 @@ PJ_OBJ *proj_obj_create_projected_crs_EquidistantCylindrical( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EquidistantCylindricalSpherical( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFirstParallel, - double longitudeNatOrigin, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEquidistantCylindricalSpherical( - PropertyMap(), Angle(latitudeFirstParallel, angUnit), - Angle(longitudeNatOrigin, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_equidistant_cylindrical_spherical( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double longitudeNatOrigin, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createEquidistantCylindricalSpherical( + PropertyMap(), Angle(latitudeFirstParallel, angUnit), + Angle(longitudeNatOrigin, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2467,19 +3458,24 @@ PJ_OBJ *proj_obj_create_projected_crs_EquidistantCylindricalSpherical( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_Gall( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createGall( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_gall( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = + Conversion::createGall(PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2491,19 +3487,24 @@ PJ_OBJ *proj_obj_create_projected_crs_Gall( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_GoodeHomolosine( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createGoodeHomolosine( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_goode_homolosine( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createGoodeHomolosine( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2515,19 +3516,24 @@ PJ_OBJ *proj_obj_create_projected_crs_GoodeHomolosine( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_InterruptedGoodeHomolosine( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createInterruptedGoodeHomolosine( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_interrupted_goode_homolosine( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createInterruptedGoodeHomolosine( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2540,19 +3546,24 @@ PJ_OBJ *proj_obj_create_projected_crs_InterruptedGoodeHomolosine( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_GeostationarySatelliteSweepX( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double height, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_geostationary_satellite_sweep_x( + PJ_CONTEXT *ctx, double centerLong, double height, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createGeostationarySatelliteSweepX( - PropertyMap(), Angle(centerLong, angUnit), Length(height, linearUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createGeostationarySatelliteSweepX( + PropertyMap(), Angle(centerLong, angUnit), + Length(height, linearUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2565,19 +3576,24 @@ PJ_OBJ *proj_obj_create_projected_crs_GeostationarySatelliteSweepX( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_GeostationarySatelliteSweepY( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double height, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_geostationary_satellite_sweep_y( + PJ_CONTEXT *ctx, double centerLong, double height, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createGeostationarySatelliteSweepY( - PropertyMap(), Angle(centerLong, angUnit), Length(height, linearUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createGeostationarySatelliteSweepY( + PropertyMap(), Angle(centerLong, angUnit), + Length(height, linearUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2589,19 +3605,24 @@ PJ_OBJ *proj_obj_create_projected_crs_GeostationarySatelliteSweepY( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_Gnomonic( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_gnomonic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createGnomonic( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createGnomonic( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2614,23 +3635,29 @@ PJ_OBJ *proj_obj_create_projected_crs_Gnomonic( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_HotineObliqueMercatorVariantA( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeProjectionCentre, +PJ_OBJ *proj_obj_create_conversion_hotine_oblique_mercator_variant_a( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double longitudeProjectionCentre, double azimuthInitialLine, double angleFromRectifiedToSkrewGrid, double scale, double falseEasting, double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createHotineObliqueMercatorVariantA( - PropertyMap(), Angle(latitudeProjectionCentre, angUnit), - Angle(longitudeProjectionCentre, angUnit), - Angle(azimuthInitialLine, angUnit), - Angle(angleFromRectifiedToSkrewGrid, angUnit), Scale(scale), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createHotineObliqueMercatorVariantA( + PropertyMap(), Angle(latitudeProjectionCentre, angUnit), + Angle(longitudeProjectionCentre, angUnit), + Angle(azimuthInitialLine, angUnit), + Angle(angleFromRectifiedToSkrewGrid, angUnit), Scale(scale), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2643,25 +3670,30 @@ PJ_OBJ *proj_obj_create_projected_crs_HotineObliqueMercatorVariantA( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_HotineObliqueMercatorVariantB( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeProjectionCentre, +PJ_OBJ *proj_obj_create_conversion_hotine_oblique_mercator_variant_b( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double longitudeProjectionCentre, double azimuthInitialLine, double angleFromRectifiedToSkrewGrid, double scale, double eastingProjectionCentre, double northingProjectionCentre, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createHotineObliqueMercatorVariantB( - PropertyMap(), Angle(latitudeProjectionCentre, angUnit), - Angle(longitudeProjectionCentre, angUnit), - Angle(azimuthInitialLine, angUnit), - Angle(angleFromRectifiedToSkrewGrid, angUnit), Scale(scale), - Length(eastingProjectionCentre, linearUnit), - Length(northingProjectionCentre, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createHotineObliqueMercatorVariantB( + PropertyMap(), Angle(latitudeProjectionCentre, angUnit), + Angle(longitudeProjectionCentre, angUnit), + Angle(azimuthInitialLine, angUnit), + Angle(angleFromRectifiedToSkrewGrid, angUnit), Scale(scale), + Length(eastingProjectionCentre, linearUnit), + Length(northingProjectionCentre, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2675,24 +3707,30 @@ PJ_OBJ *proj_obj_create_projected_crs_HotineObliqueMercatorVariantB( * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ PJ_OBJ * -proj_obj_create_projected_crs_HotineObliqueMercatorTwoPointNaturalOrigin( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeProjectionCentre, - double latitudePoint1, double longitudePoint1, double latitudePoint2, - double longitudePoint2, double scale, double eastingProjectionCentre, +proj_obj_create_conversion_hotine_oblique_mercator_two_point_natural_origin( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double latitudePoint1, + double longitudePoint1, double latitudePoint2, double longitudePoint2, + double scale, double eastingProjectionCentre, double northingProjectionCentre, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createHotineObliqueMercatorTwoPointNaturalOrigin( - PropertyMap(), Angle(latitudeProjectionCentre, angUnit), - Angle(latitudePoint1, angUnit), Angle(longitudePoint1, angUnit), - Angle(latitudePoint2, angUnit), Angle(longitudePoint2, angUnit), - Scale(scale), Length(eastingProjectionCentre, linearUnit), - Length(northingProjectionCentre, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = + Conversion::createHotineObliqueMercatorTwoPointNaturalOrigin( + PropertyMap(), Angle(latitudeProjectionCentre, angUnit), + Angle(latitudePoint1, angUnit), Angle(longitudePoint1, angUnit), + Angle(latitudePoint2, angUnit), Angle(longitudePoint2, angUnit), + Scale(scale), Length(eastingProjectionCentre, linearUnit), + Length(northingProjectionCentre, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2705,22 +3743,27 @@ proj_obj_create_projected_crs_HotineObliqueMercatorTwoPointNaturalOrigin( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_InternationalMapWorldPolyconic( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double latitudeFirstParallel, double latitudeSecondParallel, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createInternationalMapWorldPolyconic( - PropertyMap(), Angle(centerLong, angUnit), - Angle(latitudeFirstParallel, angUnit), - Angle(latitudeSecondParallel, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_international_map_world_polyconic( + PJ_CONTEXT *ctx, double centerLong, double latitudeFirstParallel, + double latitudeSecondParallel, double falseEasting, double falseNorthing, + const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createInternationalMapWorldPolyconic( + PropertyMap(), Angle(centerLong, angUnit), + Angle(latitudeFirstParallel, angUnit), + Angle(latitudeSecondParallel, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2732,24 +3775,30 @@ PJ_OBJ *proj_obj_create_projected_crs_InternationalMapWorldPolyconic( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_KrovakNorthOriented( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeProjectionCentre, - double longitudeOfOrigin, double colatitudeConeAxis, - double latitudePseudoStandardParallel, +PJ_OBJ *proj_obj_create_conversion_krovak_north_oriented( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double longitudeOfOrigin, + double colatitudeConeAxis, double latitudePseudoStandardParallel, double scaleFactorPseudoStandardParallel, double falseEasting, double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createKrovakNorthOriented( - PropertyMap(), Angle(latitudeProjectionCentre, angUnit), - Angle(longitudeOfOrigin, angUnit), Angle(colatitudeConeAxis, angUnit), - Angle(latitudePseudoStandardParallel, angUnit), - Scale(scaleFactorPseudoStandardParallel), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createKrovakNorthOriented( + PropertyMap(), Angle(latitudeProjectionCentre, angUnit), + Angle(longitudeOfOrigin, angUnit), + Angle(colatitudeConeAxis, angUnit), + Angle(latitudePseudoStandardParallel, angUnit), + Scale(scaleFactorPseudoStandardParallel), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2761,24 +3810,30 @@ PJ_OBJ *proj_obj_create_projected_crs_KrovakNorthOriented( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_Krovak( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeProjectionCentre, - double longitudeOfOrigin, double colatitudeConeAxis, - double latitudePseudoStandardParallel, +PJ_OBJ *proj_obj_create_conversion_krovak( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double longitudeOfOrigin, + double colatitudeConeAxis, double latitudePseudoStandardParallel, double scaleFactorPseudoStandardParallel, double falseEasting, double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createKrovak( - PropertyMap(), Angle(latitudeProjectionCentre, angUnit), - Angle(longitudeOfOrigin, angUnit), Angle(colatitudeConeAxis, angUnit), - Angle(latitudePseudoStandardParallel, angUnit), - Scale(scaleFactorPseudoStandardParallel), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createKrovak( + PropertyMap(), Angle(latitudeProjectionCentre, angUnit), + Angle(longitudeOfOrigin, angUnit), + Angle(colatitudeConeAxis, angUnit), + Angle(latitudePseudoStandardParallel, angUnit), + Scale(scaleFactorPseudoStandardParallel), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2790,20 +3845,26 @@ PJ_OBJ *proj_obj_create_projected_crs_Krovak( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_LambertAzimuthalEqualArea( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeNatOrigin, - double longitudeNatOrigin, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createLambertAzimuthalEqualArea( - PropertyMap(), Angle(latitudeNatOrigin, angUnit), - Angle(longitudeNatOrigin, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_lambert_azimuthal_equal_area( + PJ_CONTEXT *ctx, double latitudeNatOrigin, double longitudeNatOrigin, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createLambertAzimuthalEqualArea( + PropertyMap(), Angle(latitudeNatOrigin, angUnit), + Angle(longitudeNatOrigin, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2815,19 +3876,24 @@ PJ_OBJ *proj_obj_create_projected_crs_LambertAzimuthalEqualArea( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_MillerCylindrical( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createMillerCylindrical( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_miller_cylindrical( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createMillerCylindrical( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2839,20 +3905,26 @@ PJ_OBJ *proj_obj_create_projected_crs_MillerCylindrical( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_MercatorVariantA( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double scale, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createMercatorVariantA( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Scale(scale), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_mercator_variant_a( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createMercatorVariantA( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Scale(scale), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2864,20 +3936,25 @@ PJ_OBJ *proj_obj_create_projected_crs_MercatorVariantA( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_MercatorVariantB( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeFirstParallel, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createMercatorVariantB( - PropertyMap(), Angle(latitudeFirstParallel, angUnit), - Angle(centerLong, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_mercator_variant_b( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double centerLong, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createMercatorVariantB( + PropertyMap(), Angle(latitudeFirstParallel, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2890,19 +3967,24 @@ PJ_OBJ *proj_obj_create_projected_crs_MercatorVariantB( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_PopularVisualisationPseudoMercator( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_popular_visualisation_pseudo_mercator( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createPopularVisualisationPseudoMercator( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createPopularVisualisationPseudoMercator( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2914,19 +3996,24 @@ PJ_OBJ *proj_obj_create_projected_crs_PopularVisualisationPseudoMercator( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_Mollweide( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createMollweide( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_mollweide( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createMollweide( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2938,19 +4025,24 @@ PJ_OBJ *proj_obj_create_projected_crs_Mollweide( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_NewZealandMappingGrid( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_new_zealand_mapping_grid( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createNewZealandMappingGrid( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createNewZealandMappingGrid( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2962,20 +4054,26 @@ PJ_OBJ *proj_obj_create_projected_crs_NewZealandMappingGrid( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_ObliqueStereographic( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double scale, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createObliqueStereographic( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Scale(scale), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_oblique_stereographic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createObliqueStereographic( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Scale(scale), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -2987,19 +4085,24 @@ PJ_OBJ *proj_obj_create_projected_crs_ObliqueStereographic( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_Orthographic( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_orthographic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createOrthographic( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createOrthographic( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3011,19 +4114,24 @@ PJ_OBJ *proj_obj_create_projected_crs_Orthographic( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_AmericanPolyconic( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_american_polyconic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createAmericanPolyconic( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createAmericanPolyconic( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3035,20 +4143,26 @@ PJ_OBJ *proj_obj_create_projected_crs_AmericanPolyconic( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_PolarStereographicVariantA( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double scale, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createPolarStereographicVariantA( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Scale(scale), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_polar_stereographic_variant_a( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createPolarStereographicVariantA( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Scale(scale), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3060,20 +4174,25 @@ PJ_OBJ *proj_obj_create_projected_crs_PolarStereographicVariantA( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_PolarStereographicVariantB( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeStandardParallel, - double longitudeOfOrigin, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createPolarStereographicVariantB( - PropertyMap(), Angle(latitudeStandardParallel, angUnit), - Angle(longitudeOfOrigin, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_polar_stereographic_variant_b( + PJ_CONTEXT *ctx, double latitudeStandardParallel, double longitudeOfOrigin, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createPolarStereographicVariantB( + PropertyMap(), Angle(latitudeStandardParallel, angUnit), + Angle(longitudeOfOrigin, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3085,19 +4204,24 @@ PJ_OBJ *proj_obj_create_projected_crs_PolarStereographicVariantB( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_Robinson( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createRobinson( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_robinson( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createRobinson( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3109,19 +4233,24 @@ PJ_OBJ *proj_obj_create_projected_crs_Robinson( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_Sinusoidal( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createSinusoidal( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_sinusoidal( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createSinusoidal( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3133,20 +4262,26 @@ PJ_OBJ *proj_obj_create_projected_crs_Sinusoidal( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_Stereographic( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double scale, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createStereographic( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Scale(scale), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_stereographic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createStereographic( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Scale(scale), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3158,19 +4293,24 @@ PJ_OBJ *proj_obj_create_projected_crs_Stereographic( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_VanDerGrinten( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createVanDerGrinten( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_van_der_grinten( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createVanDerGrinten( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3182,19 +4322,24 @@ PJ_OBJ *proj_obj_create_projected_crs_VanDerGrinten( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_WagnerI( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createWagnerI( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_wagner_i( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = + Conversion::createWagnerI(PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3206,19 +4351,24 @@ PJ_OBJ *proj_obj_create_projected_crs_WagnerI( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_WagnerII( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createWagnerII( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_wagner_ii( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createWagnerII( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3230,20 +4380,25 @@ PJ_OBJ *proj_obj_create_projected_crs_WagnerII( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_WagnerIII( - PJ_OBJ *geodetic_crs, const char *crs_name, double latitudeTrueScale, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createWagnerIII( - PropertyMap(), Angle(latitudeTrueScale, angUnit), - Angle(centerLong, angUnit), Length(falseEasting, linearUnit), - Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_wagner_iii( + PJ_CONTEXT *ctx, double latitudeTrueScale, double centerLong, + double falseEasting, double falseNorthing, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createWagnerIII( + PropertyMap(), Angle(latitudeTrueScale, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3255,19 +4410,24 @@ PJ_OBJ *proj_obj_create_projected_crs_WagnerIII( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_WagnerIV( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createWagnerIV( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_wagner_iv( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createWagnerIV( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3279,19 +4439,24 @@ PJ_OBJ *proj_obj_create_projected_crs_WagnerIV( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_WagnerV( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createWagnerV( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_wagner_v( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = + Conversion::createWagnerV(PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3303,19 +4468,24 @@ PJ_OBJ *proj_obj_create_projected_crs_WagnerV( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_WagnerVI( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createWagnerVI( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_wagner_vi( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createWagnerVI( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3327,19 +4497,24 @@ PJ_OBJ *proj_obj_create_projected_crs_WagnerVI( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_WagnerVII( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createWagnerVII( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_wagner_vii( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createWagnerVII( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3352,19 +4527,24 @@ PJ_OBJ *proj_obj_create_projected_crs_WagnerVII( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_QuadrilateralizedSphericalCube( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLat, - double centerLong, double falseEasting, double falseNorthing, - const char *angUnitName, double angUnitConvFactor, +PJ_OBJ *proj_obj_create_conversion_quadrilateralized_spherical_cube( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createQuadrilateralizedSphericalCube( - PropertyMap(), Angle(centerLat, angUnit), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createQuadrilateralizedSphericalCube( + PropertyMap(), Angle(centerLat, angUnit), + Angle(centerLong, angUnit), Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3376,20 +4556,25 @@ PJ_OBJ *proj_obj_create_projected_crs_QuadrilateralizedSphericalCube( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_SphericalCrossTrackHeight( - PJ_OBJ *geodetic_crs, const char *crs_name, double pegPointLat, - double pegPointLong, double pegPointHeading, double pegPointHeight, - const char *angUnitName, double angUnitConvFactor, - const char *linearUnitName, double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createSphericalCrossTrackHeight( - PropertyMap(), Angle(pegPointLat, angUnit), - Angle(pegPointLong, angUnit), Angle(pegPointHeading, angUnit), - Length(pegPointHeight, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_spherical_cross_track_height( + PJ_CONTEXT *ctx, double pegPointLat, double pegPointLong, + double pegPointHeading, double pegPointHeight, const char *angUnitName, + double angUnitConvFactor, const char *linearUnitName, + double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createSphericalCrossTrackHeight( + PropertyMap(), Angle(pegPointLat, angUnit), + Angle(pegPointLong, angUnit), Angle(pegPointHeading, angUnit), + Length(pegPointHeight, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } // --------------------------------------------------------------------------- @@ -3401,19 +4586,24 @@ PJ_OBJ *proj_obj_create_projected_crs_SphericalCrossTrackHeight( * Linear parameters are expressed in (linearUnitName, linearUnitConvFactor). * Angular parameters are expressed in (angUnitName, angUnitConvFactor). */ -PJ_OBJ *proj_obj_create_projected_crs_EqualEarth( - PJ_OBJ *geodetic_crs, const char *crs_name, double centerLong, - double falseEasting, double falseNorthing, const char *angUnitName, - double angUnitConvFactor, const char *linearUnitName, - double linearUnitConvFactor) { - UnitOfMeasure linearUnit( - createLinearUnit(linearUnitName, linearUnitConvFactor)); - UnitOfMeasure angUnit(createAngularUnit(angUnitName, angUnitConvFactor)); - auto conv = Conversion::createEqualEarth( - PropertyMap(), Angle(centerLong, angUnit), - Length(falseEasting, linearUnit), Length(falseNorthing, linearUnit)); - return proj_obj_create_projected_crs(geodetic_crs, crs_name, conv, - linearUnit); +PJ_OBJ *proj_obj_create_conversion_equal_earth( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, + double falseNorthing, const char *angUnitName, double angUnitConvFactor, + const char *linearUnitName, double linearUnitConvFactor) { + try { + UnitOfMeasure linearUnit( + createLinearUnit(linearUnitName, linearUnitConvFactor)); + UnitOfMeasure angUnit( + createAngularUnit(angUnitName, angUnitConvFactor)); + auto conv = Conversion::createEqualEarth( + PropertyMap(), Angle(centerLong, angUnit), + Length(falseEasting, linearUnit), + Length(falseNorthing, linearUnit)); + return proj_obj_create_conversion(ctx, conv); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + return nullptr; } /* END: Generated by scripts/create_c_api_projections.py*/ @@ -3428,7 +4618,7 @@ PJ_OBJ *proj_obj_create_projected_crs_EqualEarth( * @return TRUE or FALSE. */ -int proj_coordoperation_is_instanciable(PJ_OBJ *coordoperation) { +int proj_coordoperation_is_instanciable(const PJ_OBJ *coordoperation) { assert(coordoperation); auto op = dynamic_cast<const CoordinateOperation *>(coordoperation->obj.get()); @@ -3453,7 +4643,7 @@ int proj_coordoperation_is_instanciable(PJ_OBJ *coordoperation) { * (must not be NULL) */ -int proj_coordoperation_get_param_count(PJ_OBJ *coordoperation) { +int proj_coordoperation_get_param_count(const PJ_OBJ *coordoperation) { assert(coordoperation); auto op = dynamic_cast<const SingleOperation *>(coordoperation->obj.get()); if (!op) { @@ -3474,7 +4664,7 @@ int proj_coordoperation_get_param_count(PJ_OBJ *coordoperation) { * @return index (>=0), or -1 in case of error. */ -int proj_coordoperation_get_param_index(PJ_OBJ *coordoperation, +int proj_coordoperation_get_param_index(const PJ_OBJ *coordoperation, const char *name) { assert(coordoperation); assert(name); @@ -3517,7 +4707,7 @@ int proj_coordoperation_get_param_index(PJ_OBJ *coordoperation, * @return TRUE in case of success. */ -int proj_coordoperation_get_param(PJ_OBJ *coordoperation, int index, +int proj_coordoperation_get_param(const PJ_OBJ *coordoperation, int index, const char **pName, const char **pNameAuthorityName, const char **pNameCode, double *pValue, @@ -3613,7 +4803,7 @@ int proj_coordoperation_get_param(PJ_OBJ *coordoperation, int index, * (must not be NULL) */ -int proj_coordoperation_get_grid_used_count(PJ_OBJ *coordoperation) { +int proj_coordoperation_get_grid_used_count(const PJ_OBJ *coordoperation) { assert(coordoperation); auto co = dynamic_cast<const CoordinateOperation *>(coordoperation->obj.get()); @@ -3662,7 +4852,7 @@ int proj_coordoperation_get_grid_used_count(PJ_OBJ *coordoperation) { * @return TRUE in case of success. */ -int proj_coordoperation_get_grid_used(PJ_OBJ *coordoperation, int index, +int proj_coordoperation_get_grid_used(const PJ_OBJ *coordoperation, int index, const char **pShortName, const char **pFullName, const char **pPackageName, @@ -3993,9 +5183,9 @@ void proj_operation_factory_context_set_allowed_intermediate_crs( * @return a result set that must be unreferenced with * proj_obj_list_unref(), or NULL in case of error. */ -PJ_OBJ_LIST * -proj_obj_create_operations(PJ_OBJ *source_crs, PJ_OBJ *target_crs, - PJ_OPERATION_FACTORY_CONTEXT *operationContext) { +PJ_OBJ_LIST *proj_obj_create_operations( + const PJ_OBJ *source_crs, const PJ_OBJ *target_crs, + const PJ_OPERATION_FACTORY_CONTEXT *operationContext) { assert(source_crs); assert(target_crs); assert(operationContext); @@ -4035,7 +5225,7 @@ proj_obj_create_operations(PJ_OBJ *source_crs, PJ_OBJ *target_crs, * * @param result Objet of type PJ_OBJ_LIST (must not be NULL) */ -int proj_obj_list_get_count(PJ_OBJ_LIST *result) { +int proj_obj_list_get_count(const PJ_OBJ_LIST *result) { assert(result); return static_cast<int>(result->objects.size()); } @@ -4054,7 +5244,7 @@ int proj_obj_list_get_count(PJ_OBJ_LIST *result) { * or nullptr in case of error. */ -PJ_OBJ *proj_obj_list_get(PJ_OBJ_LIST *result, int index) { +PJ_OBJ *proj_obj_list_get(const PJ_OBJ_LIST *result, int index) { assert(result); if (index < 0 || index >= proj_obj_list_get_count(result)) { proj_log_error(result->ctx, __FUNCTION__, "Invalid index"); @@ -4080,7 +5270,7 @@ void proj_obj_list_unref(PJ_OBJ_LIST *result) { delete result; } * * @return the accuracy, or a negative value if unknown or in case of error. */ -double proj_coordoperation_get_accuracy(PJ_OBJ *coordoperation) { +double proj_coordoperation_get_accuracy(const PJ_OBJ *coordoperation) { assert(coordoperation); auto co = dynamic_cast<const CoordinateOperation *>(coordoperation->obj.get()); @@ -4102,6 +5292,32 @@ double proj_coordoperation_get_accuracy(PJ_OBJ *coordoperation) { // --------------------------------------------------------------------------- +/** \brief Returns the datum of a SingleCRS. + * + * The returned object must be unreferenced with proj_obj_unref() after + * use. + * It should be used by at most one thread at a time. + * + * @param crs Objet of type SingleCRS (must not be NULL) + * @return Object that must be unreferenced with proj_obj_unref(), or NULL + * in case of error (or if there is no datum) + */ +PJ_OBJ *proj_obj_crs_get_datum(const PJ_OBJ *crs) { + assert(crs); + auto l_crs = dynamic_cast<const SingleCRS *>(crs->obj.get()); + if (!l_crs) { + proj_log_error(crs->ctx, __FUNCTION__, "Object is not a SingleCRS"); + return nullptr; + } + const auto &datum = l_crs->datum(); + if (!datum) { + return nullptr; + } + return PJ_OBJ::create(crs->ctx, NN_NO_CHECK(datum)); +} + +// --------------------------------------------------------------------------- + /** \brief Returns the coordinate system of a SingleCRS. * * The returned object must be unreferenced with proj_obj_unref() after @@ -4112,7 +5328,7 @@ double proj_coordoperation_get_accuracy(PJ_OBJ *coordoperation) { * @return Object that must be unreferenced with proj_obj_unref(), or NULL * in case of error. */ -PJ_OBJ *proj_obj_crs_get_coordinate_system(PJ_OBJ *crs) { +PJ_OBJ *proj_obj_crs_get_coordinate_system(const PJ_OBJ *crs) { assert(crs); auto l_crs = dynamic_cast<const SingleCRS *>(crs->obj.get()); if (!l_crs) { @@ -4127,44 +5343,44 @@ PJ_OBJ *proj_obj_crs_get_coordinate_system(PJ_OBJ *crs) { /** \brief Returns the type of the coordinate system. * * @param cs Objet of type CoordinateSystem (must not be NULL) - * @return type, or NULL in case of error. + * @return type, or PJ_CS_TYPE_UNKNOWN in case of error. */ -const char *proj_obj_cs_get_type(PJ_OBJ *cs) { +PJ_COORDINATE_SYSTEM_TYPE proj_obj_cs_get_type(const PJ_OBJ *cs) { assert(cs); auto l_cs = dynamic_cast<const CoordinateSystem *>(cs->obj.get()); if (!l_cs) { proj_log_error(cs->ctx, __FUNCTION__, "Object is not a CoordinateSystem"); - return nullptr; + return PJ_CS_TYPE_UNKNOWN; } if (dynamic_cast<const CartesianCS *>(l_cs)) { - return "Cartesian"; + return PJ_CS_TYPE_CARTESIAN; } if (dynamic_cast<const EllipsoidalCS *>(l_cs)) { - return "Ellipsoidal"; + return PJ_CS_TYPE_ELLIPSOIDAL; } if (dynamic_cast<const VerticalCS *>(l_cs)) { - return "Vertical"; + return PJ_CS_TYPE_VERTICAL; } if (dynamic_cast<const SphericalCS *>(l_cs)) { - return "Spherical"; + return PJ_CS_TYPE_SPHERICAL; } if (dynamic_cast<const OrdinalCS *>(l_cs)) { - return "Ordinal"; + return PJ_CS_TYPE_ORDINAL; } if (dynamic_cast<const ParametricCS *>(l_cs)) { - return "Parametric"; + return PJ_CS_TYPE_PARAMETRIC; } if (dynamic_cast<const DateTimeTemporalCS *>(l_cs)) { - return "DateTimeTemporal"; + return PJ_CS_TYPE_DATETIMETEMPORAL; } if (dynamic_cast<const TemporalCountCS *>(l_cs)) { - return "TemporalCount"; + return PJ_CS_TYPE_TEMPORALCOUNT; } if (dynamic_cast<const TemporalMeasureCS *>(l_cs)) { - return "TemporalMeasure"; + return PJ_CS_TYPE_TEMPORALMEASURE; } - return "unknown"; + return PJ_CS_TYPE_UNKNOWN; } // --------------------------------------------------------------------------- @@ -4174,7 +5390,7 @@ const char *proj_obj_cs_get_type(PJ_OBJ *cs) { * @param cs Objet of type CoordinateSystem (must not be NULL) * @return number of axis, or -1 in case of error. */ -int proj_obj_cs_get_axis_count(PJ_OBJ *cs) { +int proj_obj_cs_get_axis_count(const PJ_OBJ *cs) { assert(cs); auto l_cs = dynamic_cast<const CoordinateSystem *>(cs->obj.get()); if (!l_cs) { @@ -4203,7 +5419,7 @@ int proj_obj_cs_get_axis_count(PJ_OBJ *cs) { * unit name. or NULL * @return TRUE in case of success */ -int proj_obj_cs_get_axis_info(PJ_OBJ *cs, int index, const char **pName, +int proj_obj_cs_get_axis_info(const PJ_OBJ *cs, int index, const char **pName, const char **pAbbrev, const char **pDirection, double *pUnitConvFactor, const char **pUnitName) { assert(cs); diff --git a/src/coordinateoperation.cpp b/src/coordinateoperation.cpp index 893b52d3..dce25653 100644 --- a/src/coordinateoperation.cpp +++ b/src/coordinateoperation.cpp @@ -1898,6 +1898,58 @@ ConversionNNPtr Conversion::shallowClone() const { // --------------------------------------------------------------------------- +//! @cond Doxygen_Suppress +ConversionNNPtr +Conversion::alterParametersLinearUnit(const common::UnitOfMeasure &unit, + bool convertToNewUnit) const { + + std::vector<GeneralParameterValueNNPtr> newValues; + bool changesDone = false; + for (const auto &genOpParamvalue : parameterValues()) { + bool updated = false; + auto opParamvalue = dynamic_cast<const OperationParameterValue *>( + genOpParamvalue.get()); + if (opParamvalue) { + const auto ¶mValue = opParamvalue->parameterValue(); + if (paramValue->type() == ParameterValue::Type::MEASURE) { + const auto &measure = paramValue->value(); + if (measure.unit().type() == + common::UnitOfMeasure::Type::LINEAR) { + if (!measure.unit()._isEquivalentTo( + unit, util::IComparable::Criterion::EQUIVALENT)) { + const double newValue = + convertToNewUnit ? measure.convertToUnit(unit) + : measure.value(); + newValues.emplace_back(OperationParameterValue::create( + opParamvalue->parameter(), + ParameterValue::create( + common::Measure(newValue, unit)))); + updated = true; + } + } + } + } + if (updated) { + changesDone = true; + } else { + newValues.emplace_back(genOpParamvalue); + } + } + if (changesDone) { + auto conv = create(util::PropertyMap().set( + common::IdentifiedObject::NAME_KEY, "unknown"), + method(), newValues); + conv->setCRSs(this, false); + return conv; + } else { + return NN_NO_CHECK( + util::nn_dynamic_pointer_cast<Conversion>(shared_from_this())); + } +} +//! @endcond + +// --------------------------------------------------------------------------- + /** \brief Instanciate a Conversion from a vector of GeneralParameterValue. * * @param properties See \ref general_properties. At minimum the name should be diff --git a/src/coordinatesystem.cpp b/src/coordinatesystem.cpp index f8d2d2b3..f1220878 100644 --- a/src/coordinatesystem.cpp +++ b/src/coordinatesystem.cpp @@ -416,6 +416,16 @@ bool CoordinateSystemAxis::_isEquivalentTo( // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress +CoordinateSystemAxisNNPtr +CoordinateSystemAxis::alterUnit(const common::UnitOfMeasure &newUnit) const { + return create(util::PropertyMap().set(IdentifiedObject::NAME_KEY, name()), + abbreviation(), direction(), newUnit, meridian()); +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress struct CoordinateSystem::Private { std::vector<CoordinateSystemAxisNNPtr> axisList{}; @@ -738,6 +748,43 @@ EllipsoidalCS::AxisOrder EllipsoidalCS::axisOrder() const { // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress +EllipsoidalCSNNPtr EllipsoidalCS::alterAngularUnit( + const common::UnitOfMeasure &angularUnit) const { + const auto &l_axisList = CoordinateSystem::getPrivate()->axisList; + if (l_axisList.size() == 2) { + return EllipsoidalCS::create(util::PropertyMap(), + l_axisList[0]->alterUnit(angularUnit), + l_axisList[1]->alterUnit(angularUnit)); + } else { + assert(l_axisList.size() == 3); + return EllipsoidalCS::create( + util::PropertyMap(), l_axisList[0]->alterUnit(angularUnit), + l_axisList[1]->alterUnit(angularUnit), l_axisList[2]); + } +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress +EllipsoidalCSNNPtr +EllipsoidalCS::alterLinearUnit(const common::UnitOfMeasure &linearUnit) const { + const auto &l_axisList = CoordinateSystem::getPrivate()->axisList; + if (l_axisList.size() == 2) { + return EllipsoidalCS::create(util::PropertyMap(), l_axisList[0], + l_axisList[1]); + } else { + assert(l_axisList.size() == 3); + return EllipsoidalCS::create(util::PropertyMap(), l_axisList[0], + l_axisList[1], + l_axisList[2]->alterUnit(linearUnit)); + } +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress VerticalCS::~VerticalCS() = default; //! @endcond @@ -788,6 +835,16 @@ VerticalCS::createGravityRelatedHeight(const common::UnitOfMeasure &unit) { // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress +VerticalCSNNPtr VerticalCS::alterUnit(const common::UnitOfMeasure &unit) const { + const auto &l_axisList = CoordinateSystem::getPrivate()->axisList; + return VerticalCS::nn_make_shared<VerticalCS>( + l_axisList[0]->alterUnit(unit)); +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress CartesianCS::~CartesianCS() = default; //! @endcond @@ -863,6 +920,27 @@ CartesianCS::createEastingNorthing(const common::UnitOfMeasure &unit) { // --------------------------------------------------------------------------- +/** \brief Instanciate a CartesianCS with a Northing (first) and Easting + * (second) axis. + * + * @param unit Linear unit of the axes. + * @return a new CartesianCS. + */ +CartesianCSNNPtr +CartesianCS::createNorthingEasting(const common::UnitOfMeasure &unit) { + return create(util::PropertyMap(), + CoordinateSystemAxis::create( + util::PropertyMap().set(IdentifiedObject::NAME_KEY, + AxisName::Northing), + AxisAbbreviation::N, AxisDirection::NORTH, unit), + CoordinateSystemAxis::create( + util::PropertyMap().set(IdentifiedObject::NAME_KEY, + AxisName::Easting), + AxisAbbreviation::E, AxisDirection::EAST, unit)); +} + +// --------------------------------------------------------------------------- + /** \brief Instanciate a CartesianCS with the three geocentric axes. * * @param unit Liinear unit of the axes. @@ -888,6 +966,25 @@ CartesianCS::createGeocentric(const common::UnitOfMeasure &unit) { // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress +CartesianCSNNPtr +CartesianCS::alterUnit(const common::UnitOfMeasure &unit) const { + const auto &l_axisList = CoordinateSystem::getPrivate()->axisList; + if (l_axisList.size() == 2) { + return CartesianCS::create(util::PropertyMap(), + l_axisList[0]->alterUnit(unit), + l_axisList[1]->alterUnit(unit)); + } else { + assert(l_axisList.size() == 3); + return CartesianCS::create( + util::PropertyMap(), l_axisList[0]->alterUnit(unit), + l_axisList[1]->alterUnit(unit), l_axisList[2]->alterUnit(unit)); + } +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress OrdinalCS::~OrdinalCS() = default; //! @endcond diff --git a/src/crs.cpp b/src/crs.cpp index aa9209cd..1cc5d31a 100644 --- a/src/crs.cpp +++ b/src/crs.cpp @@ -197,6 +197,97 @@ GeographicCRSPtr CRS::extractGeographicCRS() const { // --------------------------------------------------------------------------- +//! @cond Doxygen_Suppress +static util::PropertyMap createPropertyMapName(const std::string &name) { + return util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, name); +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress +CRSNNPtr CRS::alterGeodeticCRS(const GeodeticCRSNNPtr &newGeodCRS) const { + auto geodCRS = dynamic_cast<const GeodeticCRS *>(this); + if (geodCRS) { + return newGeodCRS; + } + + auto projCRS = dynamic_cast<const ProjectedCRS *>(this); + if (projCRS) { + return ProjectedCRS::create( + createPropertyMapName(nameStr()), newGeodCRS, + projCRS->derivingConversionRef(), projCRS->coordinateSystem()); + } + + auto compoundCRS = dynamic_cast<const CompoundCRS *>(this); + if (compoundCRS) { + std::vector<CRSNNPtr> components; + for (const auto &subCrs : compoundCRS->componentReferenceSystems()) { + components.emplace_back(subCrs->alterGeodeticCRS(newGeodCRS)); + } + return CompoundCRS::create(createPropertyMapName(nameStr()), + components); + } + + return NN_NO_CHECK( + std::dynamic_pointer_cast<CRS>(shared_from_this().as_nullable())); +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress +CRSNNPtr CRS::alterCSLinearUnit(const common::UnitOfMeasure &unit) const { + { + auto projCRS = dynamic_cast<const ProjectedCRS *>(this); + if (projCRS) { + return ProjectedCRS::create( + createPropertyMapName(projCRS->nameStr().c_str()), + projCRS->baseCRS(), projCRS->derivingConversionRef(), + projCRS->coordinateSystem()->alterUnit(unit)); + } + } + + { + auto geodCRS = dynamic_cast<const GeodeticCRS *>(this); + if (geodCRS && geodCRS->isGeocentric()) { + auto cs = dynamic_cast<const cs::CartesianCS *>( + geodCRS->coordinateSystem().get()); + assert(cs); + return GeodeticCRS::create( + createPropertyMapName(geodCRS->nameStr().c_str()), + geodCRS->datum(), geodCRS->datumEnsemble(), + cs->alterUnit(unit)); + } + } + + { + auto geogCRS = dynamic_cast<const GeographicCRS *>(this); + if (geogCRS && geogCRS->coordinateSystem()->axisList().size() == 3) { + return GeographicCRS::create( + createPropertyMapName(geogCRS->nameStr().c_str()), + geogCRS->datum(), geogCRS->datumEnsemble(), + geogCRS->coordinateSystem()->alterLinearUnit(unit)); + } + } + + { + auto vertCRS = dynamic_cast<const VerticalCRS *>(this); + if (vertCRS) { + return VerticalCRS::create( + createPropertyMapName(vertCRS->nameStr().c_str()), + vertCRS->datum(), vertCRS->datumEnsemble(), + vertCRS->coordinateSystem()->alterUnit(unit)); + } + } + + return NN_NO_CHECK( + std::dynamic_pointer_cast<CRS>(shared_from_this().as_nullable())); +} +//! @endcond + +// --------------------------------------------------------------------------- + /** \brief Return the VerticalCRS of the CRS. * * Returns the VerticalCRS contained in a CRS. This works currently with @@ -391,6 +482,19 @@ CRSNNPtr CRS::shallowClone() const { return _shallowClone(); } // --------------------------------------------------------------------------- +//! @cond Doxygen_Suppress + +CRSNNPtr CRS::alterName(const std::string &newName) const { + auto crs = shallowClone(); + crs->setProperties( + util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, newName)); + return crs; +} + +//! @endcond + +// --------------------------------------------------------------------------- + /** \brief Identify the CRS with reference CRSs. * * The candidate CRSs are either hard-coded, or looked in the database when @@ -2494,6 +2598,19 @@ bool ProjectedCRS::_isEquivalentTo( // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress +ProjectedCRSNNPtr +ProjectedCRS::alterParametersLinearUnit(const common::UnitOfMeasure &unit, + bool convertToNewUnit) const { + return create(createPropertyMapName(nameStr()), baseCRS(), + derivingConversionRef()->alterParametersLinearUnit( + unit, convertToNewUnit), + coordinateSystem()); +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress void ProjectedCRS::addUnitConvertAndAxisSwap(io::PROJStringFormatter *formatter, bool axisSpecFound) const { const auto &axisList = d->coordinateSystem()->axisList(); @@ -443,6 +443,11 @@ char PROJ_DLL * proj_rtodms(char *s, double r, int pos, int neg); /* Binding in C of C++ API */ /* ------------------------------------------------------------------------- */ +/** + * \defgroup basic_cpp_binding Binding in C of basic methods from the C++ API + * @{ + */ + /*! @cond Doxygen_Suppress */ typedef struct PJ_OBJ PJ_OBJ; /*! @endcond */ @@ -461,6 +466,7 @@ const char PROJ_DLL *proj_context_get_database_path(PJ_CONTEXT *ctx); const char PROJ_DLL *proj_context_get_database_metadata(PJ_CONTEXT* ctx, const char* key); + /** \brief Guessed WKT "dialect". */ typedef enum { @@ -512,9 +518,13 @@ PJ_OBJ PROJ_DLL *proj_obj_create_from_database(PJ_CONTEXT *ctx, void PROJ_DLL proj_obj_unref(PJ_OBJ *obj); +PJ_OBJ PROJ_DLL *proj_obj_clone(const PJ_OBJ *obj); + /** \brief Object type. */ typedef enum { + PJ_OBJ_TYPE_UNKNOWN, + PJ_OBJ_TYPE_ELLIPSOID, PJ_OBJ_TYPE_GEODETIC_REFERENCE_FRAME, @@ -539,6 +549,7 @@ typedef enum PJ_OBJ_TYPE_PROJECTED_CRS, PJ_OBJ_TYPE_COMPOUND_CRS, PJ_OBJ_TYPE_TEMPORAL_CRS, + PJ_OBJ_TYPE_ENGINEERING_CRS, PJ_OBJ_TYPE_BOUND_CRS, PJ_OBJ_TYPE_OTHER_CRS, @@ -546,8 +557,6 @@ typedef enum PJ_OBJ_TYPE_TRANSFORMATION, PJ_OBJ_TYPE_CONCATENATED_OPERATION, PJ_OBJ_TYPE_OTHER_COORDINATE_OPERATION, - - PJ_OBJ_TYPE_UNKNOWN } PJ_OBJ_TYPE; PJ_OBJ_LIST PROJ_DLL *proj_obj_create_from_name(PJ_CONTEXT *ctx, @@ -559,9 +568,405 @@ PJ_OBJ_LIST PROJ_DLL *proj_obj_create_from_name(PJ_CONTEXT *ctx, size_t limitResultCount, const char* const *options); +PJ_OBJ_TYPE PROJ_DLL proj_obj_get_type(const PJ_OBJ *obj); + +int PROJ_DLL proj_obj_is_deprecated(const PJ_OBJ *obj); + +/** Comparison criterion. */ +typedef enum +{ + /** All properties are identical. */ + PJ_COMP_STRICT, + + /** The objects are equivalent for the purpose of coordinate + * operations. They can differ by the name of their objects, + * identifiers, other metadata. + * Parameters may be expressed in different units, provided that the + * value is (with some tolerance) the same once expressed in a + * common unit. + */ + PJ_COMP_EQUIVALENT, + + /** Same as EQUIVALENT, relaxed with an exception that the axis order + * of the base CRS of a DerivedCRS/ProjectedCRS or the axis order of + * a GeographicCRS is ignored. Only to be used + * with DerivedCRS/ProjectedCRS/GeographicCRS */ + PJ_COMP_EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS, +} PJ_COMPARISON_CRITERION; + +int PROJ_DLL proj_obj_is_equivalent_to(const PJ_OBJ *obj, const PJ_OBJ* other, + PJ_COMPARISON_CRITERION criterion); + +int PROJ_DLL proj_obj_is_crs(const PJ_OBJ *obj); + +const char PROJ_DLL* proj_obj_get_name(const PJ_OBJ *obj); + +const char PROJ_DLL* proj_obj_get_id_auth_name(const PJ_OBJ *obj, int index); + +const char PROJ_DLL* proj_obj_get_id_code(const PJ_OBJ *obj, int index); + +int PROJ_DLL proj_obj_get_area_of_use(const PJ_OBJ *obj, + double* p_west_lon_degree, + double* p_south_lat_degree, + double* p_east_lon_degree, + double* p_north_lat_degree, + const char **p_area_name); + +/** \brief WKT version. */ +typedef enum +{ + /** cf osgeo::proj::io::WKTFormatter::Convention::WKT2 */ + PJ_WKT2_2015, + /** cf osgeo::proj::io::WKTFormatter::Convention::WKT2_SIMPLIFIED */ + PJ_WKT2_2015_SIMPLIFIED, + /** cf osgeo::proj::io::WKTFormatter::Convention::WKT2_2018 */ + PJ_WKT2_2018, + /** cf osgeo::proj::io::WKTFormatter::Convention::WKT2_2018_SIMPLIFIED */ + PJ_WKT2_2018_SIMPLIFIED, + /** cf osgeo::proj::io::WKTFormatter::Convention::WKT1_GDAL */ + PJ_WKT1_GDAL, + /** cf osgeo::proj::io::WKTFormatter::Convention::WKT1_ESRI */ + PJ_WKT1_ESRI +} PJ_WKT_TYPE; + +const char PROJ_DLL* proj_obj_as_wkt(const PJ_OBJ *obj, PJ_WKT_TYPE type, + const char* const *options); + +/** \brief PROJ string version. */ +typedef enum +{ + /** cf osgeo::proj::io::PROJStringFormatter::Convention::PROJ_5 */ + PJ_PROJ_5, + /** cf osgeo::proj::io::PROJStringFormatter::Convention::PROJ_4 */ + PJ_PROJ_4 +} PJ_PROJ_STRING_TYPE; + +const char PROJ_DLL* proj_obj_as_proj_string(const PJ_OBJ *obj, + PJ_PROJ_STRING_TYPE type, + const char* const *options); + +PJ_OBJ PROJ_DLL *proj_obj_get_source_crs(const PJ_OBJ *obj); + +PJ_OBJ PROJ_DLL *proj_obj_get_target_crs(const PJ_OBJ *obj); + +PJ_OBJ_LIST PROJ_DLL *proj_obj_identify(const PJ_OBJ* obj, + const char *auth_name, + const char* const *options, + int **confidence); + +void PROJ_DLL proj_free_int_list(int* list); + +/* ------------------------------------------------------------------------- */ + +/** \brief Type representing a NULL terminated list of NUL-terminate strings. */ +typedef char **PROJ_STRING_LIST; + +PROJ_STRING_LIST PROJ_DLL proj_get_authorities_from_database(PJ_CONTEXT *ctx); + +PROJ_STRING_LIST PROJ_DLL proj_get_codes_from_database(PJ_CONTEXT *ctx, + const char *auth_name, + PJ_OBJ_TYPE type, + int allow_deprecated); + +void PROJ_DLL proj_free_string_list(PROJ_STRING_LIST list); + +/* ------------------------------------------------------------------------- */ + + +/*! @cond Doxygen_Suppress */ +typedef struct PJ_OPERATION_FACTORY_CONTEXT PJ_OPERATION_FACTORY_CONTEXT; +/*! @endcond */ + +PJ_OPERATION_FACTORY_CONTEXT PROJ_DLL *proj_create_operation_factory_context( + PJ_CONTEXT *ctx, + const char *authority); + +void PROJ_DLL proj_operation_factory_context_unref( + PJ_OPERATION_FACTORY_CONTEXT *ctxt); + +void PROJ_DLL proj_operation_factory_context_set_desired_accuracy( + PJ_OPERATION_FACTORY_CONTEXT *ctxt, + double accuracy); + +void PROJ_DLL proj_operation_factory_context_set_area_of_interest( + PJ_OPERATION_FACTORY_CONTEXT *ctxt, + double west_lon_degree, + double south_lat_degree, + double east_lon_degree, + double north_lat_degree); + +/** Specify how source and target CRS extent should be used to restrict + * candidate operations (only taken into account if no explicit area of + * interest is specified. */ +typedef enum +{ + /** Ignore CRS extent */ + PJ_CRS_EXTENT_NONE, + + /** Test coordinate operation extent against both CRS extent. */ + PJ_CRS_EXTENT_BOTH, + + /** Test coordinate operation extent against the intersection of both + CRS extent. */ + PJ_CRS_EXTENT_INTERSECTION, + + /** Test coordinate operation against the smallest of both CRS extent. */ + PJ_CRS_EXTENT_SMALLEST +} PROJ_CRS_EXTENT_USE; + +void PROJ_DLL proj_operation_factory_context_set_crs_extent_use( + PJ_OPERATION_FACTORY_CONTEXT *ctxt, + PROJ_CRS_EXTENT_USE use); + +/** Spatial criterion to restrict candiate operations. */ +typedef enum { + /** The area of validity of transforms should strictly contain the + * are of interest. */ + PROJ_SPATIAL_CRITERION_STRICT_CONTAINMENT, + + /** The area of validity of transforms should at least intersect the + * area of interest. */ + PROJ_SPATIAL_CRITERION_PARTIAL_INTERSECTION +} PROJ_SPATIAL_CRITERION; + +void PROJ_DLL proj_operation_factory_context_set_spatial_criterion( + PJ_OPERATION_FACTORY_CONTEXT *ctxt, + PROJ_SPATIAL_CRITERION criterion); + + +/** Describe how grid availability is used. */ +typedef enum { + /** Grid availability is only used for sorting results. Operations + * where some grids are missing will be sorted last. */ + PROJ_GRID_AVAILABILITY_USED_FOR_SORTING, + + /** Completely discard an operation if a required grid is missing. */ + PROJ_GRID_AVAILABILITY_DISCARD_OPERATION_IF_MISSING_GRID, + + /** Ignore grid availability at all. Results will be presented as if + * all grids were available. */ + PROJ_GRID_AVAILABILITY_IGNORED, +} PROJ_GRID_AVAILABILITY_USE; + +void PROJ_DLL proj_operation_factory_context_set_grid_availability_use( + PJ_OPERATION_FACTORY_CONTEXT *ctxt, + PROJ_GRID_AVAILABILITY_USE use); + +void PROJ_DLL proj_operation_factory_context_set_use_proj_alternative_grid_names( + PJ_OPERATION_FACTORY_CONTEXT *ctxt, + int usePROJNames); + +void PROJ_DLL proj_operation_factory_context_set_allow_use_intermediate_crs( + PJ_OPERATION_FACTORY_CONTEXT *ctxt, int allow); + +void PROJ_DLL proj_operation_factory_context_set_allowed_intermediate_crs( + PJ_OPERATION_FACTORY_CONTEXT *ctxt, + const char* const *list_of_auth_name_codes); + +/* ------------------------------------------------------------------------- */ + + +PJ_OBJ_LIST PROJ_DLL *proj_obj_create_operations( + const PJ_OBJ *source_crs, + const PJ_OBJ *target_crs, + const PJ_OPERATION_FACTORY_CONTEXT *operationContext); + +int PROJ_DLL proj_obj_list_get_count(const PJ_OBJ_LIST *result); + +PJ_OBJ PROJ_DLL *proj_obj_list_get(const PJ_OBJ_LIST *result, + int index); + +void PROJ_DLL proj_obj_list_unref(PJ_OBJ_LIST *result); + +/* ------------------------------------------------------------------------- */ + +PJ_OBJ PROJ_DLL *proj_obj_crs_get_geodetic_crs(const PJ_OBJ *crs); + +PJ_OBJ PROJ_DLL *proj_obj_crs_get_horizontal_datum(const PJ_OBJ *crs); + +PJ_OBJ PROJ_DLL *proj_obj_crs_get_sub_crs(const PJ_OBJ *crs, int index); + +PJ_OBJ PROJ_DLL *proj_obj_crs_get_datum(const PJ_OBJ *crs); + +PJ_OBJ PROJ_DLL *proj_obj_crs_get_coordinate_system(const PJ_OBJ *crs); + +/** Type of coordinate system. */ +typedef enum +{ + PJ_CS_TYPE_UNKNOWN, + + PJ_CS_TYPE_CARTESIAN, + PJ_CS_TYPE_ELLIPSOIDAL, + PJ_CS_TYPE_VERTICAL, + PJ_CS_TYPE_SPHERICAL, + PJ_CS_TYPE_ORDINAL, + PJ_CS_TYPE_PARAMETRIC, + PJ_CS_TYPE_DATETIMETEMPORAL, + PJ_CS_TYPE_TEMPORALCOUNT, + PJ_CS_TYPE_TEMPORALMEASURE +} PJ_COORDINATE_SYSTEM_TYPE; + +PJ_COORDINATE_SYSTEM_TYPE PROJ_DLL proj_obj_cs_get_type(const PJ_OBJ* cs); + +int PROJ_DLL proj_obj_cs_get_axis_count(const PJ_OBJ *cs); + +int PROJ_DLL proj_obj_cs_get_axis_info(const PJ_OBJ *cs, int index, + const char **pName, + const char **pAbbrev, + const char **pDirection, + double *pUnitConvFactor, + const char **pUnitName); + +PJ_OBJ PROJ_DLL *proj_obj_get_ellipsoid(const PJ_OBJ *obj); + +int PROJ_DLL proj_obj_ellipsoid_get_parameters(const PJ_OBJ *ellipsoid, + double *pSemiMajorMetre, + double *pSemiMinorMetre, + int *pIsSemiMinorComputed, + double *pInverseFlattening); + +PJ_OBJ PROJ_DLL *proj_obj_get_prime_meridian(const PJ_OBJ *obj); + +int PROJ_DLL proj_obj_prime_meridian_get_parameters(const PJ_OBJ *prime_meridian, + double *pLongitude, + double *pLongitudeUnitConvFactor, + const char **pLongitudeUnitName); + +PJ_OBJ PROJ_DLL *proj_obj_crs_get_coordoperation(const PJ_OBJ *crs, + const char **pMethodName, + const char **pMethodAuthorityName, + const char **pMethodCode); + +int PROJ_DLL proj_coordoperation_is_instanciable(const PJ_OBJ *coordoperation); + +int PROJ_DLL proj_coordoperation_get_param_count(const PJ_OBJ *coordoperation); + +int PROJ_DLL proj_coordoperation_get_param_index(const PJ_OBJ *coordoperation, + const char *name); + +int PROJ_DLL proj_coordoperation_get_param(const PJ_OBJ *coordoperation, + int index, + const char **pName, + const char **pNameAuthorityName, + const char **pNameCode, + double *pValue, + const char **pValueString, + double *pValueUnitConvFactor, + const char **pValueUnitName); + +int PROJ_DLL proj_coordoperation_get_grid_used_count(const PJ_OBJ *coordoperation); + +int PROJ_DLL proj_coordoperation_get_grid_used(const PJ_OBJ *coordoperation, + int index, + const char **pShortName, + const char **pFullName, + const char **pPackageName, + const char **pURL, + int *pDirectDownload, + int *pOpenLicense, + int *pAvailable); + +double PROJ_DLL proj_coordoperation_get_accuracy(const PJ_OBJ* obj); + +/**@}*/ + +/* ------------------------------------------------------------------------- */ +/* Binding in C of advanced methods from the C++ API */ +/* */ +/* Manual construction of CRS objects. */ +/* ------------------------------------------------------------------------- */ + +/** + * \defgroup advanced_cpp_binding Binding in C of advanced methods from the C++ API + * @{ + */ + +/** Type of unit of measure. */ +typedef enum +{ + /** Angular unit of measure */ + PJ_UT_ANGULAR, + /** Linear unit of measure */ + PJ_UT_LINEAR, + /** Scale unit of measure */ + PJ_UT_SCALE, + /** Time unit of measure */ + PJ_UT_TIME, + /** Parametric unit of measure */ + PJ_UT_PARAMETRIC +} PJ_UNIT_TYPE; + +/** Axis description. */ +typedef struct +{ + /** Axis name. */ + char* name; + /** Axis abbreviation. */ + char* abbreviation; + /** Axis direction. */ + char* direction; + /** Axis unit name. */ + char* unit_name; + /** Conversion factor to SI of the unit. */ + double unit_conv_factor; + /** Type of unit */ + PJ_UNIT_TYPE unit_type; +} PJ_AXIS_DESCRIPTION; + +PJ_OBJ PROJ_DLL *proj_obj_create_cs(PJ_CONTEXT *ctx, + PJ_COORDINATE_SYSTEM_TYPE type, + int axis_count, + const PJ_AXIS_DESCRIPTION* axis); + +/** Type of Cartesian 2D coordinate system. */ +typedef enum +{ + /* Easting-Norting */ + PJ_CART2D_EASTING_NORTHING, + /* Northing-Easting */ + PJ_CART2D_NORTHING_EASTING, +} PJ_CARTESIAN_CS_2D_TYPE; + +PJ_OBJ PROJ_DLL *proj_obj_create_cartesian_2D_cs(PJ_CONTEXT *ctx, + PJ_CARTESIAN_CS_2D_TYPE type, + const char* unit_name, + double unit_conv_factor); + + +/** Type of Cartesian 2D coordinate system. */ +typedef enum +{ + /* Longitude-Latitude */ + PJ_ELLPS2D_LONGITUDE_LATITUDE, + /* Latitude-Longitude */ + PJ_ELLPS2D_LATITUDE_LONGITUDE, +} PJ_ELLIPSOIDAL_CS_2D_TYPE; + +PJ_OBJ PROJ_DLL *proj_obj_create_ellipsoidal_2D_cs(PJ_CONTEXT *ctx, + PJ_ELLIPSOIDAL_CS_2D_TYPE type, + const char* unit_name, + double unit_conv_factor); + PJ_OBJ PROJ_DLL *proj_obj_create_geographic_crs( PJ_CONTEXT *ctx, - const char *geogName, + const char *crsName, + const char *datumName, + const char *ellipsoidName, + double semiMajorMetre, double invFlattening, + const char *primeMeridianName, + double primeMeridianOffset, + const char *pmAngularUnits, + double pmUnitsConv, + PJ_OBJ* ellipsoidalCS); + +PJ_OBJ PROJ_DLL *proj_obj_create_geographic_crs_from_datum( + const char *crsName, + PJ_OBJ* datum, + PJ_OBJ* ellipsoidalCS); + +PJ_OBJ PROJ_DLL *proj_obj_create_geocentric_crs( + PJ_CONTEXT *ctx, + const char *crsName, const char *datumName, const char *ellipsoidName, double semiMajorMetre, double invFlattening, @@ -569,17 +974,84 @@ PJ_OBJ PROJ_DLL *proj_obj_create_geographic_crs( double primeMeridianOffset, const char *angularUnits, double angularUnitsConv, - int latLongOrder); + const char *linearUnits, + double linearUnitsConv); + +PJ_OBJ PROJ_DLL *proj_obj_create_geocentric_crs_from_datum( + const char *crsName, + const PJ_OBJ* datum, + const char *linearUnits, + double linearUnitsConv); + +PJ_OBJ PROJ_DLL *proj_obj_alter_name(const PJ_OBJ* obj, const char* name); + +PJ_OBJ PROJ_DLL *proj_obj_crs_alter_geodetic_crs(const PJ_OBJ* obj, + const PJ_OBJ* newGeodCRS); + +PJ_OBJ PROJ_DLL *proj_obj_crs_alter_cs_angular_unit(const PJ_OBJ* obj, + const char *angularUnits, + double angularUnitsConv); + +PJ_OBJ PROJ_DLL *proj_obj_crs_alter_cs_linear_unit(const PJ_OBJ* obj, + const char *linearUnits, + double linearUnitsConv); + +PJ_OBJ PROJ_DLL *proj_obj_crs_alter_parameters_linear_unit(const PJ_OBJ* obj, + const char *linearUnits, + double linearUnitsConv, + int convertToNewUnit); + +PJ_OBJ PROJ_DLL *proj_obj_create_engineering_crs(PJ_CONTEXT *ctx, + const char *crsName); + +/** Description of a parameter value for a Conversion. */ +typedef struct +{ + /** Parameter name. */ + const char* name; + /** Parameter authority name. */ + const char* auth_name; + /** Parameter code. */ + const char* code; + /** Parameter value. */ + double value; + /** Name of unit in which parameter value is expressed. */ + const char* unit_name; + /** Conversion factor to SI of the unit. */ + double unit_conv_factor; + /** Type of unit */ + PJ_UNIT_TYPE unit_type; +} PJ_PARAM_DESCRIPTION; + +PJ_OBJ PROJ_DLL *proj_obj_create_conversion(PJ_CONTEXT *ctx, + const char* name, + const char* auth_name, + const char* code, + const char* method_name, + const char* method_auth_name, + const char* method_code, + int param_count, + const PJ_PARAM_DESCRIPTION* params); + +PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs(const char* crs_name, + const PJ_OBJ* geodetic_crs, + const PJ_OBJ* conversion, + const PJ_OBJ* coordinate_system); + +PJ_OBJ PROJ_DLL *proj_obj_crs_create_bound_crs(const PJ_OBJ *base_crs, + const PJ_OBJ *hub_crs, + const PJ_OBJ *transformation); + +PJ_OBJ PROJ_DLL *proj_obj_crs_create_bound_crs_to_WGS84(const PJ_OBJ *crs); /* BEGIN: Generated by scripts/create_c_api_projections.py*/ -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_UTM( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_utm( + PJ_CONTEXT *ctx, int zone, - int north -); + int north); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_TransverseMercator( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_transverse_mercator( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, @@ -588,8 +1060,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_TransverseMercator( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_GaussSchreiberTransverseMercator( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_gauss_schreiber_transverse_mercator( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, @@ -598,8 +1070,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_GaussSchreiberTransverseMercator( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_TransverseMercatorSouthOriented( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_transverse_mercator_south_oriented( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, @@ -608,8 +1080,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_TransverseMercatorSouthOriented( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_TwoPointEquidistant( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_two_point_equidistant( + PJ_CONTEXT *ctx, double latitudeFirstPoint, double longitudeFirstPoint, double latitudeSecondPoint, @@ -619,8 +1091,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_TwoPointEquidistant( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_TunisiaMappingGrid( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_tunisia_mapping_grid( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, @@ -628,8 +1100,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_TunisiaMappingGrid( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_AlbersEqualArea( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_albers_equal_area( + PJ_CONTEXT *ctx, double latitudeFalseOrigin, double longitudeFalseOrigin, double latitudeFirstParallel, @@ -639,8 +1111,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_AlbersEqualArea( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertConicConformal_1SP( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_lambert_conic_conformal_1sp( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, @@ -649,8 +1121,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertConicConformal_1SP( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertConicConformal_2SP( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_lambert_conic_conformal_2sp( + PJ_CONTEXT *ctx, double latitudeFalseOrigin, double longitudeFalseOrigin, double latitudeFirstParallel, @@ -660,8 +1132,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertConicConformal_2SP( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertConicConformal_2SP_Michigan( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_lambert_conic_conformal_2sp_michigan( + PJ_CONTEXT *ctx, double latitudeFalseOrigin, double longitudeFalseOrigin, double latitudeFirstParallel, @@ -672,8 +1144,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertConicConformal_2SP_Michiga const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertConicConformal_2SP_Belgium( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_lambert_conic_conformal_2sp_belgium( + PJ_CONTEXT *ctx, double latitudeFalseOrigin, double longitudeFalseOrigin, double latitudeFirstParallel, @@ -683,8 +1155,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertConicConformal_2SP_Belgium const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_AzimuthalEquidistant( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_azimuthal_equidistant( + PJ_CONTEXT *ctx, double latitudeNatOrigin, double longitudeNatOrigin, double falseEasting, @@ -692,8 +1164,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_AzimuthalEquidistant( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_GuamProjection( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_guam_projection( + PJ_CONTEXT *ctx, double latitudeNatOrigin, double longitudeNatOrigin, double falseEasting, @@ -701,8 +1173,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_GuamProjection( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Bonne( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_bonne( + PJ_CONTEXT *ctx, double latitudeNatOrigin, double longitudeNatOrigin, double falseEasting, @@ -710,8 +1182,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Bonne( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertCylindricalEqualAreaSpherical( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_lambert_cylindrical_equal_area_spherical( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double longitudeNatOrigin, double falseEasting, @@ -719,8 +1191,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertCylindricalEqualAreaSpheri const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertCylindricalEqualArea( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_lambert_cylindrical_equal_area( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double longitudeNatOrigin, double falseEasting, @@ -728,8 +1200,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertCylindricalEqualArea( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_CassiniSoldner( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_cassini_soldner( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, @@ -737,8 +1209,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_CassiniSoldner( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EquidistantConic( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_equidistant_conic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double latitudeFirstParallel, @@ -748,56 +1220,56 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EquidistantConic( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EckertI( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_eckert_i( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EckertII( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_eckert_ii( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EckertIII( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_eckert_iii( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EckertIV( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_eckert_iv( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EckertV( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_eckert_v( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EckertVI( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_eckert_vi( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EquidistantCylindrical( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_equidistant_cylindrical( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double longitudeNatOrigin, double falseEasting, @@ -805,8 +1277,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EquidistantCylindrical( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EquidistantCylindricalSpherical( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_equidistant_cylindrical_spherical( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double longitudeNatOrigin, double falseEasting, @@ -814,32 +1286,32 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EquidistantCylindricalSpherical( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Gall( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_gall( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_GoodeHomolosine( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_goode_homolosine( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_InterruptedGoodeHomolosine( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_interrupted_goode_homolosine( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_GeostationarySatelliteSweepX( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_geostationary_satellite_sweep_x( + PJ_CONTEXT *ctx, double centerLong, double height, double falseEasting, @@ -847,8 +1319,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_GeostationarySatelliteSweepX( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_GeostationarySatelliteSweepY( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_geostationary_satellite_sweep_y( + PJ_CONTEXT *ctx, double centerLong, double height, double falseEasting, @@ -856,8 +1328,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_GeostationarySatelliteSweepY( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Gnomonic( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_gnomonic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, @@ -865,8 +1337,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Gnomonic( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_HotineObliqueMercatorVariantA( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_hotine_oblique_mercator_variant_a( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double longitudeProjectionCentre, double azimuthInitialLine, @@ -877,8 +1349,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_HotineObliqueMercatorVariantA( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_HotineObliqueMercatorVariantB( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_hotine_oblique_mercator_variant_b( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double longitudeProjectionCentre, double azimuthInitialLine, @@ -889,8 +1361,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_HotineObliqueMercatorVariantB( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_HotineObliqueMercatorTwoPointNaturalOrigin( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_hotine_oblique_mercator_two_point_natural_origin( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double latitudePoint1, double longitudePoint1, @@ -902,8 +1374,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_HotineObliqueMercatorTwoPointNatu const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_InternationalMapWorldPolyconic( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_international_map_world_polyconic( + PJ_CONTEXT *ctx, double centerLong, double latitudeFirstParallel, double latitudeSecondParallel, @@ -912,8 +1384,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_InternationalMapWorldPolyconic( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_KrovakNorthOriented( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_krovak_north_oriented( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double longitudeOfOrigin, double colatitudeConeAxis, @@ -924,8 +1396,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_KrovakNorthOriented( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Krovak( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_krovak( + PJ_CONTEXT *ctx, double latitudeProjectionCentre, double longitudeOfOrigin, double colatitudeConeAxis, @@ -936,8 +1408,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Krovak( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertAzimuthalEqualArea( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_lambert_azimuthal_equal_area( + PJ_CONTEXT *ctx, double latitudeNatOrigin, double longitudeNatOrigin, double falseEasting, @@ -945,16 +1417,16 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_LambertAzimuthalEqualArea( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_MillerCylindrical( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_miller_cylindrical( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_MercatorVariantA( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_mercator_variant_a( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, @@ -963,8 +1435,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_MercatorVariantA( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_MercatorVariantB( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_mercator_variant_b( + PJ_CONTEXT *ctx, double latitudeFirstParallel, double centerLong, double falseEasting, @@ -972,8 +1444,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_MercatorVariantB( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_PopularVisualisationPseudoMercator( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_popular_visualisation_pseudo_mercator( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, @@ -981,16 +1453,16 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_PopularVisualisationPseudoMercato const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Mollweide( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_mollweide( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_NewZealandMappingGrid( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_new_zealand_mapping_grid( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, @@ -998,8 +1470,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_NewZealandMappingGrid( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_ObliqueStereographic( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_oblique_stereographic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, @@ -1008,8 +1480,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_ObliqueStereographic( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Orthographic( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_orthographic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, @@ -1017,8 +1489,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Orthographic( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_AmericanPolyconic( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_american_polyconic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, @@ -1026,8 +1498,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_AmericanPolyconic( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_PolarStereographicVariantA( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_polar_stereographic_variant_a( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, @@ -1036,8 +1508,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_PolarStereographicVariantA( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_PolarStereographicVariantB( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_polar_stereographic_variant_b( + PJ_CONTEXT *ctx, double latitudeStandardParallel, double longitudeOfOrigin, double falseEasting, @@ -1045,24 +1517,24 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_PolarStereographicVariantB( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Robinson( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_robinson( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Sinusoidal( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_sinusoidal( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Stereographic( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_stereographic( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double scale, @@ -1071,32 +1543,32 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_Stereographic( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_VanDerGrinten( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_van_der_grinten( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_WagnerI( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_wagner_i( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_WagnerII( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_wagner_ii( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_WagnerIII( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_wagner_iii( + PJ_CONTEXT *ctx, double latitudeTrueScale, double centerLong, double falseEasting, @@ -1104,40 +1576,40 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_WagnerIII( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_WagnerIV( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_wagner_iv( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_WagnerV( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_wagner_v( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_WagnerVI( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_wagner_vi( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_WagnerVII( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_wagner_vii( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_QuadrilateralizedSphericalCube( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_quadrilateralized_spherical_cube( + PJ_CONTEXT *ctx, double centerLat, double centerLong, double falseEasting, @@ -1145,8 +1617,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_QuadrilateralizedSphericalCube( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_SphericalCrossTrackHeight( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_spherical_cross_track_height( + PJ_CONTEXT *ctx, double pegPointLat, double pegPointLong, double pegPointHeading, @@ -1154,8 +1626,8 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_SphericalCrossTrackHeight( const char* angUnitName, double angUnitConvFactor, const char* linearUnitName, double linearUnitConvFactor); -PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EqualEarth( - PJ_OBJ* geodetic_crs, const char* crs_name, +PJ_OBJ PROJ_DLL *proj_obj_create_conversion_equal_earth( + PJ_CONTEXT *ctx, double centerLong, double falseEasting, double falseNorthing, @@ -1164,289 +1636,7 @@ PJ_OBJ PROJ_DLL *proj_obj_create_projected_crs_EqualEarth( /* END: Generated by scripts/create_c_api_projections.py*/ -PJ_OBJ_TYPE PROJ_DLL proj_obj_get_type(PJ_OBJ *obj); - -int PROJ_DLL proj_obj_is_deprecated(PJ_OBJ *obj); - -/** Comparison criterion. */ -typedef enum -{ - /** All properties are identical. */ - PJ_COMP_STRICT, - - /** The objects are equivalent for the purpose of coordinate - * operations. They can differ by the name of their objects, - * identifiers, other metadata. - * Parameters may be expressed in different units, provided that the - * value is (with some tolerance) the same once expressed in a - * common unit. - */ - PJ_COMP_EQUIVALENT, - - /** Same as EQUIVALENT, relaxed with an exception that the axis order - * of the base CRS of a DerivedCRS/ProjectedCRS or the axis order of - * a GeographicCRS is ignored. Only to be used - * with DerivedCRS/ProjectedCRS/GeographicCRS */ - PJ_COMP_EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS, -} PJ_COMPARISON_CRITERION; - -int PROJ_DLL proj_obj_is_equivalent_to(PJ_OBJ *obj, PJ_OBJ* other, - PJ_COMPARISON_CRITERION criterion); - -int PROJ_DLL proj_obj_is_crs(PJ_OBJ *obj); - -const char PROJ_DLL* proj_obj_get_name(PJ_OBJ *obj); - -const char PROJ_DLL* proj_obj_get_id_auth_name(PJ_OBJ *obj, int index); - -const char PROJ_DLL* proj_obj_get_id_code(PJ_OBJ *obj, int index); - -int PROJ_DLL proj_obj_get_area_of_use(PJ_OBJ *obj, - double* p_west_lon_degree, - double* p_south_lat_degree, - double* p_east_lon_degree, - double* p_north_lat_degree, - const char **p_area_name); - -/** \brief WKT version. */ -typedef enum -{ - /** cf osgeo::proj::io::WKTFormatter::Convention::WKT2 */ - PJ_WKT2_2015, - /** cf osgeo::proj::io::WKTFormatter::Convention::WKT2_SIMPLIFIED */ - PJ_WKT2_2015_SIMPLIFIED, - /** cf osgeo::proj::io::WKTFormatter::Convention::WKT2_2018 */ - PJ_WKT2_2018, - /** cf osgeo::proj::io::WKTFormatter::Convention::WKT2_2018_SIMPLIFIED */ - PJ_WKT2_2018_SIMPLIFIED, - /** cf osgeo::proj::io::WKTFormatter::Convention::WKT1_GDAL */ - PJ_WKT1_GDAL, - /** cf osgeo::proj::io::WKTFormatter::Convention::WKT1_ESRI */ - PJ_WKT1_ESRI -} PJ_WKT_TYPE; - -const char PROJ_DLL* proj_obj_as_wkt(PJ_OBJ *obj, PJ_WKT_TYPE type, - const char* const *options); - -/** \brief PROJ string version. */ -typedef enum -{ - /** cf osgeo::proj::io::PROJStringFormatter::Convention::PROJ_5 */ - PJ_PROJ_5, - /** cf osgeo::proj::io::PROJStringFormatter::Convention::PROJ_4 */ - PJ_PROJ_4 -} PJ_PROJ_STRING_TYPE; - -const char PROJ_DLL* proj_obj_as_proj_string(PJ_OBJ *obj, - PJ_PROJ_STRING_TYPE type, - const char* const *options); - -PJ_OBJ PROJ_DLL *proj_obj_get_source_crs(PJ_OBJ *obj); - -PJ_OBJ PROJ_DLL *proj_obj_get_target_crs(PJ_OBJ *obj); - -PJ_OBJ_LIST PROJ_DLL *proj_obj_identify(PJ_OBJ* obj, - const char *auth_name, - const char* const *options, - int **confidence); - -void PROJ_DLL proj_free_int_list(int* list); - -/* ------------------------------------------------------------------------- */ - -/** \brief Type representing a NULL terminated list of NUL-terminate strings. */ -typedef char **PROJ_STRING_LIST; - -PROJ_STRING_LIST PROJ_DLL proj_get_authorities_from_database(PJ_CONTEXT *ctx); - -PROJ_STRING_LIST PROJ_DLL proj_get_codes_from_database(PJ_CONTEXT *ctx, - const char *auth_name, - PJ_OBJ_TYPE type, - int allow_deprecated); - -void PROJ_DLL proj_free_string_list(PROJ_STRING_LIST list); - -/* ------------------------------------------------------------------------- */ - - -/*! @cond Doxygen_Suppress */ -typedef struct PJ_OPERATION_FACTORY_CONTEXT PJ_OPERATION_FACTORY_CONTEXT; -/*! @endcond */ - -PJ_OPERATION_FACTORY_CONTEXT PROJ_DLL *proj_create_operation_factory_context( - PJ_CONTEXT *ctx, - const char *authority); - -void PROJ_DLL proj_operation_factory_context_unref( - PJ_OPERATION_FACTORY_CONTEXT *ctxt); - -void PROJ_DLL proj_operation_factory_context_set_desired_accuracy( - PJ_OPERATION_FACTORY_CONTEXT *ctxt, - double accuracy); - -void PROJ_DLL proj_operation_factory_context_set_area_of_interest( - PJ_OPERATION_FACTORY_CONTEXT *ctxt, - double west_lon_degree, - double south_lat_degree, - double east_lon_degree, - double north_lat_degree); - -/** Specify how source and target CRS extent should be used to restrict - * candidate operations (only taken into account if no explicit area of - * interest is specified. */ -typedef enum -{ - /** Ignore CRS extent */ - PJ_CRS_EXTENT_NONE, - - /** Test coordinate operation extent against both CRS extent. */ - PJ_CRS_EXTENT_BOTH, - - /** Test coordinate operation extent against the intersection of both - CRS extent. */ - PJ_CRS_EXTENT_INTERSECTION, - - /** Test coordinate operation against the smallest of both CRS extent. */ - PJ_CRS_EXTENT_SMALLEST -} PROJ_CRS_EXTENT_USE; - -void PROJ_DLL proj_operation_factory_context_set_crs_extent_use( - PJ_OPERATION_FACTORY_CONTEXT *ctxt, - PROJ_CRS_EXTENT_USE use); - -/** Spatial criterion to restrict candiate operations. */ -typedef enum { - /** The area of validity of transforms should strictly contain the - * are of interest. */ - PROJ_SPATIAL_CRITERION_STRICT_CONTAINMENT, - - /** The area of validity of transforms should at least intersect the - * area of interest. */ - PROJ_SPATIAL_CRITERION_PARTIAL_INTERSECTION -} PROJ_SPATIAL_CRITERION; - -void PROJ_DLL proj_operation_factory_context_set_spatial_criterion( - PJ_OPERATION_FACTORY_CONTEXT *ctxt, - PROJ_SPATIAL_CRITERION criterion); - - -/** Describe how grid availability is used. */ -typedef enum { - /** Grid availability is only used for sorting results. Operations - * where some grids are missing will be sorted last. */ - PROJ_GRID_AVAILABILITY_USED_FOR_SORTING, - - /** Completely discard an operation if a required grid is missing. */ - PROJ_GRID_AVAILABILITY_DISCARD_OPERATION_IF_MISSING_GRID, - - /** Ignore grid availability at all. Results will be presented as if - * all grids were available. */ - PROJ_GRID_AVAILABILITY_IGNORED, -} PROJ_GRID_AVAILABILITY_USE; - -void PROJ_DLL proj_operation_factory_context_set_grid_availability_use( - PJ_OPERATION_FACTORY_CONTEXT *ctxt, - PROJ_GRID_AVAILABILITY_USE use); - -void PROJ_DLL proj_operation_factory_context_set_use_proj_alternative_grid_names( - PJ_OPERATION_FACTORY_CONTEXT *ctxt, - int usePROJNames); - -void PROJ_DLL proj_operation_factory_context_set_allow_use_intermediate_crs( - PJ_OPERATION_FACTORY_CONTEXT *ctxt, int allow); - -void PROJ_DLL proj_operation_factory_context_set_allowed_intermediate_crs( - PJ_OPERATION_FACTORY_CONTEXT *ctxt, - const char* const *list_of_auth_name_codes); - -/* ------------------------------------------------------------------------- */ - - -PJ_OBJ_LIST PROJ_DLL *proj_obj_create_operations( - PJ_OBJ *source_crs, - PJ_OBJ *target_crs, - PJ_OPERATION_FACTORY_CONTEXT *operationContext); - -int PROJ_DLL proj_obj_list_get_count(PJ_OBJ_LIST *result); - -PJ_OBJ PROJ_DLL *proj_obj_list_get(PJ_OBJ_LIST *result, - int index); - -void PROJ_DLL proj_obj_list_unref(PJ_OBJ_LIST *result); - -/* ------------------------------------------------------------------------- */ - -PJ_OBJ PROJ_DLL *proj_obj_crs_get_geodetic_crs(PJ_OBJ *crs); - -PJ_OBJ PROJ_DLL *proj_obj_crs_get_horizontal_datum(PJ_OBJ *crs); - -PJ_OBJ PROJ_DLL *proj_obj_crs_get_sub_crs(PJ_OBJ *crs, int index); - -PJ_OBJ PROJ_DLL *proj_obj_crs_create_bound_crs_to_WGS84(PJ_OBJ *crs); - -PJ_OBJ PROJ_DLL *proj_obj_crs_get_coordinate_system(PJ_OBJ *crs); - -const char PROJ_DLL *proj_obj_cs_get_type(PJ_OBJ* cs); - -int PROJ_DLL proj_obj_cs_get_axis_count(PJ_OBJ *cs); - -int PROJ_DLL proj_obj_cs_get_axis_info(PJ_OBJ *cs, int index, - const char **pName, - const char **pAbbrev, - const char **pDirection, - double *pUnitConvFactor, - const char **pUnitName); - -PJ_OBJ PROJ_DLL *proj_obj_get_ellipsoid(PJ_OBJ *obj); - -int PROJ_DLL proj_obj_ellipsoid_get_parameters(PJ_OBJ *ellipsoid, - double *pSemiMajorMetre, - double *pSemiMinorMetre, - int *pIsSemiMinorComputed, - double *pInverseFlattening); - -PJ_OBJ PROJ_DLL *proj_obj_get_prime_meridian(PJ_OBJ *obj); - -int PROJ_DLL proj_obj_prime_meridian_get_parameters(PJ_OBJ *prime_meridian, - double *pLongitude, - double *pLongitudeUnitConvFactor, - const char **pLongitudeUnitName); - -PJ_OBJ PROJ_DLL *proj_obj_crs_get_coordoperation(PJ_OBJ *crs, - const char **pMethodName, - const char **pMethodAuthorityName, - const char **pMethodCode); - -int PROJ_DLL proj_coordoperation_is_instanciable(PJ_OBJ *coordoperation); - -int PROJ_DLL proj_coordoperation_get_param_count(PJ_OBJ *coordoperation); - -int PROJ_DLL proj_coordoperation_get_param_index(PJ_OBJ *coordoperation, - const char *name); - -int PROJ_DLL proj_coordoperation_get_param(PJ_OBJ *coordoperation, - int index, - const char **pName, - const char **pNameAuthorityName, - const char **pNameCode, - double *pValue, - const char **pValueString, - double *pValueUnitConvFactor, - const char **pValueUnitName); - -int PROJ_DLL proj_coordoperation_get_grid_used_count(PJ_OBJ *coordoperation); - -int PROJ_DLL proj_coordoperation_get_grid_used(PJ_OBJ *coordoperation, - int index, - const char **pShortName, - const char **pFullName, - const char **pPackageName, - const char **pURL, - int *pDirectDownload, - int *pOpenLicense, - int *pAvailable); - -double PROJ_DLL proj_coordoperation_get_accuracy(PJ_OBJ* obj); +/**@}*/ #ifdef __cplusplus } diff --git a/src/proj_symbol_rename.h b/src/proj_symbol_rename.h index 53b324e7..a267b97e 100644 --- a/src/proj_symbol_rename.h +++ b/src/proj_symbol_rename.h @@ -156,6 +156,7 @@ #define proj_lpz_dist internal_proj_lpz_dist #define proj_obj_as_proj_string internal_proj_obj_as_proj_string #define proj_obj_as_wkt internal_proj_obj_as_wkt +#define proj_obj_clone internal_proj_obj_clone #define proj_obj_create_from_database internal_proj_obj_create_from_database #define proj_obj_create_from_name internal_proj_obj_create_from_name #define proj_obj_create_from_proj_string internal_proj_obj_create_from_proj_string diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp index d23920f5..e033c0c8 100644 --- a/test/unit/test_c_api.cpp +++ b/test/unit/test_c_api.cpp @@ -390,6 +390,25 @@ TEST_F(CApi, proj_obj_crs_create_bound_crs_to_WGS84) { "+y_0=500000 +ellps=krass " "+towgs84=2.329,-147.042,-92.08,-0.309,0.325,0.497,5.69 " "+units=m +no_defs"); + + auto base_crs = proj_obj_get_source_crs(res); + ObjectKeeper keeper_base_crs(base_crs); + ASSERT_NE(base_crs, nullptr); + + auto hub_crs = proj_obj_get_target_crs(res); + ObjectKeeper keeper_hub_crs(hub_crs); + ASSERT_NE(hub_crs, nullptr); + + auto transf = + proj_obj_crs_get_coordoperation(res, nullptr, nullptr, nullptr); + ObjectKeeper keeper_transf(transf); + ASSERT_NE(transf, nullptr); + + auto res2 = proj_obj_crs_create_bound_crs(base_crs, hub_crs, transf); + ObjectKeeper keeper_res2(res2); + ASSERT_NE(res2, nullptr); + + EXPECT_TRUE(proj_obj_is_equivalent_to(res, res2, PJ_COMP_STRICT)); } // --------------------------------------------------------------------------- @@ -655,9 +674,16 @@ TEST_F(CApi, proj_crs) { ASSERT_TRUE(geogCRS_name != nullptr); EXPECT_EQ(geogCRS_name, std::string("WGS 84")); - auto datum = proj_obj_crs_get_horizontal_datum(crs); + auto h_datum = proj_obj_crs_get_horizontal_datum(crs); + ASSERT_NE(h_datum, nullptr); + ObjectKeeper keeper_h_datum(h_datum); + + auto datum = proj_obj_crs_get_datum(crs); ASSERT_NE(datum, nullptr); ObjectKeeper keeper_datum(datum); + + EXPECT_TRUE(proj_obj_is_equivalent_to(h_datum, datum, PJ_COMP_STRICT)); + auto datum_name = proj_obj_get_name(datum); ASSERT_TRUE(datum_name != nullptr); EXPECT_EQ(datum_name, std::string("World Geodetic System 1984")); @@ -1468,11 +1494,16 @@ TEST_F(CApi, proj_coordoperation_get_accuracy) { // --------------------------------------------------------------------------- TEST_F(CApi, proj_obj_create_geographic_crs) { + + auto cs = proj_obj_create_ellipsoidal_2D_cs( + m_ctxt, PJ_ELLPS2D_LATITUDE_LONGITUDE, nullptr, 0); + ObjectKeeper keeper_cs(cs); + ASSERT_NE(cs, nullptr); + { auto obj = proj_obj_create_geographic_crs( m_ctxt, "WGS 84", "World Geodetic System 1984", "WGS 84", 6378137, - 298.257223563, "Greenwich", 0.0, "Degree", 0.0174532925199433, - true); + 298.257223563, "Greenwich", 0.0, "Degree", 0.0174532925199433, cs); ObjectKeeper keeper(obj); ASSERT_NE(obj, nullptr); @@ -1485,11 +1516,22 @@ TEST_F(CApi, proj_obj_create_geographic_crs) { EXPECT_NE(objRef, nullptr); EXPECT_TRUE(proj_obj_is_equivalent_to(obj, objRef, PJ_COMP_EQUIVALENT)); + + auto datum = proj_obj_crs_get_datum(obj); + ObjectKeeper keeper_datum(datum); + ASSERT_NE(datum, nullptr); + + auto obj2 = + proj_obj_create_geographic_crs_from_datum("WGS 84", datum, cs); + ObjectKeeper keeperObj(obj2); + ASSERT_NE(obj2, nullptr); + + EXPECT_TRUE(proj_obj_is_equivalent_to(obj, obj2, PJ_COMP_STRICT)); } { auto obj = proj_obj_create_geographic_crs(m_ctxt, nullptr, nullptr, nullptr, 1.0, 0.0, nullptr, - 0.0, nullptr, 0.0, false); + 0.0, nullptr, 0.0, cs); ObjectKeeper keeper(obj); ASSERT_NE(obj, nullptr); } @@ -1497,474 +1539,458 @@ TEST_F(CApi, proj_obj_create_geographic_crs) { // --------------------------------------------------------------------------- -TEST_F(CApi, proj_obj_create_projections) { +TEST_F(CApi, proj_obj_create_geocentric_crs) { + { + auto obj = proj_obj_create_geocentric_crs( + m_ctxt, "WGS 84", "World Geodetic System 1984", "WGS 84", 6378137, + 298.257223563, "Greenwich", 0.0, "Degree", 0.0174532925199433, + "Metre", 1.0); + ObjectKeeper keeper(obj); + ASSERT_NE(obj, nullptr); - auto geogCRS = proj_obj_create_geographic_crs( - m_ctxt, "WGS 84", "World Geodetic System 1984", "WGS 84", 6378137, - 298.257223563, "Greenwich", 0.0, "Degree", 0.0174532925199433, true); - ObjectKeeper keepergeogCRS(geogCRS); - ASSERT_NE(geogCRS, nullptr); + auto objRef = proj_obj_create_from_user_input( + m_ctxt, + GeographicCRS::EPSG_4978->exportToWKT(WKTFormatter::create().get()) + .c_str(), + nullptr); + ObjectKeeper keeperobjRef(objRef); + EXPECT_NE(objRef, nullptr); + + EXPECT_TRUE(proj_obj_is_equivalent_to(obj, objRef, PJ_COMP_EQUIVALENT)); + + auto datum = proj_obj_crs_get_datum(obj); + ObjectKeeper keeper_datum(datum); + ASSERT_NE(datum, nullptr); + + auto obj2 = proj_obj_create_geocentric_crs_from_datum("WGS 84", datum, + "Metre", 1.0); + ObjectKeeper keeperObj(obj2); + ASSERT_NE(obj2, nullptr); + + EXPECT_TRUE(proj_obj_is_equivalent_to(obj, obj2, PJ_COMP_STRICT)); + } + { + auto obj = proj_obj_create_geocentric_crs( + m_ctxt, nullptr, nullptr, nullptr, 1.0, 0.0, nullptr, 0.0, nullptr, + 0.0, nullptr, 0.0); + ObjectKeeper keeper(obj); + ASSERT_NE(obj, nullptr); + } +} +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_create_projections) { /* BEGIN: Generated by scripts/create_c_api_projections.py*/ { - auto projCRS = - proj_obj_create_projected_crs_UTM(geogCRS, nullptr, 0, 0); + auto projCRS = proj_obj_create_conversion_utm(m_ctxt, 0, 0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_TransverseMercator( - geogCRS, nullptr, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_transverse_mercator( + m_ctxt, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_GaussSchreiberTransverseMercator( - geogCRS, nullptr, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_gauss_schreiber_transverse_mercator( + m_ctxt, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_TransverseMercatorSouthOriented( - geogCRS, nullptr, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_transverse_mercator_south_oriented( + m_ctxt, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_TwoPointEquidistant( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_two_point_equidistant( + m_ctxt, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_TunisiaMappingGrid( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_tunisia_mapping_grid( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_AlbersEqualArea( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_albers_equal_area( + m_ctxt, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_LambertConicConformal_1SP( - geogCRS, nullptr, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_lambert_conic_conformal_1sp( + m_ctxt, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_LambertConicConformal_2SP( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_lambert_conic_conformal_2sp( + m_ctxt, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_LambertConicConformal_2SP_Michigan( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, 0, "Degree", - 0.0174532925199433, "Metre", 1.0); + proj_obj_create_conversion_lambert_conic_conformal_2sp_michigan( + m_ctxt, 0, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, + "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_LambertConicConformal_2SP_Belgium( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, "Degree", - 0.0174532925199433, "Metre", 1.0); + proj_obj_create_conversion_lambert_conic_conformal_2sp_belgium( + m_ctxt, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_AzimuthalEquidistant( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_azimuthal_equidistant( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_GuamProjection( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_guam_projection( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_Bonne( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_bonne( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_LambertCylindricalEqualAreaSpherical( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_lambert_cylindrical_equal_area_spherical( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_LambertCylindricalEqualArea( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_lambert_cylindrical_equal_area( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_CassiniSoldner( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_cassini_soldner( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_EquidistantConic( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_equidistant_conic( + m_ctxt, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_EckertI( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_eckert_i( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_EckertII( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_eckert_ii( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_EckertIII( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_eckert_iii( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_EckertIV( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_eckert_iv( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_EckertV( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_eckert_v( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_EckertVI( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_eckert_vi( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_EquidistantCylindrical( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_equidistant_cylindrical( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_EquidistantCylindricalSpherical( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_equidistant_cylindrical_spherical( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_Gall( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_gall( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_GoodeHomolosine( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_goode_homolosine( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_InterruptedGoodeHomolosine( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_interrupted_goode_homolosine( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_GeostationarySatelliteSweepX( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_geostationary_satellite_sweep_x( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_GeostationarySatelliteSweepY( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_geostationary_satellite_sweep_y( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_Gnomonic( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_gnomonic( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_HotineObliqueMercatorVariantA( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, 0, "Degree", - 0.0174532925199433, "Metre", 1.0); + proj_obj_create_conversion_hotine_oblique_mercator_variant_a( + m_ctxt, 0, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, + "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_HotineObliqueMercatorVariantB( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, 0, "Degree", - 0.0174532925199433, "Metre", 1.0); + proj_obj_create_conversion_hotine_oblique_mercator_variant_b( + m_ctxt, 0, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, + "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_HotineObliqueMercatorTwoPointNaturalOrigin( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, 0, 0, "Degree", - 0.0174532925199433, "Metre", 1.0); + proj_obj_create_conversion_hotine_oblique_mercator_two_point_natural_origin( + m_ctxt, 0, 0, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, + "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_InternationalMapWorldPolyconic( - geogCRS, nullptr, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_international_map_world_polyconic( + m_ctxt, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_KrovakNorthOriented( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_krovak_north_oriented( + m_ctxt, 0, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_Krovak( - geogCRS, nullptr, 0, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_krovak( + m_ctxt, 0, 0, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", + 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_LambertAzimuthalEqualArea( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_lambert_azimuthal_equal_area( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_MillerCylindrical( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_miller_cylindrical( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_MercatorVariantA( - geogCRS, nullptr, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_mercator_variant_a( + m_ctxt, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_MercatorVariantB( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_mercator_variant_b( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_PopularVisualisationPseudoMercator( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_popular_visualisation_pseudo_mercator( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_Mollweide( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_mollweide( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_NewZealandMappingGrid( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_new_zealand_mapping_grid( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_ObliqueStereographic( - geogCRS, nullptr, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_oblique_stereographic( + m_ctxt, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_Orthographic( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_orthographic( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_AmericanPolyconic( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_american_polyconic( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_PolarStereographicVariantA( - geogCRS, nullptr, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_polar_stereographic_variant_a( + m_ctxt, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_PolarStereographicVariantB( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_polar_stereographic_variant_b( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_Robinson( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_robinson( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_Sinusoidal( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_sinusoidal( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_Stereographic( - geogCRS, nullptr, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + auto projCRS = proj_obj_create_conversion_stereographic( + m_ctxt, 0, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_VanDerGrinten( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_van_der_grinten( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_WagnerI( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_wagner_i( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_WagnerII( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_wagner_ii( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_WagnerIII( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_wagner_iii( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_WagnerIV( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_wagner_iv( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_WagnerV( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_wagner_v( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_WagnerVI( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_wagner_vi( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_WagnerVII( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_wagner_vii( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { auto projCRS = - proj_obj_create_projected_crs_QuadrilateralizedSphericalCube( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, - "Metre", 1.0); + proj_obj_create_conversion_quadrilateralized_spherical_cube( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_SphericalCrossTrackHeight( - geogCRS, nullptr, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_spherical_cross_track_height( + m_ctxt, 0, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } { - auto projCRS = proj_obj_create_projected_crs_EqualEarth( - geogCRS, nullptr, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", - 1.0); + auto projCRS = proj_obj_create_conversion_equal_earth( + m_ctxt, 0, 0, 0, "Degree", 0.0174532925199433, "Metre", 1.0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } @@ -1984,9 +2010,7 @@ TEST_F(CApi, proj_obj_cs_get_axis_info) { ASSERT_NE(cs, nullptr); ObjectKeeper keeperCs(cs); - const char *type = proj_obj_cs_get_type(cs); - ASSERT_NE(type, nullptr); - EXPECT_EQ(std::string(type), "Ellipsoidal"); + EXPECT_EQ(proj_obj_cs_get_type(cs), PJ_CS_TYPE_ELLIPSOIDAL); EXPECT_EQ(proj_obj_cs_get_axis_count(cs), 2); @@ -2027,7 +2051,7 @@ TEST_F(CApi, proj_obj_cs_get_axis_info) { ObjectKeeper keeper(obj); EXPECT_EQ(proj_obj_crs_get_coordinate_system(obj), nullptr); - EXPECT_EQ(proj_obj_cs_get_type(obj), nullptr); + EXPECT_EQ(proj_obj_cs_get_type(obj), PJ_CS_TYPE_UNKNOWN); EXPECT_EQ(proj_obj_cs_get_axis_count(obj), -1); @@ -2043,4 +2067,226 @@ TEST_F(CApi, proj_context_get_database_metadata) { nullptr); } +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_clone) { + auto obj = + proj_obj_create_from_proj_string(m_ctxt, "+proj=longlat", nullptr); + ObjectKeeper keeper(obj); + ASSERT_NE(obj, nullptr); + + auto clone = proj_obj_clone(obj); + ObjectKeeper keeperClone(clone); + ASSERT_NE(clone, nullptr); + + EXPECT_TRUE(proj_obj_is_equivalent_to(obj, clone, PJ_COMP_STRICT)); +} + +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_crs_alter_geodetic_crs) { + auto projCRS = proj_obj_create_from_wkt( + m_ctxt, + createProjectedCRS()->exportToWKT(WKTFormatter::create().get()).c_str(), + nullptr); + ObjectKeeper keeper(projCRS); + ASSERT_NE(projCRS, nullptr); + + auto newGeodCRS = + proj_obj_create_from_proj_string(m_ctxt, "+proj=longlat", nullptr); + ObjectKeeper keeper_newGeodCRS(newGeodCRS); + ASSERT_NE(newGeodCRS, nullptr); + + auto geodCRS = proj_obj_crs_get_geodetic_crs(projCRS); + ObjectKeeper keeper_geodCRS(geodCRS); + ASSERT_NE(geodCRS, nullptr); + + auto geodCRSAltered = proj_obj_crs_alter_geodetic_crs(geodCRS, newGeodCRS); + ObjectKeeper keeper_geodCRSAltered(geodCRSAltered); + ASSERT_NE(geodCRSAltered, nullptr); + EXPECT_TRUE( + proj_obj_is_equivalent_to(geodCRSAltered, newGeodCRS, PJ_COMP_STRICT)); + + auto projCRSAltered = proj_obj_crs_alter_geodetic_crs(projCRS, newGeodCRS); + ObjectKeeper keeper_projCRSAltered(projCRSAltered); + ASSERT_NE(projCRSAltered, nullptr); + + EXPECT_EQ(proj_obj_get_type(projCRSAltered), PJ_OBJ_TYPE_PROJECTED_CRS); + + auto projCRSAltered_geodCRS = proj_obj_crs_get_geodetic_crs(projCRSAltered); + ObjectKeeper keeper_projCRSAltered_geodCRS(projCRSAltered_geodCRS); + ASSERT_NE(projCRSAltered_geodCRS, nullptr); + + EXPECT_TRUE(proj_obj_is_equivalent_to(projCRSAltered_geodCRS, newGeodCRS, + PJ_COMP_STRICT)); +} + +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_crs_alter_cs_angular_unit) { + auto crs = proj_obj_create_from_wkt( + m_ctxt, + GeographicCRS::EPSG_4326->exportToWKT(WKTFormatter::create().get()) + .c_str(), + nullptr); + ObjectKeeper keeper(crs); + ASSERT_NE(crs, nullptr); + + auto alteredCRS = proj_obj_crs_alter_cs_angular_unit(crs, "my unit", 2); + ObjectKeeper keeper_alteredCRS(alteredCRS); + ASSERT_NE(alteredCRS, nullptr); + + auto cs = proj_obj_crs_get_coordinate_system(alteredCRS); + ASSERT_NE(cs, nullptr); + ObjectKeeper keeperCs(cs); + double unitConvFactor = 0.0; + const char *unitName = nullptr; + + EXPECT_TRUE(proj_obj_cs_get_axis_info(cs, 0, nullptr, nullptr, nullptr, + &unitConvFactor, &unitName)); + ASSERT_NE(unitName, nullptr); + EXPECT_EQ(unitConvFactor, 2) << unitConvFactor; + EXPECT_EQ(std::string(unitName), "my unit"); +} + +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_crs_alter_cs_linear_unit) { + auto crs = proj_obj_create_from_wkt( + m_ctxt, + createProjectedCRS()->exportToWKT(WKTFormatter::create().get()).c_str(), + nullptr); + ObjectKeeper keeper(crs); + ASSERT_NE(crs, nullptr); + + auto alteredCRS = proj_obj_crs_alter_cs_linear_unit(crs, "my unit", 2); + ObjectKeeper keeper_alteredCRS(alteredCRS); + ASSERT_NE(alteredCRS, nullptr); + + auto cs = proj_obj_crs_get_coordinate_system(alteredCRS); + ASSERT_NE(cs, nullptr); + ObjectKeeper keeperCs(cs); + double unitConvFactor = 0.0; + const char *unitName = nullptr; + + EXPECT_TRUE(proj_obj_cs_get_axis_info(cs, 0, nullptr, nullptr, nullptr, + &unitConvFactor, &unitName)); + ASSERT_NE(unitName, nullptr); + EXPECT_EQ(unitConvFactor, 2) << unitConvFactor; + EXPECT_EQ(std::string(unitName), "my unit"); +} + +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_crs_alter_parameters_linear_unit) { + auto crs = proj_obj_create_from_wkt( + m_ctxt, + createProjectedCRS()->exportToWKT(WKTFormatter::create().get()).c_str(), + nullptr); + ObjectKeeper keeper(crs); + ASSERT_NE(crs, nullptr); + + { + auto alteredCRS = + proj_obj_crs_alter_parameters_linear_unit(crs, "my unit", 2, false); + ObjectKeeper keeper_alteredCRS(alteredCRS); + ASSERT_NE(alteredCRS, nullptr); + + auto wkt = proj_obj_as_wkt(alteredCRS, PJ_WKT2_2018, nullptr); + ASSERT_NE(wkt, nullptr); + EXPECT_TRUE(std::string(wkt).find("500000") != std::string::npos) + << wkt; + EXPECT_TRUE(std::string(wkt).find("\"my unit\",2") != std::string::npos) + << wkt; + } + + { + auto alteredCRS = + proj_obj_crs_alter_parameters_linear_unit(crs, "my unit", 2, true); + ObjectKeeper keeper_alteredCRS(alteredCRS); + ASSERT_NE(alteredCRS, nullptr); + + auto wkt = proj_obj_as_wkt(alteredCRS, PJ_WKT2_2018, nullptr); + ASSERT_NE(wkt, nullptr); + EXPECT_TRUE(std::string(wkt).find("250000") != std::string::npos) + << wkt; + EXPECT_TRUE(std::string(wkt).find("\"my unit\",2") != std::string::npos) + << wkt; + } +} + +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_create_engineering_crs) { + + auto crs = proj_obj_create_engineering_crs(m_ctxt, "name"); + ObjectKeeper keeper(crs); + ASSERT_NE(crs, nullptr); + auto wkt = proj_obj_as_wkt(crs, PJ_WKT1_GDAL, nullptr); + ASSERT_NE(wkt, nullptr); + EXPECT_EQ(std::string(wkt), "LOCAL_CS[\"name\"]") << wkt; +} + +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_alter_name) { + + auto cs = proj_obj_create_ellipsoidal_2D_cs( + m_ctxt, PJ_ELLPS2D_LONGITUDE_LATITUDE, nullptr, 0); + ObjectKeeper keeper_cs(cs); + ASSERT_NE(cs, nullptr); + + auto obj = proj_obj_create_geographic_crs( + m_ctxt, "WGS 84", "World Geodetic System 1984", "WGS 84", 6378137, + 298.257223563, "Greenwich", 0.0, "Degree", 0.0174532925199433, cs); + ObjectKeeper keeper(obj); + ASSERT_NE(obj, nullptr); + + auto alteredObj = proj_obj_alter_name(obj, "new name"); + ObjectKeeper keeper_alteredObj(alteredObj); + ASSERT_NE(alteredObj, nullptr); + + EXPECT_EQ(std::string(proj_obj_get_name(alteredObj)), "new name"); +} + +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_create_projected_crs) { + + PJ_PARAM_DESCRIPTION param; + param.name = "param name"; + param.auth_name = nullptr; + param.code = nullptr; + param.value = 0.99; + param.unit_name = nullptr; + param.unit_conv_factor = 1.0; + param.unit_type = PJ_UT_SCALE; + + auto conv = proj_obj_create_conversion(m_ctxt, "conv", "conv auth", + "conv code", "method", "method auth", + "method code", 1, ¶m); + ObjectKeeper keeper_conv(conv); + ASSERT_NE(conv, nullptr); + + auto geog_cs = proj_obj_create_ellipsoidal_2D_cs( + m_ctxt, PJ_ELLPS2D_LONGITUDE_LATITUDE, nullptr, 0); + ObjectKeeper keeper_geog_cs(geog_cs); + ASSERT_NE(geog_cs, nullptr); + + auto geogCRS = proj_obj_create_geographic_crs( + m_ctxt, "WGS 84", "World Geodetic System 1984", "WGS 84", 6378137, + 298.257223563, "Greenwich", 0.0, "Degree", 0.0174532925199433, geog_cs); + ObjectKeeper keeper_geogCRS(geogCRS); + ASSERT_NE(geogCRS, nullptr); + + auto cs = proj_obj_create_cartesian_2D_cs( + m_ctxt, PJ_CART2D_EASTING_NORTHING, nullptr, 0); + ObjectKeeper keeper_cs(cs); + ASSERT_NE(cs, nullptr); + + auto projCRS = proj_obj_create_projected_crs("my CRS", geogCRS, conv, cs); + ObjectKeeper keeper_projCRS(projCRS); + ASSERT_NE(projCRS, nullptr); +} + } // namespace diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp index fa64620c..bbbf2154 100644 --- a/test/unit/test_crs.cpp +++ b/test/unit/test_crs.cpp @@ -4665,3 +4665,136 @@ TEST(crs, crs_stripVerticalComponent) { EXPECT_EQ(projCRS->coordinateSystem()->axisList().size(), 2); } } + +// --------------------------------------------------------------------------- + +TEST(crs, crs_alterGeodeticCRS) { + + { + auto crs = GeographicCRS::EPSG_4326->alterGeodeticCRS( + GeographicCRS::EPSG_4979); + EXPECT_TRUE(crs->isEquivalentTo(GeographicCRS::EPSG_4979.get())); + } + + { + auto crs = + createProjected()->alterGeodeticCRS(GeographicCRS::EPSG_4979); + auto projCRS = dynamic_cast<ProjectedCRS *>(crs.get()); + ASSERT_TRUE(projCRS != nullptr); + EXPECT_TRUE( + projCRS->baseCRS()->isEquivalentTo(GeographicCRS::EPSG_4979.get())); + } + + { + auto crs = + createCompoundCRS()->alterGeodeticCRS(GeographicCRS::EPSG_4979); + auto compoundCRS = dynamic_cast<CompoundCRS *>(crs.get()); + ASSERT_TRUE(compoundCRS != nullptr); + EXPECT_TRUE(compoundCRS->componentReferenceSystems()[0] + ->extractGeographicCRS() + ->isEquivalentTo(GeographicCRS::EPSG_4979.get())); + } + + { + auto crs = + createVerticalCRS()->alterGeodeticCRS(GeographicCRS::EPSG_4979); + EXPECT_TRUE(crs->isEquivalentTo(createVerticalCRS().get())); + } +} + +// --------------------------------------------------------------------------- + +TEST(crs, crs_alterCSLinearUnit) { + + { + auto crs = + createProjected()->alterCSLinearUnit(UnitOfMeasure("my unit", 2)); + auto projCRS = dynamic_cast<ProjectedCRS *>(crs.get()); + ASSERT_TRUE(projCRS != nullptr); + auto cs = projCRS->coordinateSystem(); + ASSERT_EQ(cs->axisList().size(), 2U); + EXPECT_EQ(cs->axisList()[0]->unit().name(), "my unit"); + EXPECT_EQ(cs->axisList()[0]->unit().conversionToSI(), 2); + EXPECT_EQ(cs->axisList()[1]->unit().name(), "my unit"); + EXPECT_EQ(cs->axisList()[1]->unit().conversionToSI(), 2); + } + + { + auto crs = GeodeticCRS::EPSG_4978->alterCSLinearUnit( + UnitOfMeasure("my unit", 2)); + auto geodCRS = dynamic_cast<GeodeticCRS *>(crs.get()); + ASSERT_TRUE(geodCRS != nullptr); + auto cs = + dynamic_cast<CartesianCS *>(geodCRS->coordinateSystem().get()); + ASSERT_EQ(cs->axisList().size(), 3U); + EXPECT_EQ(cs->axisList()[0]->unit().name(), "my unit"); + EXPECT_EQ(cs->axisList()[0]->unit().conversionToSI(), 2); + EXPECT_EQ(cs->axisList()[1]->unit().name(), "my unit"); + EXPECT_EQ(cs->axisList()[1]->unit().conversionToSI(), 2); + EXPECT_EQ(cs->axisList()[2]->unit().name(), "my unit"); + EXPECT_EQ(cs->axisList()[2]->unit().conversionToSI(), 2); + } + + { + auto crs = GeographicCRS::EPSG_4979->alterCSLinearUnit( + UnitOfMeasure("my unit", 2)); + auto geogCRS = dynamic_cast<GeographicCRS *>(crs.get()); + ASSERT_TRUE(geogCRS != nullptr); + auto cs = geogCRS->coordinateSystem(); + ASSERT_EQ(cs->axisList().size(), 3U); + EXPECT_NE(cs->axisList()[0]->unit().name(), "my unit"); + EXPECT_NE(cs->axisList()[0]->unit().conversionToSI(), 2); + EXPECT_NE(cs->axisList()[1]->unit().name(), "my unit"); + EXPECT_NE(cs->axisList()[1]->unit().conversionToSI(), 2); + EXPECT_EQ(cs->axisList()[2]->unit().name(), "my unit"); + EXPECT_EQ(cs->axisList()[2]->unit().conversionToSI(), 2); + } + + { + auto crs = + createVerticalCRS()->alterCSLinearUnit(UnitOfMeasure("my unit", 2)); + auto vertCRS = dynamic_cast<VerticalCRS *>(crs.get()); + ASSERT_TRUE(vertCRS != nullptr); + auto cs = vertCRS->coordinateSystem(); + ASSERT_EQ(cs->axisList().size(), 1U); + EXPECT_EQ(cs->axisList()[0]->unit().name(), "my unit"); + EXPECT_EQ(cs->axisList()[0]->unit().conversionToSI(), 2); + } + + { + // Not implemented on compoundCRS + auto crs = + createCompoundCRS()->alterCSLinearUnit(UnitOfMeasure("my unit", 2)); + EXPECT_TRUE(createCompoundCRS()->isEquivalentTo(crs.get())); + } +} + +// --------------------------------------------------------------------------- + +TEST(crs, alterParametersLinearUnit) { + { + auto crs = createProjected()->alterParametersLinearUnit( + UnitOfMeasure("my unit", 2), false); + auto wkt = + crs->exportToWKT(&WKTFormatter::create()->setMultiLine(false)); + EXPECT_TRUE(wkt.find("PARAMETER[\"Longitude of natural origin\",3") != + std::string::npos) + << wkt; + EXPECT_TRUE( + wkt.find( + "PARAMETER[\"False easting\",500000,UNIT[\"my unit\",2]") != + std::string::npos) + << wkt; + } + { + auto crs = createProjected()->alterParametersLinearUnit( + UnitOfMeasure("my unit", 2), true); + auto wkt = + crs->exportToWKT(&WKTFormatter::create()->setMultiLine(false)); + EXPECT_TRUE( + wkt.find( + "PARAMETER[\"False easting\",250000,UNIT[\"my unit\",2]") != + std::string::npos) + << wkt; + } +} |
