aboutsummaryrefslogtreecommitdiff
path: root/src/4D_api.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-12-04 23:52:23 +0100
committerGitHub <noreply@github.com>2020-12-04 23:52:23 +0100
commitf3c51143b5b434829a841d93ae57b6583c2a2ff1 (patch)
tree906f9344db18f62cc2c3316555f75766c6ff1c92 /src/4D_api.cpp
parentfe2c5e04d5e395d01e8628361ac957f5a7e466bb (diff)
parent18ab7ef2e357e0c01464848a6911e754ebca471f (diff)
downloadPROJ-f3c51143b5b434829a841d93ae57b6583c2a2ff1.tar.gz
PROJ-f3c51143b5b434829a841d93ae57b6583c2a2ff1.zip
Merge pull request #2477 from rouault/fix_2442
cs2cs / proj_create_crs_to_crs_from_pj(): add a --authority switch to control where coordinate operations are looked for (fixes #2442)
Diffstat (limited to 'src/4D_api.cpp')
-rw-r--r--src/4D_api.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index 9231a7ed..d6eb901d 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -1260,8 +1260,20 @@ std::vector<CoordOperation> pj_create_prepared_operations(PJ_CONTEXT *ctx,
}
}
+// ---------------------------------------------------------------------------
+
+//! @cond Doxygen_Suppress
+static const char *getOptionValue(const char *option,
+ const char *keyWithEqual) noexcept {
+ if (ci_starts_with(option, keyWithEqual)) {
+ return option + strlen(keyWithEqual);
+ }
+ return nullptr;
+}
+//! @endcond
+
/*****************************************************************************/
-PJ *proj_create_crs_to_crs_from_pj (PJ_CONTEXT *ctx, const PJ *source_crs, const PJ *target_crs, PJ_AREA *area, const char* const *) {
+PJ *proj_create_crs_to_crs_from_pj (PJ_CONTEXT *ctx, const PJ *source_crs, const PJ *target_crs, PJ_AREA *area, const char* const * options) {
/******************************************************************************
Create a transformation pipeline between two known coordinate reference
systems.
@@ -1273,7 +1285,20 @@ PJ *proj_create_crs_to_crs_from_pj (PJ_CONTEXT *ctx, const PJ *source_crs, cons
ctx = pj_get_default_ctx();
}
- auto operation_ctx = proj_create_operation_factory_context(ctx, nullptr);
+ const char* authority = nullptr;
+ for (auto iter = options; iter && iter[0]; ++iter) {
+ const char *value;
+ if ((value = getOptionValue(*iter, "AUTHORITY="))) {
+ authority = value;
+ } else {
+ std::string msg("Unknown option :");
+ msg += *iter;
+ ctx->logger(ctx->logger_app_data, PJ_LOG_ERROR, msg.c_str());
+ return nullptr;
+ }
+ }
+
+ auto operation_ctx = proj_create_operation_factory_context(ctx, authority);
if( !operation_ctx ) {
return nullptr;
}