diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nad_cvt.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/nad_cvt.c b/src/nad_cvt.c index 600ea3cd..f6519e7e 100644 --- a/src/nad_cvt.c +++ b/src/nad_cvt.c @@ -27,13 +27,35 @@ nad_cvt(LP in, int inverse, struct CTABLE *ct) { do { del = nad_intr(t, ct); - if (del.lam == HUGE_VAL) return del; + + /* This case used to return failure, but I have + changed it to return the first order approximation + of the inverse shift. This avoids cases where the + grid shift *into* this grid came from another grid. + While we aren't returning optimally correct results + I feel a close result in this case is better than + no result. NFW + To demonstrate use -112.5839956 49.4914451 against + the NTv2 grid shift file from Canada. */ + if (del.lam == HUGE_VAL) + { + if( getenv( "PROJ_DEBUG" ) != NULL ) + fprintf( stderr, + "Inverse grid shift iteration failed, presumably at grid edge.\n" + "Using first approximation.\n" ); + /* return del */; + break; + } + t.lam -= dif.lam = t.lam - del.lam - tb.lam; t.phi -= dif.phi = t.phi + del.phi - tb.phi; } while (i-- && fabs(dif.lam) > TOL && fabs(dif.phi) > TOL); if (i < 0) { - t.lam = t.phi = HUGE_VAL; - return t; + if( getenv( "PROJ_DEBUG" ) != NULL ) + fprintf( stderr, + "Inverse grid shift iterator failed to converge.\n" ); + t.lam = t.phi = HUGE_VAL; + return t; } in.lam = adjlon(t.lam + ct->ll.lam); in.phi = t.phi + ct->ll.phi; |
