aboutsummaryrefslogtreecommitdiff
path: root/src/apps/cs2cs.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-09-13 02:58:35 +0200
committerEven Rouault <even.rouault@spatialys.com>2019-09-13 02:58:35 +0200
commit6da584d4134d15f8617e750651cf377b3f48a7b8 (patch)
treea8c9dd2b8823ec407ee4f6ab8bba00314e3c6c16 /src/apps/cs2cs.cpp
parent1d1c7443fdd5425c878ccc75452561da73a8688a (diff)
downloadPROJ-6da584d4134d15f8617e750651cf377b3f48a7b8.tar.gz
PROJ-6da584d4134d15f8617e750651cf377b3f48a7b8.zip
cs2cs: autopromote CRS to 3D when there's a mix of 2D and 3D (fixes #1563)
Diffstat (limited to 'src/apps/cs2cs.cpp')
-rw-r--r--src/apps/cs2cs.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/apps/cs2cs.cpp b/src/apps/cs2cs.cpp
index 3099c3e8..ed885dc6 100644
--- a/src/apps/cs2cs.cpp
+++ b/src/apps/cs2cs.cpp
@@ -43,6 +43,7 @@
// PROJ include order is sensitive
// clang-format off
#include "proj.h"
+#include "proj_experimental.h"
#include "proj_internal.h"
#include "emess.h"
#include "utils.h"
@@ -591,12 +592,33 @@ int main(int argc, char **argv) {
}
srcIsGeog = true;
}
+ proj_destroy(src);
+ proj_destroy(dst);
+
+ src = proj_create(nullptr, pj_add_type_crs_if_needed(fromStr).c_str());
+ dst = proj_create(nullptr, pj_add_type_crs_if_needed(toStr).c_str());
+
+ if( proj_get_type(src) == PJ_TYPE_COMPOUND_CRS ||
+ proj_get_type(dst) == PJ_TYPE_COMPOUND_CRS ) {
+ auto src3D = proj_crs_promote_to_3D(nullptr, nullptr, src);
+ if( src3D ) {
+ proj_destroy(src);
+ src = src3D;
+ }
+
+ auto dst3D = proj_crs_promote_to_3D(nullptr, nullptr, dst);
+ if( dst3D ) {
+ proj_destroy(dst);
+ dst = dst3D;
+ }
+ }
+
+ transformation = proj_create_crs_to_crs_from_pj(nullptr, src, dst,
+ nullptr, nullptr);
proj_destroy(src);
proj_destroy(dst);
- transformation = proj_create_crs_to_crs(nullptr, fromStr.c_str(),
- toStr.c_str(), nullptr);
if (!transformation) {
emess(3, "cannot initialize transformation\ncause: %s",
pj_strerrno(pj_errno));