From 6da584d4134d15f8617e750651cf377b3f48a7b8 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 13 Sep 2019 02:58:35 +0200 Subject: cs2cs: autopromote CRS to 3D when there's a mix of 2D and 3D (fixes #1563) --- src/apps/cs2cs.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/apps/cs2cs.cpp') 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)); -- cgit v1.2.3