From 94210f99b79b486c39a18a450f89ea2faffd361c Mon Sep 17 00:00:00 2001 From: Kristian Evers Date: Wed, 12 Jul 2017 14:07:31 +0200 Subject: Added proj_has_inverse(). Fixes #155. --- src/PJ_cart.c | 17 +++++++++++++++++ src/pj_obs_api.c | 4 ++++ src/proj.def | 3 ++- src/proj.h | 5 +++++ 4 files changed, 28 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/PJ_cart.c b/src/PJ_cart.c index c6d1dd74..1109b01b 100644 --- a/src/PJ_cart.c +++ b/src/PJ_cart.c @@ -473,6 +473,23 @@ int pj_cart_selftest (void) { proj_destroy(P); return 52; } + proj_destroy(P); + + /* Test proj_has_inverse() */ + P = proj_create(0, "+proj=august"); /* august has no inverse */ + if (proj_has_inverse(P)) { + proj_destroy(P); + return 60; + } + proj_destroy(P); + + P = proj_create(0, "+proj=merc"); /* merc has an inverse */ + if (!proj_has_inverse(P)) { + proj_destroy(P); + return 61; + } + proj_destroy(P); + return 0; } diff --git a/src/pj_obs_api.c b/src/pj_obs_api.c index 81a6e337..4fac1dac 100644 --- a/src/pj_obs_api.c +++ b/src/pj_obs_api.c @@ -525,3 +525,7 @@ void *proj_release (void *buffer) { double proj_torad (double angle_in_degrees) { return PJ_TORAD (angle_in_degrees);} double proj_todeg (double angle_in_radians) { return PJ_TODEG (angle_in_radians);} + +int proj_has_inverse(PJ *P) { + return (P->inv != 0 || P->inv3d != 0 || P->invobs != 0); +} diff --git a/src/proj.def b/src/proj.def index a61151ed..abb17765 100644 --- a/src/proj.def +++ b/src/proj.def @@ -132,5 +132,6 @@ EXPORTS proj_release @122 proj_torad @123 proj_todeg @124 + proj_has_inverse @125 - pj_find_file @125 + pj_find_file @126 diff --git a/src/proj.h b/src/proj.h index f94fb384..c0b8b7cc 100644 --- a/src/proj.h +++ b/src/proj.h @@ -337,6 +337,7 @@ void proj_errno_set (PJ *P, int err); int proj_errno_reset (PJ *P); void proj_errno_restore (PJ *P, int err); + /* Build a fully expanded proj_create() compatible representation of P */ char *proj_definition_retrieve (PJ *P); /* ...and get rid of it safely */ @@ -349,6 +350,10 @@ void *proj_release (void *buffer); double proj_torad (double angle_in_degrees); double proj_todeg (double angle_in_radians); +/* Check if a projection has an inverse mapping */ +int proj_has_inverse(PJ *P); + + #ifdef __cplusplus } #endif -- cgit v1.2.3