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.

Re: ncdump, ncgen like tools for NcML

Roy Mendelssohn wrote:

Hi Guys:

Are there any equivalent standalone tools that operate like ncdump and ncgen but read/write NcML? What I am looking for is something easy and scriptable that I can just go through our existing directories to generate the NcML for each file, and then ultimately add some of the georefencing info.

TIA,

-Roy M

Hi Roy:

This all pertains to the NetCDF-Java library:

You can generate NcML from a netcdf file by using  NetcdfFile.writeNcML().

You can read NcML directly, just pass NetcdfFile.open() an NcML file ending in .xml or .ncml.

You can write a NetcdfFile from a NcML file by opening it as above, then using ucar.nc2.FileWriter.writeToFile().

You can do all all of this interactively by using the NcML Tab on the ToolUI program at

http://www.unidata.ucar.edu/content/software/netcdf-java/v2.2/webstart/index.html

For your case, where I assume you want to add extra metadata, 2 paths suggest itself:

1. Open the NetCDF file, add the extra metadata, then write it out using FileWriter. (No NcML needed, do it all in Java) This might lend itself to automatically doing a large amount of files.

2. Create the NcML file, add the extra metadata, then read it in and write it back out using FileWriter to get a NetCDF file. For example I have a file called example.nc, which has this NcML (whicj i generated from ToolsUI):

<?xml version="1.0" encoding="UTF-8"?>
<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"; location="file:C:/dev/netcdf-java-2.2/test/data/dataset/example.nc">
 <dimension name="time" length="4" isUnlimited="true" />
 <dimension name="lat" length="3" />
 <dimension name="lon" length="4" />
 <attribute name="title" type="String" value="Example Data" />
 <variable name="rh" shape="time lat lon" type="int">
   <attribute name="long_name" type="String" value="relative humidity" />
   <attribute name="units" type="String" value="percent" />
 </variable>
 <variable name="T" shape="time lat lon" type="double">
   <attribute name="long_name" type="String" value="surface temperature" />
   <attribute name="units" type="String" value="degC" />
 </variable>
 <variable name="lat" shape="lat" type="float">
   <attribute name="units" type="String" value="degrees_north" />
 </variable>
 <variable name="lon" shape="lon" type="float">
   <attribute name="units" type="String" value="degrees_east" />
 </variable>
 <variable name="time" shape="time" type="int">
   <attribute name="units" type="String" value="hours" />
 </variable>
</netcdf>

Now I add the "Conventions" global attribute :

<?xml version="1.0" encoding="UTF-8"?>
<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"; location="file:C:/dev/netcdf-java-2.2/test/data/dataset/example.nc">
 <dimension name="time" length="4" isUnlimited="true" />
 <dimension name="lat" length="3" />
 <dimension name="lon" length="4" />
 <attribute name="title" type="String" value="Example Data" />

 <attribute name="Conventions" type="String" value="COARDS" />

 <variable name="rh" shape="time lat lon" type="int">
   <attribute name="long_name" type="String" value="relative humidity" />
   <attribute name="units" type="String" value="percent" />
 </variable>
 <variable name="T" shape="time lat lon" type="double">
   <attribute name="long_name" type="String" value="surface temperature" />
   <attribute name="units" type="String" value="degC" />
 </variable>
 <variable name="lat" shape="lat" type="float">
   <attribute name="units" type="String" value="degrees_north" />
 </variable>
 <variable name="lon" shape="lon" type="float">
   <attribute name="units" type="String" value="degrees_east" />
 </variable>
 <variable name="time" shape="time" type="int">
   <attribute name="units" type="String" value="hours" />
 </variable>
</netcdf>


I actually dont need to add all information from the original file to the NcML file, because the default is to read existing metadata in, so equivilently:

<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"; location="file:C:/dev/netcdf-java-2.2/test/data/dataset/example.nc">

 <attribute name="Conventions" type="String" value="COARDS" />

</netcdf>

If you need to add a new variable, just make sure you add its data values also:

<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"; location="file:C:/dev/netcdf-java-2.2/test/data/dataset/example.nc">

 <attribute name="Conventions" type="String" value="COARDS" />

 <variable name="newvar" shape="time" type="float">
   <values>1.0  4.5  7.8</values>
 </variable>

</netcdf>


Once you have an NcML file, you can use FileWriter.main() in batch mode to generate a NetCDF file:

> java -classpath toolsUI.jar ucar.nc2.FileWriter <ncml input filename> <netcdf output filename>


  • 2005 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdf-java archives: