aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/proj/coordinateoperation.hpp3
-rw-r--r--include/proj/coordinatesystem.hpp29
-rw-r--r--include/proj/crs.hpp11
-rwxr-xr-xscripts/create_c_api_projections.py55
-rw-r--r--src/c_api.cpp3184
-rw-r--r--src/coordinateoperation.cpp52
-rw-r--r--src/coordinatesystem.cpp97
-rw-r--r--src/crs.cpp117
-rw-r--r--src/proj.h1024
-rw-r--r--src/proj_symbol_rename.h1
-rw-r--r--test/unit/test_c_api.cpp656
-rw-r--r--test/unit/test_crs.cpp133
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 &paramValue = 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();
diff --git a/src/proj.h b/src/proj.h
index 711f8f66..3f44afb9 100644
--- a/src/proj.h
+++ b/src/proj.h
@@ -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, &param);
+ 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;
+ }
+}