Native OPeNDAP support in IDL
Anonym
OPeNDAP is an acronym for "Open-source Project for a Network Data Access Protocol." From the OPeNDAP website: “OPeNDAP provides software which makes local data accessible to remote locations regardless of local storage format.” Through Unidata’s netCDF-4 library, IDL 8.2 includes native support for OPeNDAP, though currently only on Mac OS X and Linux. Joe Lee of The HDF Group has created an example of using OPeNDAP with a community-generated IDL client. I’d like to modify (and slightly expand) his example to instead use the native OPeNDAP support in IDL 8.2. Start with the URL to an AIRS level 3 standard daily product file (HDF-EOS format) hosted on The HDF Group’s OPeNDAP-enabled server:
IDL> url = 'http://eosdap.hdfgroup.uiuc.edu:8080/opendap/data/NASAFILES/hdf4/AIRS.2008.10.27.L3.RetStd001.v5.2.2.0.G08303124144.hdf'
Access the file at this URL using netCDF library calls. Open the file with NCDF_OPEN, which returns an identifier (a long integer) for the file:
IDL> file_id = ncdf_open(url)
What’s in this file? Use NCDF_INQUIRE to find the number of variables, dimensions and attributes:
IDL> info = ncdf_inquire(file_id) IDL> help, info ** Structure <85778ac>, 4 tags, length=16, data length=16, refs=1: NDIMS LONG 26 NVARS LONG 274 NGATTS LONG 0 RECDIM LONG -1
There are 274 variables in this file. Use NCDF_VARIDSINQ to get identifiers for all the variables:
IDL> var_ids = ncdf_varidsinq(file_id) IDL> help, var_ids VAR_IDS LONG = Array[274]
Use NCDF_VARINQ to get information about the last variable in the file:
IDL> help, ncdf_varinq(file_id, var_ids[-1]) ** Structure <85779ec>, 5 tags, length=40, data length=40, refs=1: NAME STRING 'TopographyU274' DATATYPE STRING 'FLOAT' NDIMS LONG 2 NATTS LONG 3 DIM LONG Array[2]
Extract data from this last variable in the remote file to your IDL session. Use NCDF_VARID to get an identifier for the variable, by name (note that this string is case-sensitive), and NCDF_VARGET to actually get the data, which will be stored locally in the variable topo.
IDL> topo_id = ncdf_varid(file_id, 'TopographyU274') IDL> ncdf_varget, file_id, topo_id, topo IDL> help, topo TOPO FLOAT = Array[360, 180]
We’ve successfully pulled data from the remote file into IDL! To properly visualize these data, also get their geographic coordinates:
IDL> latitude_id = ncdf_varid(file_id, 'LatitudeU271') IDL> longitude_id = ncdf_varid(file_id, 'LongitudeU272') IDL> ncdf_varget, file_id, latitude_id, latitude IDL> ncdf_varget, file_id, longitude_id, longitude IDL> help, longitude, latitude LONGITUDE FLOAT = Array[360] LATITUDE FLOAT = Array[180]
Then close the file:
IDL> ncdf_close, file_id
Visualize these topography data as a contour plot in a map projection:
IDL> m = map('Miller Cylindrical', $ > color='gray', $ > label_color='black', $ > label_position=0, $ ; move labels to edges > title='AIRS.2008.10.27.L3 Topography') IDL> nlevels = 11 IDL> levels = findgen(nlevels)*500 + 250 ; meters IDL> g = contour(topo, longitude, latitude, $ > overplot=m, $ > c_value=levels, $ > rgb_table=33, $ > background_color='dark blue', $ > /fill, $ > grid_units='degrees') IDL> c = mapcontinents(color='white') IDL> cb = colorbar(target=g, $ > position=[0.2, 0.13, 0.85, 0.15], $ > title='Elevation (m)')
and save the visualization to a PNG file:
IDL> p.save, 'idl_opendap_ex.png', resolution=150
The result (click to embiggen): Grab the source code for this example from here.