Re: scalar map choices with map projections and grids

Hi Stuart,

> Hi all, I have a model grid based on some projection, say LambertCC, and a
> base map.  Of course the base map values are lat,lon, as would be any obs
> etc, so I define a MapProjectionAdapter as a display side coord sys
> (snarfed from visad/examples and also from the idv code base), so I
> get scalarmaps for RealType.Latitude, Longitude to Display.YAxis and
> Display.XAxis.

If you have a display-side coord sys don't you use ScalarMaps of
RealType.Latitude, RealType.Longitude to your new DisplayRealTypes
rather than to XAxis, YAxis?

> Now, for my grid, I used to do this (assume projection has false
> easting/northing such that grid point 1,1 maps to 0 meters in x and y)
> addGrid( int rows, int cols, int spacing ) {
> RealType x = RealType.getRealType( "x" );
> same for y
> RealTypeTuple rtt = new RealTupleType( x, y );
> Linear2DSet domain = new Linear2DSet( rtt, 0, rows-1*spacing, 0,
> cols -1 * spacing, cols );
> ScalarMap sx = new ScalarMap( x, Display.XAxis );
> same for y, add maps sx, sy to display

Here you are ScalarMap'ping x, y to XAxis, YAxis and presumably
x, y are not equal to RealType.Latitude, RealType.Longitude,
which are also ScalarMap'ed to XAxis, YAxis?

> So data of type x,y use their own scalar maps to display axes,
> independently of any lat,lon typed data.
> Now, as I delve into visad more, and noting some comments by Bill, I see
> that I could do it this alternate way
> addGrid( int rows, cols, spacing ) {
> RealType x = RealType.getRealType( "x", CommonUnit.METER );
> same for y
> RealTupleType ref = new RealTupleType( x, y, mapProjection.getReference()
> );
> and build the domain as before (supplying coordsys units from the
> mapprojection).  No scalar maps for any x or y realType are needed.
> So, is there a "best way" of the two??  Seems to me that the latter is
> cleaner but more expensive?  For each grid point, we use the projection's
> coord sys to transform grid x,y -> lat, lon but then to map that value to
> the display side we have to go through the inverse?  If I had scalar maps
> straight from x and y I would avoid this (??)
> Performance looks about the same on initial testing, but not much to go as
> as yet...
> Any help and comments appreciated.

Assuming that:

1. what you're really doing is mapping lat, lon to your new
   DisplayRealTypes, with coord sys with reference XAxis, YAxis
2. your data-side coord sys is the inverse of your display-side
   coord sys
3. your maps of x, y to XAxis, YAxis avoid going through the
   coord sys and then its inverse

then this should be faster, but a bit more dangerous. For
example, you may want to make explicit calls to setRange()
for your ScalarMaps so auto-scaling doesn't mess this up.

Makes me wonder whether the IDV or other applications use
a similar trick to avoid coord sys transforms.

Good luck,