diff options
| author | Frank Warmerdam <warmerdam@pobox.com> | 2003-03-31 14:44:49 +0000 |
|---|---|---|
| committer | Frank Warmerdam <warmerdam@pobox.com> | 2003-03-31 14:44:49 +0000 |
| commit | 19e1b9b33f023500cfb4208ddd3f0379e65964d4 (patch) | |
| tree | 4ec99b531e5652b558695102dd3b15da5d77d8a8 /src | |
| parent | 75090c987468e8f0edef9b2cc3fdb34928685f74 (diff) | |
| download | PROJ-19e1b9b33f023500cfb4208ddd3f0379e65964d4.tar.gz PROJ-19e1b9b33f023500cfb4208ddd3f0379e65964d4.zip | |
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
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; |
