From 19e1b9b33f023500cfb4208ddd3f0379e65964d4 Mon Sep 17 00:00:00 2001 From: Frank Warmerdam Date: Mon, 31 Mar 2003 14:44:49 +0000 Subject: Changed so that if the inverted source location is outside the current grid then the first approximation of the correction is accepted. See comments inline about the change. This isn't really the "correct" solution. git-svn-id: http://svn.osgeo.org/metacrs/proj/trunk@1127 4e78687f-474d-0410-85f9-8d5e500ac6b2 --- src/nad_cvt.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'src') 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; -- cgit v1.2.3