Re: rangeControl with McIdas Map outlines

Hi Tim,

The RangeControl isn't working because the longitude values
in your map lie in the range (-180, +180), and the RangeControl
narrows this to (-180, -60).  With no RangeControl, VisAD's
smart longitude display logic wraps the values in (+120, +180)
to (-240, -180).  One work around is to take the values out
of the UnionSet return by BaseMapAdapter.getData(), wrap the
longitudes from (-180, +180) to (-240, +120), use them to
construct a new UnionSet, and display it.  Another approach
is to BaseMapAdapter's capability to select ranges, and
return your (-240, -60) range as the disjoint union of
ranges (+120, +180) and (-180, -60).  This is actually
pretty easy, and I've attached a modified version of your
MapTest.java.

Cheers,
Bill
----------------------------------------------------------
Bill Hibbard, SSEC, 1225 W. Dayton St., Madison, WI  53706
hibbard@xxxxxxxxxxxxxxxxx  608-263-4427  fax: 608-263-6738
http://www.ssec.wisc.edu/~billh/vis.html
/* CCLI MapTest Class */

/* 
   This class is responsible for reading a McIdas Map database and
   drawing a map.
*/

// Import needed classes

import visad.*;
import java.rmi.RemoteException;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.*;
import visad.ColorControl;
import visad.CoordinateSystem;
import visad.ConstantMap;
import visad.Data;
import visad.DataReference;
import visad.DataReferenceImpl;
import visad.Display;
import visad.DisplayImpl;
import visad.RealTupleType;
import visad.RealType;
import visad.ScalarMap;
import visad.data.mcidas.BaseMapAdapter;
import visad.java3d.DisplayImplJ3D;
import visad.RangeControl;

public class MapTest
{
   public static ScalarMap latMap;     // latitude  -> YAxis
   public static ScalarMap lonMap;     // longitude -> XAxis
   public static ScalarMap lonRangeMap;
   public static ScalarMap latRangeMap;
   public static DataReference maplinesRef;
   public static DataReference maplinesRef2;
   public static ConstantMap[] maplinesConstantMap = new ConstantMap[4];
   public static DisplayImplJ3D display;


    public MapTest(String mapFile)
    {
        try
        {
            //  Read in the map file
            BaseMapAdapter baseMapAdapter = new BaseMapAdapter(mapFile);
            BaseMapAdapter baseMapAdapter2 = new BaseMapAdapter(mapFile);

            // Set ScalarMaps for X and Y axes
            latMap = new ScalarMap(RealType.Latitude, Display.YAxis);
            lonMap = new ScalarMap(RealType.Longitude, Display.XAxis);

            // Remove any prior data references
            display.removeAllReferences();

            // Add the lat/lon maps
            display.addMap(latMap);
            display.addMap(lonMap);

            // Set the lat/lon range within the 3D bounding box
            latMap.setRange(-30.0, 30.0);
            lonMap.setRange(-240.0, -60.0);

// In this next code section I am trying to create a RangeControl so that
// only the desired world map outlines between longitude -240 to -60 and 
// latitude -30 to 30 are displayed in the 3D bounding box.
// However, when this code is added, the map outlines between -240 and -180
// degrees Longitude do not display.  If the code is commented out, as below,
// all the correct map outlines appear within the 3D bounding box.  However,
// the rest of the world map also appears outside of the bounding box.
// How do I get all the desired map outlines within the 3D bounding box 
// without having the rest of the world map appear outside the bounding box?
/*
      lonRangeMap = new ScalarMap(RealType.Longitude,Display.SelectRange);
      display.addMap(lonRangeMap);
      RangeControl lonRangeControl = (RangeControl) lonRangeMap.getControl();
      latRangeMap = new ScalarMap(RealType.Latitude,Display.SelectRange);
      display.addMap(latRangeMap);
      RangeControl latRangeControl = (RangeControl) latRangeMap.getControl();
      float[] nlonRange = { -240.0f, -60.0f };
      float[] nlatRange = { -30.0f, 30.0f };
      lonRangeControl.setRange ( nlonRange );
      latRangeControl.setRange ( nlatRange );
*/
            // create a reference for the map lines
            maplinesRef = new DataReferenceImpl("MapTest");
            baseMapAdapter.setLatLonLimits(-30.0f, 30.0f, -180.0f, -60.0f);
            maplinesRef.setData(baseMapAdapter.getData());
            maplinesRef2 = new DataReferenceImpl("MapTest2");
            baseMapAdapter2.setLatLonLimits(-30.0f, 30.0f, 120.0f, 180.0f);
            maplinesRef2.setData(baseMapAdapter2.getData());

            // set the attributes of the map lines (color, location)
            maplinesConstantMap[0] = new ConstantMap(0., Display.Blue);
            maplinesConstantMap[1] = new ConstantMap(1., Display.Red);
            maplinesConstantMap[2] = new ConstantMap(0., Display.Green);
            maplinesConstantMap[3] = new ConstantMap(1.001, Display.Radius); 
            display.addReference (maplinesRef, maplinesConstantMap);
            display.addReference (maplinesRef2, maplinesConstantMap);
        }
        catch (Exception ne)
        {
            ne.printStackTrace(); System.exit(1);
        }

    }

  public static void main(String[] args)
        throws RemoteException, VisADException
  {

    display = new DisplayImplJ3D("display1");
    MapTest mapLines = new MapTest("../examples/OUTLSUPW");
    JFrame jframe = new JFrame();
    jframe.setContentPane( (JPanel) display.getComponent() );
    jframe.setSize(400,400);
    jframe.setVisible(true);
    
  }

}