Hi James,
This question was reposted to the list one day after this one. In that 2nd
thread, Ben Caradoc-Davies correctly identified the issue: the units for
latitude and longitude are incorrect. To be CF-compliant, longitude should
have the unit "degrees_east" and latitude should have the unit
"degrees_north". NetCDF-Java uses that information to identify coordinate
axes and build a coordinate system. If a coordinate system can't be built,
then "pet" can't be recognized as a grid.
There are other issues with this file as well: "Conventions" should be
"CF-1.6" and "pet" should have a "coordinates" attribute with value "time
lon lat", among others. But the units are the main problem here.
-Christian
On Wed, Jun 29, 2016 at 3:41 PM, Sean Arms <sarms@xxxxxxxx> wrote:
> Greetings James,
>
> I think you need to add the following attribute to the pet variable:
>
> coordinates = "time lon lat"
>
> If that does not work, would you have a sample file that you could share?
>
> Thanks!
>
> Sean
>
>
> On Fri, Jun 24, 2016 at 1:28 PM, James Adams <monocongo@xxxxxxxxx> wrote:
>
>> I have Java code which gets a GeoGrid object from a NetCDF GridDataset
>> via the variable name. It normally works correctly but for the input NetCDF
>> file I currently need to work with I get an error when this code runs, in
>> that the GeoGrid is not found, even though you can see the variable in the
>> NetCDF dataset using other tools such as ncdump and/or when stepping
>> through the code with a debugger.
>>
>> This code works as expected with other NetCDF files so I assume that
>> there must be something in the NetCDF file itself which is preventing the
>> fetch of a variable's grid via a lookup of the variable name. When I view
>> the NetCDF file I can see the variable and it displays as a Geo2D type in
>> Panoply. The ncdump -h output for the file is below:
>>
>> File "prism_nidis_pet.nc"
>> Dataset type: NetCDF-3/CDM
>>
>> netcdf file:/C:/home/prism/prism_nidis_pet.nc {
>> dimensions:
>> lon = 1405;
>> lat = 621;
>> time = UNLIMITED; // (1457 currently
>> variables:
>> int time(time=1457);
>> :long_name = "time";
>> :standard_name = "time";
>> :units = "days since 1800-1-1 00:00:00";
>> :calendar = "gregorian";
>>
>> float lon(lon=1405);
>> :long_name = "longitude";
>> :standard_name = "longitude";
>> :units = "degrees_north";
>>
>> float lat(lat=621);
>> :long_name = "latitude";
>> :standard_name = "latitude";
>> :units = "degrees_west";
>>
>> float pet(time=1457, lon=1405, lat=621);
>> :calibration_start_year_month = "full";
>> :calibration_end_year_month = "full";
>> :_FillValue = -999.9f; // float
>> :missing_value = -999.9f; // float
>> :valid_min = 0.0f; // float
>> :valid_max = 3.4028235E38f; // float
>> :units = "millimeters";
>> :cell_methods = "time: potential evapotranspiration estimate,
>> Thornthwaite equation";
>> :long_name = "Potential evapotranspiration estimate,
>> Thornthwaite equation";
>> :standard_name = "Potential evapotranspiration estimate,
>> Thornthwaite equation";
>>
>> // global attributes:
>> :date_created = "2016-06-23 11:52:37";
>> :date_modified = "2016-06-23 11:52:37";
>> :standard_name_vocabulary = "CF Standard Name Table (v26, 08
>> November 2013)";
>> :Conventions = "1.6";
>> :geospatial_lon_min = -125.0f; // float
>> :geospatial_lon_max = -66.5f; // float
>> :geospatial_lat_min = 24.083334f; // float
>> :geospatial_lat_max = 49.916668f; // float
>> }
>>
>> Is there anything about the file described above which would prevent
>> being able to get a GeoGrid associated with the variable named "pet"?
>>
>> Below is the code which is failing when using the above file as input.
>>
>>
>> private GeoGrid getGrid(final String netcdfFile,
>> final String variableName)
>> throws IOException
>> {
>> // open the NetCDF data set
>> GridDataset gridDataset = GridDataset.open(netcdfFile);
>>
>> // verify that we opened the GridDataset
>> if (gridDataset == null)
>> {
>> String errorMessage = "Error opening the NetCDF data set
>> using the file \'" + netcdfFile + "\'";
>> logger.error(errorMessage);
>> throw new RuntimeException(errorMessage);
>> }
>>
>> // THIS IS WHERE THE PROBLEM OCCURS
>> // get the grid based on the associated variable name
>> GeoGrid geoGrid =
>> gridDataset.findGridByShortName(variableName);
>>
>> // verify that we found the GeoGrid
>> if (geoGrid == null)
>> {
>> String errorMessage = "Error finding the NetCDF grid from
>> the NetCDF file \'" + netcdfFile + "\' using the variable name \'" +
>> variableName + "\'";
>> logger.error(errorMessage);
>> throw new RuntimeException(errorMessage);
>> }
>>
>> // more code omitted...
>> }
>>
>> When the above code runs and fails the arguments are the NetCDF file name
>> and "pet" which is the variable name in that NetCDF for which we're trying
>> to get the corresponding grid.
>>
>> Can anyone suggest what's going wrong here? Thanks in advance...
>>
>> _______________________________________________
>> NOTE: All exchanges posted to Unidata maintained email lists are
>> recorded in the Unidata inquiry tracking system and made publicly
>> available through the web. Users who post to any of the lists we
>> maintain are reminded to remove any personal information that they
>> do not want to be made public.
>>
>>
>> netcdf-java mailing list
>> netcdf-java@xxxxxxxxxxxxxxxx
>> For list information or to unsubscribe, visit:
>> http://www.unidata.ucar.edu/mailing_lists/
>>
>
>
> _______________________________________________
> NOTE: All exchanges posted to Unidata maintained email lists are
> recorded in the Unidata inquiry tracking system and made publicly
> available through the web. Users who post to any of the lists we
> maintain are reminded to remove any personal information that they
> do not want to be made public.
>
>
> netcdf-java mailing list
> netcdf-java@xxxxxxxxxxxxxxxx
> For list information or to unsubscribe, visit:
> http://www.unidata.ucar.edu/mailing_lists/
>