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: