Hi All, - I am attempting to use a NetCDF file as a data source for a raster layer in Mapserver. According to a very useful email sent in November 2005 from Norman Barker, http://lists.osgeo.org/pipermail/mapserver-users/2005-November/012153.html, and from Mapserver documentation at http://www.mapserver.org/ogc/wcs_format.html#netcdf, it seems like this should be possible using Mapserver's gdal driver to read the file. However, I am running into some problems when trying to implement these examples using GDAL 1.5.2, released 2008/05/29.
- The NetCDF file which I am using to test with is a "CF Convention" sample file which I downloaded from http://www.unidata.ucar.edu/software/netcdf/examples/tos_O1_2001-2002.nc. This file contains information about sea-surface temperatures, and when viewed by gdalinfo has the following characteristics: $ gdalinfo tos_O1_2001-2002.nc Driver: netCDF/Network Common Data Format Files: tos_O1_2001-2002.nc Size is 512, 512 Coordinate System is `' Metadata: NC_GLOBAL#title=IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment NC_GLOBAL#institution=IPSL (Institut Pierre Simon Laplace, Paris, France) NC_GLOBAL#source=IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v NC_GLOBAL#contact=Sebastien Denvil, [email protected] NC_GLOBAL#project_id=IPCC Fourth Assessment NC_GLOBAL#table_id=Table O1 (13 November 2004) NC_GLOBAL#experiment_id=SRES A2 experiment NC_GLOBAL#realization=1 NC_GLOBAL#cmor_version=9.600000e-01 NC_GLOBAL#Conventions=CF-1.0 NC_GLOBAL#history=YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements NC_GLOBAL#references=Dufresne et al, Journal of Climate, 2015, vol XX, p 136 NC_GLOBAL#comment=Test drive Subdatasets: SUBDATASET_1_NAME=NETCDF:"tos_O1_2001-2002.nc":lon_bnds SUBDATASET_1_DESC=[180x2] lon_bnds (64-bit floating-point) SUBDATASET_2_NAME=NETCDF:"tos_O1_2001-2002.nc":lat_bnds SUBDATASET_2_DESC=[170x2] lat_bnds (64-bit floating-point) SUBDATASET_3_NAME=NETCDF:"tos_O1_2001-2002.nc":time_bnds SUBDATASET_3_DESC=[24x2] time_bnds (64-bit floating-point) SUBDATASET_4_NAME=NETCDF:"tos_O1_2001-2002.nc":tos SUBDATASET_4_DESC=[24x170x180] sea_surface_temperature (32-bit floating-point) Corner Coordinates: Upper Left ( 0.0, 0.0) Lower Left ( 0.0, 512.0) Upper Right ( 512.0, 0.0) Lower Right ( 512.0, 512.0) Center ( 256.0, 256.0) - The SUBDATASET of interest is the "tos" one, and when queried by gdalinfo it shows that it contains 24 bands, each of which varies by NETCDF_DIMENSION_time that increments by 15. When specifically queried by gdalinfo, this SUBDATASET looks like this: $ gdalinfo NETCDF:"tos_O1_2001-2002.nc":tos Driver: netCDF/Network Common Data Format Files: none associated Size is 180, 170 Coordinate System is `' Origin = (0.000000000000000,90.000000000000000) Pixel Size = (2.000000000000000,-1.000000000000000) Metadata: NC_GLOBAL#title=IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment NC_GLOBAL#institution=IPSL (Institut Pierre Simon Laplace, Paris, France) NC_GLOBAL#source=IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v NC_GLOBAL#contact=Sebastien Denvil, [email protected] NC_GLOBAL#project_id=IPCC Fourth Assessment NC_GLOBAL#table_id=Table O1 (13 November 2004) NC_GLOBAL#experiment_id=SRES A2 experiment NC_GLOBAL#realization=1 NC_GLOBAL#cmor_version=9.600000e-01 NC_GLOBAL#Conventions=CF-1.0 NC_GLOBAL#history=YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements NC_GLOBAL#references=Dufresne et al, Journal of Climate, 2015, vol XX, p 136 NC_GLOBAL#comment=Test drive tos#standard_name=sea_surface_temperature tos#long_name=Sea Surface Temperature tos#units=K tos#cell_methods=time: mean (interval: 30 minutes) tos#_FillValue=1.000000e+20 tos#missing_value=1.000000e+20 tos#original_name=sosstsst tos#original_units=degC tos#history= At 16:37:23 on 01/11/2005: CMOR altered the data in the following ways: added 2.73150E+02 to yield output units; Cyclical dimension was output starting at a different lon; lon#standard_name=longitude lon#long_name=longitude lon#units=degrees_east lon#axis=X lon#bounds=lon_bnds lon#original_units=degrees_east lat#standard_name=latitude lat#long_name=latitude lat#units=degrees_north lat#axis=Y lat#bounds=lat_bnds lat#original_units=degrees_north time#standard_name=time time#long_name=time time#units=days since 2001-1-1 time#axis=T time#calendar=360_day time#bounds=time_bnds time#original_units=seconds since 2001-1-1 Corner Coordinates: Upper Left ( 0.0000000, 90.0000000) Lower Left ( 0.0000000, -80.0000000) Upper Right ( 360.000, 90.000) Lower Right ( 360.000, -80.000) Center ( 180.0000000, 5.0000000) Band 1 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=15 NETCDF_time_units=days since 2001-1-1 Band 2 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=45 NETCDF_time_units=days since 2001-1-1 Band 3 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=75 NETCDF_time_units=days since 2001-1-1 Band 4 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=105 NETCDF_time_units=days since 2001-1-1 Band 5 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=135 NETCDF_time_units=days since 2001-1-1 Band 6 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=165 NETCDF_time_units=days since 2001-1-1 Band 7 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=195 NETCDF_time_units=days since 2001-1-1 Band 8 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=225 NETCDF_time_units=days since 2001-1-1 Band 9 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=255 NETCDF_time_units=days since 2001-1-1 Band 10 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=285 NETCDF_time_units=days since 2001-1-1 Band 11 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=315 NETCDF_time_units=days since 2001-1-1 Band 12 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=345 NETCDF_time_units=days since 2001-1-1 Band 13 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=375 NETCDF_time_units=days since 2001-1-1 Band 14 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=405 NETCDF_time_units=days since 2001-1-1 Band 15 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=435 NETCDF_time_units=days since 2001-1-1 Band 16 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=465 NETCDF_time_units=days since 2001-1-1 Band 17 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=495 NETCDF_time_units=days since 2001-1-1 Band 18 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=525 NETCDF_time_units=days since 2001-1-1 Band 19 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=555 NETCDF_time_units=days since 2001-1-1 Band 20 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=585 NETCDF_time_units=days since 2001-1-1 Band 21 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=615 NETCDF_time_units=days since 2001-1-1 Band 22 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=645 NETCDF_time_units=days since 2001-1-1 Band 23 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=675 NETCDF_time_units=days since 2001-1-1 Band 24 Block=180x1 Type=Float32, ColorInterp=Undefined NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=705 NETCDF_time_units=days since 2001-1-1 - I am able to test that I can extract one of these bands with GDAL, and convert it to GeoTIFF with the following command: gdal_translate -b 1 NETCDF:"tos_O1_2001-2002.nc":tos sea_temp_band_1.tif. Here however is where the first problem appears. As you can see from the screenshot of the sea_temp_band_1.tif that I've posted at http://2.bp.blogspot.com/_-yICqdt0mtY/SZxtI4yUHdI/AAAAAAAAA-I/z7W_O6qBXho/s1600-h/upside_down_netcdf.jpg, the data in the file appears to be represented upside down. Since this file is a sample from the Unidata web site, I'm reasonably confident that the file follows the CF convention. Every NetCDF file I have tried to read with GDAL has had this problem, including ones that I have created with gdal_translate. As you can see from the gdalinfo output above, the georeferencing and pixel dimensions seem to be reasonable. In the past I have used flip_raster.py to "fix" this, and created an intermediary GeoTIFF. Now that I would like to use the NetCDF itself as the data source to feed a WCS service, this is no longer an acceptable solution. Of interest though, is that the georeferencing info between the flipped and unflipped files are exactly the same. See below: - Flipped file: --------------- $ gdalinfo flipped_sea_temp_band_1.tif Driver: GTiff/GeoTIFF Files: flipped_sea_temp_band_1.tif Size is 180, 170 Coordinate System is `' Origin = (0.000000000000000,90.000000000000000) Pixel Size = (2.000000000000000,-1.000000000000000) Image Structure Metadata: INTERLEAVE=BAND Corner Coordinates: Upper Left ( 0.0000000, 90.0000000) Lower Left ( 0.0000000, -80.0000000) Upper Right ( 360.000, 90.000) Lower Right ( 360.000, -80.000) Center ( 180.0000000, 5.0000000) Band 1 Block=180x11 Type=Float32, ColorInterp=Gray - Unflipped file: ----------------- $ gdalinfo sea_temp_band_1.tif Driver: GTiff/GeoTIFF Files: sea_temp_band_1.tif Size is 180, 170 Coordinate System is `' Origin = (0.000000000000000,90.000000000000000) Pixel Size = (2.000000000000000,-1.000000000000000) <snip> (Metadata removed for clarity) Image Structure Metadata: INTERLEAVE=BAND Corner Coordinates: Upper Left ( 0.0000000, 90.0000000) Lower Left ( 0.0000000, -80.0000000) Upper Right ( 360.000, 90.000) Lower Right ( 360.000, -80.000) Center ( 180.0000000, 5.0000000) Band 1 Block=180x11 Type=Float32, ColorInterp=Gray NoData Value=1.00000002004087734e+20 Metadata: NETCDF_VARNAME=tos NETCDF_DIMENSION_time=15 NETCDF_time_units=days since 2001-1-1 - I'm unsure if this is a bug in GDAL, or an incorrectly formatted NetCDF file. So, would it be possible for someone who has a NetCDF file that is read "right-side-up" to post it as a sample for me to test with? Thanks in advance, Roger
_______________________________________________ gdal-dev mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/gdal-dev
