NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hi, we are working on a DTM (Digital Terrain Model) using Java and VisAD. Our data set consists of X x Y height values, including missing values, which we have set to -9999. We want to draw the surface as a continuous one (that is, no individual points), and have set the missing data values to NaN. But that plots the surface as points, whereas we want the programm to draw lines between them (thus creatoing a continuous surface). We had set value of missing data to 0, but that obviously generates a undesirable surface at height=0, which get conected to the actual DTM, at higher heights. How can we "delete" this surface, so that we only plot the surface, and that the missing data doesn't get plotted (or gets plotted in black)? I have tried to set the missing data to NaN and "force" the plotting in line mode (that is, with setPointMode(false)) Here is our code: import visad.*; import visad.java3d.DisplayImplJ3D; import visad.util.VisADSlider; import visad.data.netcdf.Plain; import java.rmi.RemoteException; import java.io.IOException; import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class tv { public static void main(String args[]) throws VisADException, RemoteException, IOException { ArcGridReader dgm = new ArcGridReader(args[0]); // Reads dimensions of raster int LengthX = dgm.getRasterSize().width; int LengthY = dgm.getRasterSize().height; double missing = dgm.getMissingValue(); double min = dgm.getMinimum(); RealType x_axis = new RealType( "X-Axis", SI.meter, null ); RealType y_axis = new RealType( "Y-Axis", SI.meter, null ); MathType Domain = (MathType) new RealTupleType( x_axis, y_axis ); RealType rangeElev = new RealType( "Elevation", SI.meter, null ); RealType rangeTemp = new RealType( "Temperature", SI.kelvin, null ); Set domainSet = (Set) new Linear2DSet( Domain, 0.d, 1000.d, LengthX, 0.d, 1000.d, LengthY ); RealType[] types2 = { rangeElev, rangeTemp }; RealTupleType overl = new RealTupleType(types2); FunctionType overfunc = new FunctionType(Domain, overl); FlatField ff = new FlatField( overfunc, domainSet ); double[][] samples = new double[2][LengthX*LengthY]; int index = 0; double wave_number = 2; double PI = Math.PI; for ( int ii = 0; ii < LengthY; ii++ ) { for ( int jj = 0; jj < LengthX; jj++ ) { // this is the DEM data double val = (double ) dgm.getFPDataAt(jj,ii); // if we do (val==missing) NaN : val-min; // we get points only plotted samples[0][index] = (val == missing) ? 0 : val-min; // the layer for coloring the dem - a sine function overlay double v = (50)*Math.sin( ((wave_number*2d*PI)/1000)*5*jj )* Math.sin( ((wave_number*2*PI)/1000)*5*ii ); samples[1][index] = v; index++; } } ff.setSamples( samples ); DisplayImpl display1 = new DisplayImplJ3D("display1"); display1.addMap( new ScalarMap( (RealType) x_axis, Display.XAxis )); display1.addMap( new ScalarMap( (RealType) y_axis, Display.YAxis )); display1.addMap( new ScalarMap( (RealType) rangeElev, Display.ZAxis)); display1.addMap( new ScalarMap( (RealType) rangeTemp, Display.Red)); display1.addMap( new ConstantMap( 0.5, Display.Green)); display1.addMap( new ConstantMap( 0.5, Display.Blue)); GraphicsModeControl mode = display1.getGraphicsModeControl(); mode.setScaleEnable(true); JFrame jframe = new JFrame("Test"); jframe.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); DataReferenceImpl ref_imaget1 = new DataReferenceImpl("ref_imaget1"); ref_imaget1.setData( ff ); display1.addReference( ref_imaget1, null); JPanel big_panel = new JPanel(new BorderLayout()); big_panel.add(display1.getComponent()); jframe.setContentPane(big_panel); jframe.setSize(600, 600); jframe.setVisible(true); } } Help on our little problem is appreciated, and overall sugestions too! Thanks, Ugo
visad
archives: