Hi Folks,
I am trying to display McIdas map outlines within a 3D bounding box
using VisAD and the BaseMapAdapter class. I am running into
difficulties when I try to select a longitude range that extends beyond
+/-180 degrees (for example, a map outline over the Pacific Ocean
between -240 and -60 degrees longitude).
I can successfully select this range and display the desired map
outlines using the ScalarMap setRange methods. However, this results
in a display with the correct map outlines within the 3D bounding box,
but the rest of the entire world map also extends outside the 3D
bounding box.
I then added code to generate a rangeControl so that the map outlines
outside of the bounding box would be eliminated. However, when this
code is added, the map outlines that extend beyond +/-180 degrees
longitude no longer display inside the 3D bounding box. This approach
works fine as long as I stay withing +/-180 degrees longitude, but, if
I want a map outline over the Pacific Ocean, for example, I am unable
to display the outlines beyond -180 degrees longitude.
I am appending some sample code that demonstrates this problem.
Any suggestions for a way around this or a better approach to take for
displaying map outlines?
Thanks!
Tim Scheitlin
National Center For Atmospheric Research
scheitln@xxxxxxxx
/* 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 ConstantMap[] maplinesConstantMap = new ConstantMap[4];
public static DisplayImplJ3D display;
public MapTest(String mapFile)
{
try
{
// Read in the map file
BaseMapAdapter baseMapAdapter;
baseMapAdapter = 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");
maplinesRef.setData(baseMapAdapter.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);
}
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("../OUTLSUPW");
JFrame jframe = new JFrame();
jframe.setContentPane( (JPanel) display.getComponent() );
jframe.setSize(400,400);
jframe.setVisible(true);
}
}