aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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;