//
// RadarDisplay.java
//

/*
This sofware is part of the Australian Integrated Forecast System (AIFS)
Copyright (C) 2017 Bureau of Meteorology
*/

package visad.bom;

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.rmi.RemoteException;

import javax.swing.JFrame;

import visad.ConstantMap;
import visad.DataReference;
import visad.DataReferenceImpl;
import visad.Display;
import visad.FlatField;
import visad.FunctionType;
import visad.GraphicsModeControl;
import visad.RealType;
import visad.ScalarMap;
import visad.VisADException;
import visad.data.mcidas.BaseMapAdapter;
import visad.java3d.DisplayImplJ3D;
import visad.util.LabeledColorWidget;

/**
 * RadarDisplay
 * 
 * @author - James Kelly : J.Kelly@bom.gov.au based on RadarAdapter.java,
 *         largely written by Bill Hibbard
 * 
 * 
 */

public class RadarDisplay {

	/*
     * Set the color map.
     */
    private static void
    setColorMap(ScalarMap colorMap, float min, float max)
			throws VisADException, RemoteException
    {

            float[][] table = new float[3][256];
            for (int i=0; i<256; i++) {
                    if (i <= 15)
                    {
                        table[0][i] = 0.0f;
                        table[1][i] = 0.0f;
                        table[2][i] = 0.0f;
										}
                    else if (i > 15 && i <= 31)
                    {
                        table[0][i] = 0.0f;
                        table[1][i] = 240.0f/255.0f;
                        table[2][i] = 240.0f/255.0f;
                    }
                    else if (i > 31 && i <= 47)
										{
                       table[0][i] = 0.0f;
                        table[1][i] = 144.0f/255.0f;
                        table[2][i] = 144.0f/255.0f;
                    }
                    else if (i > 47 && i <= 63)
                    {
                        table[0][i] = 128.0f/255.0f;
												table[1][i] = 224.0f/255.0f;
                        table[2][i] = 80.0f/255.0f;
                    }
                    else if (i > 63 && i <= 79)
                    {
                        table[0][i] = 100.0f/255.0f;
                        table[1][i] = 184.0f/255.0f;
                        table[2][i] = 64.0f/255.0f;
                    }
                    else if (i > 79 && i <= 95)
                    {
                        table[0][i] = 72.0f/255.0f;
                        table[1][i] = 144.0f/255.0f;
                        table[2][i] = 48.0f/255.0f;
                    }
                    else if (i > 95 && i <= 111)
                    {
                        table[0][i] = 44.0f/255.0f;
                        table[1][i] = 104.0f/255.0f;
                        table[2][i] = 32.0f/255.0f;
                    }
                    else if (i > 111 && i <= 127)
                    {
                        table[0][i] = 16.0f/255.0f;
                        table[1][i] = 64.0f/255.0f;
                        table[2][i] = 16.0f/255.0f;
                    }
                    else if (i > 127 && i <= 143)
                    {
                        table[0][i] = 240.0f/255.0f;
                        table[1][i] = 192.0f/255.0f;
                        table[2][i] = 16.0f/255.0f;
                    }
                    else if (i > 143 && i <= 159)
                    {
                        table[0][i] = 240.0f/255.0f;
                        table[1][i] = 128.0f/255.0f;
                        table[2][i] = 32.0f/255.0f;
                    }
                    else if (i > 159 && i <= 175)
                    {
                        table[0][i] = 240.0f/255.0f;
                        table[1][i] = 16.0f/255.0f;
                        table[2][i] = 32.0f/255.0f;
                    }
                    else if (i > 175 && i <= 191)
                    {
                        table[0][i] = 144.0f/255.0f;
                        table[1][i] = 0.0f/255.0f;
                        table[2][i] = 0.0f/255.0f;
                    }
                    else if (i > 191 && i <= 207)
                    {
                        table[0][i] = 176.0f/255.0f;
                        table[1][i] = 32.0f/255.0f;
                        table[2][i] = 128.0f/255.0f;
                    }
                    else if (i > 207 && i <= 223)
                    {
                        table[0][i] = 202.0f/255.0f;
                        table[1][i] = 64.0f/255.0f;
                        table[2][i] = 160.0f/255.0f;
                    }
                    else if (i > 223 && i <= 239)
                    {
                        table[0][i] = 255.0f/255.0f;
                        table[1][i] = 255.0f/255.0f;
                        table[2][i] = 255.0f/255.0f;
                    }
                    else if (i > 239 && i <= 255)
                    {
                        table[0][i] = 255.0f/255.0f;
                        table[1][i] = 128.0f/255.0f;
                        table[2][i] = 224.0f/255.0f;
                    }

            }
      LabeledColorWidget lw =
	  	new LabeledColorWidget(colorMap, table);

      Frame frame = new Frame("VisAD Color Widget");
      frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {System.exit(0);}
      });
      frame.add(lw);
      frame.setSize(lw.getPreferredSize());
      frame.setVisible(true);
    }

		private static void mapDisplay(DisplayImplJ3D d, String mapFile)
		{
		BaseMapAdapter baseMap;

		try {
			baseMap = new BaseMapAdapter(mapFile);
		  // lat_map = new ScalarMap(RealType.Latitude, Display.YAxis);
      // lon_map = new ScalarMap(RealType.Longitude, Display.XAxis);

	    DataReference maplines_ref = new DataReferenceImpl("MapLines");
      maplines_ref.setData(baseMap.getData());

      ConstantMap[] colMap;
      colMap = new ConstantMap[4];
      colMap[0] = new ConstantMap(1., Display.Green);
      colMap[1] = new ConstantMap(1., Display.Red);
      colMap[2] = new ConstantMap(0., Display.Blue);
      colMap[3] = new ConstantMap(-0.99, Display.ZAxis);
	    d.addReference(maplines_ref, colMap);

		} catch (Exception ne) {ne.printStackTrace(); System.exit(1); }
   	}

  public static void main(String[] args) throws VisADException, RemoteException {
		// Adelaide Airport: location of example radar data file radar.dat
	  float centlat = -34.9581f;
	  float centlon = 138.5342f;
		float radius = 6.0f; // degrees
    String radarSource = "radar.dat";
    RadarAdapter ra = null;
    boolean d3d = (args.length > 0);
    try {
        ra = new RadarAdapter(centlat, centlon, 0.0f, radarSource, d3d);
    } catch (Exception e) {
      System.err.println("Caught Exception for \"" + radarSource + "\": " +
                           e);
      System.exit(1);
    }

    FlatField radar = ra.getData();

/* WLH
DumpType.dumpDataType(radar, System.out);
VisAD Data analysis
    FlatField of length = 54000
    ((range, azimuth) -> reflection)
      Domain has 2 components:
        Integer2DSet: Length = 54000
          0. Integer1DSet (range) Range = 0 to 149
          1. Integer1DSet (azimuth) Range = 0 to 359
      Range has 1 components:
        0. FloatSet (reflection) Dimension = 1
        0. number missing = 0
*/

    FunctionType radar_image = (FunctionType) radar.getType();
    RealType reflection = (RealType) radar_image.getRange();

    DisplayImplJ3D display = new DisplayImplJ3D("radar");
    ScalarMap lonmap = new ScalarMap(RealType.Longitude, Display.XAxis);
		// centre lon 140
    lonmap.setRange(centlon - radius, centlon + radius);
    display.addMap(lonmap);
    ScalarMap latmap = new ScalarMap(RealType.Latitude, Display.YAxis);
    display.addMap(latmap);
		// centre lat -32
    latmap.setRange(centlat - radius, centlat + radius);
    if (d3d) {
      ScalarMap altitudemap = new ScalarMap(RealType.Altitude, Display.ZAxis);
      altitudemap.setRange(0, 30000);
      display.addMap(altitudemap);
    }
    else {
      ScalarMap reflectionmap = new ScalarMap(reflection, Display.ZAxis);
      reflectionmap.setRange(0.f, 6.f);
      display.addMap(reflectionmap);
    }
    ScalarMap rgbMap = new ScalarMap(reflection, Display.RGB);

	  display.addMap(rgbMap);
		setColorMap(rgbMap, 0.f, 6.f);
		mapDisplay(display, "OUTLAUST");

    GraphicsModeControl mode = display.getGraphicsModeControl();
    mode.setScaleEnable(true);
    // mode.setTextureEnable(false); WLH - 21 Sept 99

    DataReference ref = new DataReferenceImpl("radar_ref");
    ref.setData(radar);
    display.addReference(ref);

    JFrame frame = new JFrame("VisAD BOM radar image");
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {System.exit(0);}
    });

    frame.getContentPane().add(display.getComponent());
    int WIDTH = 500;
    int HEIGHT = 600;

    frame.setSize(WIDTH, HEIGHT);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setLocation(screenSize.width/2 - WIDTH/2,
                      screenSize.height/2 - HEIGHT/2);
    frame.setVisible(true);

  }
}


 

Ads help maintain this website.