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.
Robb, thanks for the code, it worked great!. I have a question regarding the perfomance of the reading: With the code you sent me, reading a grib2 file with 11 parameters and 31 times each for only one location takes: 80 seconds. Is there any way to improve this time? As I want to gather values for several locations, say more than 100 locations its a lot of time.(80sec * 100 = 8000 sec = 2.2 hours). * Perfomance measures were obtained with the following: * Hardware: Amd Turion 64 X2 TL-58 1.9GHz , 3Gb Ram, Windows Vista 32, 5400Rpm HD. * Grib2 file: ftp://polar.ncep.noaa.gov/pub/waves/develop/multi_1.latest_run/multi_1.glo_30m.all.grb2 * Library versions:(NetCDF:Version 4.0.16; Grib:Version 6.0.16) * Code : --------------- import java.io.File; import java.util.Date; import ucar.ma2.Array; import ucar.ma2.IndexIterator; import ucar.nc2.dt.GridCoordSystem; import ucar.nc2.dt.GridDatatype; import ucar.nc2.dt.grid.GridDataset; public class ReadLatLonFromGrib { public static void main(final String[] args) { final File file = new File( "src/test/resources/multi_1.glo_30m.all.grb2"); final float lat = 39; final float lon = 179; final long startTime = new Date().getTime(); // Read the values for the given location readValuesForLocation(file, lat, lon); final long endTime = new Date().getTime(); // Calculate reading elapsed time(seconds). final long elapsedTime = (endTime - startTime) / 1000; System.out.println("Time elapsed for reading " + parameters.values().length + " parameters, for 31 times, in one location: " + elapsedTime + " secs."); } private static enum parameters { Direction_of_swell_waves, Direction_of_wind_waves, Mean_period_of_swell_waves, Mean_period_of_wind_waves, Primary_wave_direction, Primary_wave_mean_period, Significant_height_of_combined_wind_waves_and_swell, Significant_height_of_swell_waves, Significant_height_of_wind_waves, Wind_direction_from_which_blowing, Wind_speed }; private static void readValuesForLocation(final File file, final float lat, final float lon) { System.out.println("Reading grib values for lat: " + lat + " and lon: " + lon); try { // For each parameter for (final Enum parameter : parameters.values()) { final GridDataset gridDataSet = GridDataset.open(file .getAbsolutePath()); // For each time for (int i = 0; i < 31; i++) { final GridDatatype pwd = gridDataSet .findGridDatatype(parameter.name()); final GridCoordSystem pwdGcs = pwd.getCoordinateSystem(); final int[] result = null; // Get index value for lat/lon final int[] idx = pwdGcs.findXYindexFromLatLon(lat, lon, result); // Reads values for the given (location,parameter,time) final Array data = pwd.readDataSlice(i, -1, idx[1], idx[0]); final IndexIterator iter = data.getIndexIterator(); while (iter.hasNext()) { // Obtain the value final float val = iter.getFloatNext(); } } } System.out.println("Finish reading values"); } catch (final Exception exc) { exc.printStackTrace(); } } } Thanks. Regards. Esteban. ------------------------------------------------------------------------------------------------- On Fri, Oct 2, 2009 at 4:14 PM, Robb Kambic <rkambic@xxxxxxxxxxxxxxxx> wrote: > On Tue, 29 Sep 2009, Esteban Wagner wrote: > >> Hi, >> I have a grb2 file containing global Primary_wave_direction forecasts. I >> would like to read the >> values it contains. >> >> By the moment I was able to read the file and obtain a GridDataset using >> the following code: >> ------------ >> (NetCDF:Version 4.0.16; Grib:Version 6.0.16) >> >> final File file = new >> File("src/test/resources/multi_1.glo_30m.DIRPW.grb2"); >> final GridDataset gridDataSet = GridDataset.open(file.getAbsolutePath()); >> ---------- >> the file can be downloaded from: >> >> ftp://polar.ncep.noaa.gov/pub/waves/develop/multi_1.latest_run/multi_1.glo_30m.DIRPW.grb2 >> ---------- >> Now I would like if someone can tell me which are the methods from >> gridDataSet I should use in order >> to obtain the different forecast values of the Primary_wave_direction for >> a given grid point. >> >> Thanks, >> >> Regards. >> >> Esteban. >> >> > Esteban, > > I'll reference the JavaDocs first: > > http://www.unidata.ucar.edu/software/netcdf-java/v4.1/javadoc/ucar/nc2/dt/GridDataset.html > http://www.unidata.ucar.edu/software/netcdf-java/v4.1/javadoc/ucar/nc2/dt/GridDatatype.html > http://www.unidata.ucar.edu/software/netcdf-java/v4.1/javadoc/ucar/nc2/dt/GridCoordSystem.html > > I'm assuming by grid point you mean Lat/Lon > One needs to be at the GridCoordSystem level to be able to convert the > Lat/Lon point into indices. Then use the indices information in the > GridDatatype readDatSlice routine to get the value. Here's a short sample > program. > > public class GetDataFromLatLon { > public static void main(String[] args) { > > try { > > final File file = new > File("C:/data/grib/multi_1.glo_30m.DIRPW.grb2"); > final GridDataset gridDataSet = > GridDataset.open(file.getAbsolutePath()); > GridDatatype pwd = gridDataSet.findGridDatatype( > "Primary_wave_direction"); > System.out.println( pwd.getInfo()); > > GridCoordSystem pwdGcs = pwd.getCoordinateSystem(); > int[] result = null; > // Get index value for Lat 30.0 and Lon 179 > int[] idx = pwdGcs.findXYindexFromLatLon( 30.0, 179.0, result ); > //int[] idx = pwdGcs.findXYindexFromLatLon( 90.0, 0.0, result ); > // Extract data value for time 0, no Vert index, Lat index, Lon index > Array data = pwd.readDataSlice( 0, -1, idx[1], idx[0]); > // Another option: read all data values for timeIndex = 0 > //Array data = pwd.readVolumeData( 0 ); > IndexIterator iter = data.getIndexIterator(); > while(iter.hasNext()) { > float val = iter.getFloatNext(); > System.out.println( "Primary_wave_direction = "+ val); > } > > System.out.println( "Success"); > } catch (Exception exc) { > exc.printStackTrace(); > } > } > } > =============================================================================== > Robb Kambic Unidata Program Center > Software Engineer III Univ. Corp for Atmospheric > Research > rkambic@xxxxxxxxxxxxxxxx WWW: http://www.unidata.ucar.edu/ > ===============================================================================
netcdf-java
archives: