aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Warmerdam <warmerdam@pobox.com>2003-03-31 14:44:49 +0000
committerFrank Warmerdam <warmerdam@pobox.com>2003-03-31 14:44:49 +0000
commit19e1b9b33f023500cfb4208ddd3f0379e65964d4 (patch)
tree4ec99b531e5652b558695102dd3b15da5d77d8a8
parent75090c987468e8f0edef9b2cc3fdb34928685f74 (diff)
downloadPROJ-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
-rw-r--r--src/nad_cvt.c28
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;