import ucar.ma2.Array;
import ucar.ma2.ArrayFloat;
import ucar.nc2.Dimension;
import ucar.nc2.dataset.CoordinateAxis;
import ucar.nc2.dataset.CoordinateAxis1DTime;
import ucar.nc2.dt.GridCoordSystem;
import ucar.nc2.dt.grid.GridDataset;
import ucar.nc2.dt.grid.GeoGrid;
import ucar.nc2.time.CalendarDate;

import java.io.IOException;
import java.util.List;

/**
 * An example of how to read in and loop through the entire
 * contents of a grid. 
 */
public class ReadEntireGrid {

    public static void main (String[] args) {
        String inputFile = "data/max_min_rain70.nc";

        try (GridDataset gds = GridDataset.open(inputFile)) {
            GeoGrid grid = gds.findGridByName("temp");
            GridCoordSystem gcs = grid.getCoordinateSystem();

            // read in lat, lon, height, and time values
            Array longitude = gcs.getXHorizAxis().read();
            Array latitude = gcs.getYHorizAxis().read();
            Array height = gcs.getVerticalAxis().read();
            List<CalendarDate> time = gcs.getCalendarDates();

            // loop over each time, height, lat, lon
            for (int t = 0; t < time.size(); t ++) {
                String timeVal = time.get(t).toString();
                for (int h = 0; h < height.getSize(); h++) {
                    String heightVal = String.valueOf(height.getFloat(h));
                    for (int lat = 0; lat < latitude.getSize(); lat++) {
                        String latVal = String.valueOf(latitude.getFloat(lat));
                        for (int lon = 0; lon < longitude.getSize(); lon++) {
                            String lonVal = String.valueOf(longitude.getFloat(lon));
                            String gridValue = grid.readDataSlice(t, h, lat, lon).toString();
                            System.out.print(timeVal + " ");
                            System.out.print(heightVal + " ");
                            System.out.print(latVal + " ");
                            System.out.print(lonVal + " ");
                            System.out.print(gridValue + "\n");
                        }
                    }
                }
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

