diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-09-13 02:58:35 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-09-13 02:58:35 +0200 |
| commit | 6da584d4134d15f8617e750651cf377b3f48a7b8 (patch) | |
| tree | a8c9dd2b8823ec407ee4f6ab8bba00314e3c6c16 /src/apps/cs2cs.cpp | |
| parent | 1d1c7443fdd5425c878ccc75452561da73a8688a (diff) | |
| download | PROJ-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.cpp | 26 |
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)); |
