aboutsummaryrefslogtreecommitdiff
path: root/src/pj_apply_gridshift.c
diff options
context:
space:
mode:
authorFrank Warmerdam <warmerdam@pobox.com>2012-02-01 23:03:34 +0000
committerFrank Warmerdam <warmerdam@pobox.com>2012-02-01 23:03:34 +0000
commitfaffa62c5414cf9d97e3d7d889ffa60657135129 (patch)
treea9e8416d60d9ad73af1ca36bd70d2d5784302d47 /src/pj_apply_gridshift.c
parentdde549f375520ca0a752cb4699ebc1791746d286 (diff)
downloadPROJ-faffa62c5414cf9d97e3d7d889ffa60657135129.tar.gz
PROJ-faffa62c5414cf9d97e3d7d889ffa60657135129.zip
ensure pj_apply_gridshift() supports points up to epsilon outside mesh (#141)
git-svn-id: http://svn.osgeo.org/metacrs/proj/trunk@2152 4e78687f-474d-0410-85f9-8d5e500ac6b2
Diffstat (limited to 'src/pj_apply_gridshift.c')
-rw-r--r--src/pj_apply_gridshift.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/pj_apply_gridshift.c b/src/pj_apply_gridshift.c
index 16f59767..366026db 100644
--- a/src/pj_apply_gridshift.c
+++ b/src/pj_apply_gridshift.c
@@ -140,11 +140,15 @@ int pj_apply_gridshift_3( projCtx ctx, PJ_GRIDINFO **tables, int grid_count,
{
PJ_GRIDINFO *gi = tables[itable];
struct CTABLE *ct = gi->ct;
+ double epsilon = (fabs(ct->del.phi)+fabs(ct->del.lam))/10000.0;
/* skip tables that don't match our point at all. */
- if( ct->ll.phi > input.phi || ct->ll.lam > input.lam
- || ct->ll.phi + (ct->lim.phi-1) * ct->del.phi < input.phi
- || ct->ll.lam + (ct->lim.lam-1) * ct->del.lam < input.lam )
+ if( ct->ll.phi - epsilon > input.phi
+ || ct->ll.lam - epsilon > input.lam
+ || (ct->ll.phi + (ct->lim.phi-1) * ct->del.phi + epsilon
+ < input.phi)
+ || (ct->ll.lam + (ct->lim.lam-1) * ct->del.lam + epsilon
+ < input.lam) )
continue;
/* If we have child nodes, check to see if any of them apply. */
@@ -155,10 +159,15 @@ int pj_apply_gridshift_3( projCtx ctx, PJ_GRIDINFO **tables, int grid_count,
for( child = gi->child; child != NULL; child = child->next )
{
struct CTABLE *ct1 = child->ct;
-
- if( ct1->ll.phi > input.phi || ct1->ll.lam > input.lam
- || ct1->ll.phi+(ct1->lim.phi-1)*ct1->del.phi < input.phi
- || ct1->ll.lam+(ct1->lim.lam-1)*ct1->del.lam < input.lam)
+ double epsilon =
+ (fabs(ct1->del.phi)+fabs(ct1->del.lam))/10000.0;
+
+ if( ct1->ll.phi - epsilon > input.phi
+ || ct1->ll.lam - epsilon > input.lam
+ || (ct1->ll.phi+(ct1->lim.phi-1)*ct1->del.phi + epsilon
+ < input.phi)
+ || (ct1->ll.lam+(ct1->lim.lam-1)*ct1->del.lam + epsilon
+ < input.lam) )
continue;
break;