diff options
Diffstat (limited to 'src/3rdparty/proj/pj_inv.c')
-rw-r--r-- | src/3rdparty/proj/pj_inv.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/3rdparty/proj/pj_inv.c b/src/3rdparty/proj/pj_inv.c new file mode 100644 index 00000000..ee2b44f8 --- /dev/null +++ b/src/3rdparty/proj/pj_inv.c @@ -0,0 +1,29 @@ +/* general inverse projection */ +#define PJ_LIB__ +#include <projects.h> +#include <errno.h> +# define EPS 1.0e-12 + LP /* inverse projection entry */ +pj_inv(XY xy, PJ *P) { + LP lp; + + /* can't do as much preliminary checking as with forward */ + if (xy.x == HUGE_VAL || xy.y == HUGE_VAL) { + lp.lam = lp.phi = HUGE_VAL; + pj_errno = -15; + } + errno = pj_errno = 0; + xy.x = (xy.x * P->to_meter - P->x0) * P->ra; /* descale and de-offset */ + xy.y = (xy.y * P->to_meter - P->y0) * P->ra; + lp = (*P->inv)(xy, P); /* inverse project */ + if (pj_errno || (pj_errno = errno)) + lp.lam = lp.phi = HUGE_VAL; + else { + lp.lam += P->lam0; /* reduce from del lp.lam */ + if (!P->over) + lp.lam = adjlon(lp.lam); /* adjust longitude to CM */ + if (P->geoc && fabs(fabs(lp.phi)-HALFPI) > EPS) + lp.phi = atan(P->one_es * tan(lp.phi)); + } + return lp; +} |