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>