[gdal-dev] Units of dimension variable in NetCDF is 'km'
Anton Korosov
anton.korosov at nersc.no
Tue Aug 7 08:23:35 PDT 2012
I could not find any. There is a similar bug in DODS driver (it assumes
'lat' and 'lon' names for dimension variables), but fixing requires
large update/debugging.
On 08/07/2012 04:01 PM, Etienne Tourigny wrote:
> yes please! are there any other areas which could require a similar fix?
>
> Etienne
>
> On Tue, Aug 7, 2012 at 10:59 AM, Anton Korosov <anton.korosov at nersc.no> wrote:
>> Hi!
>>
>> It seem to work fine with this patch. Should I make a ticket?
>>
>>
>> Index: frmts/netcdf/netcdfdataset.cpp
>> ===================================================================
>> --- frmts/netcdf/netcdfdataset.cpp (revision 24746)
>> +++ frmts/netcdf/netcdfdataset.cpp (working copy)
>> @@ -2603,14 +2603,14 @@
>> const char *pszUnitsX = NULL;
>> const char *pszUnitsY = NULL;
>>
>> - strcpy( szTemp, "x" );
>> + strcpy( szTemp, poDS->papszDimName[nXDimID] );
>> strcat( szTemp, "#units" );
>> pszValue = CSLFetchNameValue( poDS->papszMetadata,
>> szTemp );
>> if( pszValue != NULL )
>> pszUnitsX = pszValue;
>>
>> - strcpy( szTemp, "y" );
>> + strcpy( szTemp, poDS->papszDimName[nYDimID] );
>> strcat( szTemp, "#units" );
>> pszValue = CSLFetchNameValue( poDS->papszMetadata,
>> szTemp );
>>
>>
>>
>> GDAL_netCDF:
>> =====
>> calling nc_open(
>> osisaf-nh_aggregated_ice_concentration_nh_polstere-100_200712010000.nc )
>> GDAL_netCDF: got cdfid=65536
>>
>> GDAL_netCDF: driver detected file type=1, libnetcdf detected type=1
>> GDAL_netCDF: dim_count = 4
>> GDAL_netCDF: var_count = 26
>> GDAL_netCDF: variable #2 [time_bounds] was ignored
>> GDAL_netCDF: variable #6 [lon] was ignored
>> GDAL_netCDF: variable #7 [lat] was ignored
>> GDAL_netCDF:
>> =====
>> SetProjectionFromVar( 10 )
>>
>> GDAL_netCDF: got grid_mapping Polar_Stereographic_Grid
>> GDAL_netCDF: bIsGdalFile=0 bIsGdalCfFile=0 bBottomUp=1
>> GDAL_netCDF: set bBottomUp = 0 from Y axis
>> GDAL_netCDF: setting WKT from CF
>> GDAL_netCDF: SetProjection, WKT = PROJCS["unnamed",GEOGCS["WGS
>> 84",DATUM["WGS_1984",SPHEROID["WGS
>> 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4326"]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",70],PARAMETER["central_meridian",-45],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1000,AUTHORITY["EPSG","9001"]]]
>>
>> GDAL_netCDF:
>> SetGeoTransform(-3855.005000,10.000000,0.000000,5844.997000,0.000000,-10.000000)
>> GDAL_netCDF: using variables lon and lat for GEOLOCATION
>> GDAL_netCDF: bGotGeogCS=0 bGotCfSRS=1 bGotCfGT=1 bGotGdalSRS=0 bGotGdalGT=0
>> GDAL:
>> GDALOpen(NETCDF:osisaf-nh_aggregated_ice_concentration_nh_polstere-100_200712010000.nc:ice_conc_avg,
>> this=0x1924f30) succeeds as netCDF.
>>
>> Driver: netCDF/Network Common Data Format
>> GDAL: GDALDefaultOverviews::OverviewScan()
>> Files:
>> osisaf-nh_aggregated_ice_concentration_nh_polstere-100_200712010000.nc
>> Size is 760, 1120
>> Coordinate System is:
>> PROJCS["unnamed",
>> GEOGCS["WGS 84",
>> DATUM["WGS_1984",
>> SPHEROID["WGS 84",6378137,298.257223563,
>> AUTHORITY["EPSG","7030"]],
>> TOWGS84[0,0,0,0,0,0,0],
>> AUTHORITY["EPSG","6326"]],
>> PRIMEM["Greenwich",0,
>> AUTHORITY["EPSG","8901"]],
>> UNIT["degree",0.0174532925199433,
>> AUTHORITY["EPSG","9108"]],
>> AUTHORITY["EPSG","4326"]],
>> PROJECTION["Polar_Stereographic"],
>> PARAMETER["latitude_of_origin",70],
>> PARAMETER["central_meridian",-45],
>> PARAMETER["scale_factor",1],
>> PARAMETER["false_easting",0],
>> PARAMETER["false_northing",0],
>> UNIT["metre",1000,
>> AUTHORITY["EPSG","9001"]]]
>>
>> Origin = (-3855.005000000000109,5844.997000000000298)
>> Pixel Size = (10.000000000000000,-10.000000000000000)
>> Metadata:
>> ice_conc_avg#_FillValue=-1e+10
>> ice_conc_avg#cell_methods=time: mean
>> ice_conc_avg#comment=as far as possible, interpolated values from input
>> files are avoided
>> ice_conc_avg#coordinates=lon lat
>> ice_conc_avg#grid_mapping=Polar_Stereographic_Grid
>> ice_conc_avg#long_name=averaged total ice concentration
>> ice_conc_avg#units=%
>> ice_conc_avg#valid_max=100
>> ice_conc_avg#valid_min=0
>> NC_GLOBAL#abstract=Monthly sea ice concentration estimated from satellite
>> data
>> within the framework of EUMETSAT Ocean and Sea Ice SAF.
>> NC_GLOBAL#activity_type=Space borne instrument
>> NC_GLOBAL#area=Northern Hemisphere
>> NC_GLOBAL#comment=For the OSI SAF daily product the Northern hemisphere
>> polar observation hole and other missing sectors are filled using
>> interpolation. If possible, the averaged monthly sea ice concentration is
>> based on nominal and corrected values only, avoiding the interpolated
>> values.
>> NC_GLOBAL#contact=osisaf-dev at met.no
>> NC_GLOBAL#Conventions=CF-1.0
>> NC_GLOBAL#distribution_statement=Free
>> NC_GLOBAL#easternmost_longitude=180
>> NC_GLOBAL#gcmd_keywords=Cryosphere > Sea Ice > Sea Ice Concentration
>> Oceans > Sea Ice > Sea Ice Concentration
>> Cryosphere > Sea Ice > Sea Ice Extent
>> Oceans > Sea Ice > Sea Ice Extent
>> Cryosphere > Sea Ice > Sea Ice Edge
>> Oceans > Sea Ice > Sea Ice Edge
>> Geographical Region > Northern Hemisphere
>> Vertical Location > Sea Surface
>> NO/MET > Norwegian Meteorological Institute, Norway
>> NC_GLOBAL#history=2010-04-26 creation
>> NC_GLOBAL#institution=Norwegian Meteorological Institute
>> NC_GLOBAL#keywords=Monthly Sea Ice Concentration,Monthly Sea Ice
>> Extent,Sea Ice,Oceanography,Meteorology,Climate,Remote Sensing
>> NC_GLOBAL#northernmost_latitude=90
>> NC_GLOBAL#PI_name=OSISAF HL Manager
>> NC_GLOBAL#product_name=EUMETSAT OSISAF sea ice
>> NC_GLOBAL#product_status=under development
>> NC_GLOBAL#project_name=CryoClim
>> NC_GLOBAL#projection=stere
>> NC_GLOBAL#resolution=10.00 km
>> NC_GLOBAL#source=EUMETSAT OSISAF ice concentration product
>> NC_GLOBAL#southernmost_latitude=31.039446
>> NC_GLOBAL#start_date=2007-12-01 00:00:00 UTC
>> NC_GLOBAL#stop_date=2008-01-01 00:00:00 UTC
>> NC_GLOBAL#title=Monthly aggregated sea ice concentration product
>> NC_GLOBAL#topiccategory=Oceans ClimatologyMeteorologyAtmosphere
>> NC_GLOBAL#url=http://saf.met.no/, http://cryoclim.met.no/metamod/sch/
>> NC_GLOBAL#westernmost_longitude=-180
>> NETCDF_DIM_EXTRA={time}
>> NETCDF_DIM_time_DEF={1,6}
>> NETCDF_DIM_time_VALUES=944006400
>> Polar_Stereographic_Grid#earth_shape=elliptical
>> Polar_Stereographic_Grid#false_easting=0
>> Polar_Stereographic_Grid#false_northing=0
>> Polar_Stereographic_Grid#grid_mapping_name=polar_stereographic
>> Polar_Stereographic_Grid#latitude_of_projection_origin=90
>> Polar_Stereographic_Grid#proj4_string=+proj=stere +a=6378273
>> +b=6356889.44891 +lat_0=90 +lat_ts=70 +lon_0=-45
>> Polar_Stereographic_Grid#standard_parallel=70
>> Polar_Stereographic_Grid#straight_vertical_longitude_from_pole=-45
>> time#axis=T
>> time#bounds=time_bounds
>> time#comment=The time variable contains the start date of the averaging
>> period.
>> time#long_name=reference time of product
>> time#standard_name=time
>> time#units=seconds since 1978-01-01 00:00:00
>> xc#axis=X
>> xc#grid_spacing=10.00 km
>> xc#long_name=x coordinate of projection (eastings)
>> xc#standard_name=projection_x_coordinate
>> xc#units=km
>> yc#axis=Y
>> yc#grid_spacing=10.00 km
>> yc#long_name=y coordinate of projection (northings)
>> yc#standard_name=projection_y_coordinate
>> yc#units=km
>> Geolocation:
>> LINE_OFFSET=0
>> LINE_STEP=1
>> PIXEL_OFFSET=0
>> PIXEL_STEP=1
>> SRS=GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS
>> 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4326"]]
>> X_BAND=1
>>
>> X_DATASET=NETCDF:"osisaf-nh_aggregated_ice_concentration_nh_polstere-100_200712010000.nc":lon
>> Y_BAND=1
>>
>> Y_DATASET=NETCDF:"osisaf-nh_aggregated_ice_concentration_nh_polstere-100_200712010000.nc":lat
>> OGRCT: Source: +proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0
>> +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=km +no_defs
>>
>> OGRCT: Target: +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs
>> Corner Coordinates:
>> Upper Left ( -3855.005, 5844.997) (168d24'23.11"E, 30d59'22.39"N)
>> Lower Left ( -3855.005, -5355.003) ( 80d44'58.84"W, 33d52'24.04"N)
>> Upper Right ( 3744.995, 5844.997) (102d21' 5.69"E, 31d24'47.25"N)
>> Lower Right ( 3744.995, -5355.003) ( 10d 1'59.42"W, 34d20' 7.54"N)
>> Center ( -55.005, 244.997) (147d39'13.75"E, 87d40'56.52"N)
>>
>> Band 1 Block=760x1 Type=Float32, ColorInterp=Undefined
>> NoData Value=-10000000000
>> Metadata:
>> _FillValue=-1e+10
>> cell_methods=time: mean
>> comment=as far as possible, interpolated values from input files are
>> avoided
>> coordinates=lon lat
>> grid_mapping=Polar_Stereographic_Grid
>> long_name=averaged total ice concentration
>> NETCDF_DIM_time=944006400
>> NETCDF_VARNAME=ice_conc_avg
>> units=%
>> valid_max=100
>> valid_min=0
>> GDAL:
>> GDALClose(NETCDF:osisaf-nh_aggregated_ice_concentration_nh_polstere-100_200712010000.nc:ice_conc_avg,
>> this=0x1924f30)
>>
>>
>>
>>
>>
>> On 08/07/2012 01:38 PM, Etienne Tourigny wrote:
>>>
>>> Hi,
>>>
>>> km units are supposed to work...
>>>
>>> Here is the code where "km" units are detected, which set the WKT
>>> units to 1000m.
>>>
>>> /* add units to PROJCS */
>>> if ( pszUnits != NULL && ! EQUAL(pszUnits,"") ) {
>>> if ( EQUAL(pszUnits,"m") ) {
>>> oSRS.SetLinearUnits( CF_UNITS_M, 1.0 );
>>> oSRS.SetAuthority( "PROJCS|UNIT", "EPSG", 9001 );
>>> }
>>> else if ( EQUAL(pszUnits,"km") ) {
>>> oSRS.SetLinearUnits( CF_UNITS_M, 1000.0 );
>>> oSRS.SetAuthority( "PROJCS|UNIT", "EPSG", 9001 );
>>> }
>>>
>>> What does the wkt actually look like?
>>>
>>> Also running gdalinfo --debug ON <file.nc> can give a few hints.
>>>
>>> It would be good for you to send me a link to the file or attach it to
>>> a bug report (add me as cc).
>>>
>>> Etienne
>>>
>>> On Tue, Aug 7, 2012 at 6:10 AM, Anton Korosov <anton.korosov at nersc.no>
>>> wrote:
>>>>
>>>> Dear Etienne,
>>>>
>>>> I faced the following problem with the NetCDF driver:
>>>> Units of the dimension variables are 'km' and values in the SRS are in
>>>> meters, of course (e.g. Earth radius). Hence the calculated GeoTransform
>>>> is
>>>> 1000 times less than should be and the calculate latlons are incorrect.
>>>> However 'units' attribute is given, besides AFAIK CF-conventions allow to
>>>> have 'k' (kilo) preceding 'm' (meters) in the units.
>>>>
>>>> Can you please give me a hint where to fix that in the driver so that it
>>>> can
>>>> adequately interpret units of the dimensions?
>>>>
>>>> With best regards!
>>>> Anton
>>>>
>>>> _______________________________________________
>>>> gdal-dev mailing list
>>>> gdal-dev at lists.osgeo.org
>>>> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>>
>>
More information about the gdal-dev
mailing list