[GRASS5] problems with [rsv].proj
Glynn Clements
glynn.clements at virgin.net
Thu May 30 00:39:58 EDT 2002
Glynn Clements wrote:
> > > When computing the region of interest, cells which fail to project
> > > should just be ignored. When performing the actual projection, cells
> > > which fail to project should be NULL.
> >
> > Should be fairly easy to fix: Find the places in the code where
> > [src].proj exits with 'Error in do_proj' and change action according to
> > above.
> >
> > (I don't have a GRASS installation to work with right now, but maybe
> > someone else is willing to take on this task)
>
> OK.
OK, done.
> > The way r.proj works (omitting here the initial testing/trimming
> > done in bordwalk.c) is:
> >
> > For each cell in the destination region
> > -project the cell center into source map
> > -find the category value of the nearest cell
> > (alternatively using cubic etc interpolation)
> > -assign that value to the cell in the destination region
> >
> > For a pseudo-cylindrical destination there will a number of cells outside
> > the ellipse that should become NULL. (The real 'borders' in this case is
> > actually the ellipse, not the window borders given in DEFAULT_WIND).
> > Projecting a co-ordinate outside the ellipse should result in proj
> > returning * (inf?) for either lon or lat or both.
>
> That clearly isn't the case. If it were, the cells outside of the
> ellipse would be garbage, but they are actually "repeats" of the data
> inside the ellipse (albeit more distorted), which seems to suggest
> periodicity.
>
> In this test case (Wagner I), the repeat happens in both latitude and
> longitude, but the latitudinal repeat is a mirror image in both
> directions (i.e. 180° rotation).
>
> Anyway, I'll look into it further.
Done. The following patch produces the "desired" result (i.e. the way
that pseudo-cylindrical world maps normally look in illustrations),
but is it the right thing to do?
diff -u -r1.2 PJ_urmfps.c
--- src/libes/proj/PJ_urmfps.c 20 Apr 2002 19:13:44 -0000 1.2
+++ src/libes/proj/PJ_urmfps.c 30 May 2002 04:30:08 -0000
@@ -17,8 +17,12 @@
}
INVERSE(s_inverse); /* sphere */
xy.y /= P->C_y;
+ if (fabs(xy.y) > HALFPI)
+ I_ERROR
lp.phi = aasin(sin(xy.y) / P->n);
lp.lam = xy.x / (C_x * cos(xy.y));
+ if (fabs(lp.lam) > PI)
+ I_ERROR
return (lp);
}
FREEUP; if (P) pj_dalloc(P); }
If it is, instinct suggests that the same issue will apply to many
(most?) of the projections, not just Wagner I.
Also, I had to disable the remaining call to bordwalk() in r.proj,
otherwise it cropped the result. Realistically, I think that we need a
flag to allow the bordwalk() call(s) to be disabled for the cases
where they don't work correctly.
In the longer term, we should re-think the architecture of the PROJ
library. There are many practical applications where it would be
useful to have more information about the overall "nature" of a
projection than just a pair of functions which project individual
points.
--
Glynn Clements <glynn.clements at virgin.net>
More information about the grass-dev
mailing list