From 9afdeb833e23fcc3fe0d0fac8ca3d80f91a6abe5 Mon Sep 17 00:00:00 2001 From: Etienne Tourigny Date: Fri, 21 Oct 2011 21:05:54 +0000 Subject: [PATCH] netcdf patch #1 - new and modified #define git-svn-id: https://svn.osgeo.org/gdal/trunk/gdal@23262 f0d54148-0727-0410-94bb-9a71ac55c965 --- frmts/netcdf/netcdfdataset.cpp | 457 ++++++++++----------------------- frmts/netcdf/netcdfdataset.h | 180 ++++++++----- 2 files changed, 263 insertions(+), 374 deletions(-) diff --git a/frmts/netcdf/netcdfdataset.cpp b/frmts/netcdf/netcdfdataset.cpp index e7f48da159b3..9758db1d67d4 100644 --- a/frmts/netcdf/netcdfdataset.cpp +++ b/frmts/netcdf/netcdfdataset.cpp @@ -113,29 +113,6 @@ CPLErr netCDFRasterBand::SetScale( double dfNewScale ) return CE_None; } -/************************************************************************/ -/* GetMetadata() */ -/************************************************************************/ -char **netCDFDataset::GetMetadata( const char *pszDomain ) -{ - if( pszDomain != NULL && EQUALN( pszDomain, "SUBDATASETS", 11 ) ) - return papszSubDatasets; - else - return GDALDataset::GetMetadata( pszDomain ); -} - -/************************************************************************/ -/* GetProjectionRef() */ -/************************************************************************/ - -const char * netCDFDataset::GetProjectionRef() -{ - if( bGotGeoTransform ) - return pszProjection; - else - return GDALPamDataset::GetProjectionRef(); -} - /************************************************************************/ /* GetNoDataValue() */ /************************************************************************/ @@ -185,7 +162,7 @@ CPLErr netCDFRasterBand::CreateBandMetadata( ) { char szVarName[NC_MAX_NAME]; char szMetaName[NC_MAX_NAME]; - char szMetaTemp[MAX_STR_LEN]; + char szMetaTemp[NCDF_MAX_STR_LEN]; int nd; int i,j; int Sum = 1; @@ -413,7 +390,7 @@ netCDFRasterBand::netCDFRasterBand( netCDFDataset *poDS, nc_type atttype=NC_NAT; size_t attlen; int status; - char szNoValueName[MAX_STR_LEN]; + char szNoValueName[NCDF_MAX_STR_LEN]; this->panBandZPos = NULL; @@ -585,12 +562,12 @@ netCDFRasterBand::netCDFRasterBand( netCDFDataset *poDS, double dfOff = 0.0; double dfScale = 1.0; - if ( nc_inq_attid ( poDS->cdfid, nZId, NCDF_ADD_OFFSET, NULL) == NC_NOERR ) { - status = nc_get_att_double( poDS->cdfid, nZId, NCDF_ADD_OFFSET, &dfOff ); + if ( nc_inq_attid ( poDS->cdfid, nZId, CF_ADD_OFFSET, NULL) == NC_NOERR ) { + status = nc_get_att_double( poDS->cdfid, nZId, CF_ADD_OFFSET, &dfOff ); } if ( nc_inq_attid ( poDS->cdfid, nZId, - NCDF_SCALE_FACTOR, NULL) == NC_NOERR ) { - status = nc_get_att_double( poDS->cdfid, nZId, NCDF_SCALE_FACTOR, &dfScale ); + CF_SCALE_FACTOR, NULL) == NC_NOERR ) { + status = nc_get_att_double( poDS->cdfid, nZId, CF_SCALE_FACTOR, &dfScale ); } SetOffset( dfOff ); SetScale( dfScale ); @@ -608,7 +585,7 @@ CPLErr netCDFRasterBand::IReadBlock( int nBlockXOff, int nBlockYOff, int cdfid = ( ( netCDFDataset * ) poDS )->cdfid; size_t start[ MAX_NC_DIMS ]; size_t edge[ MAX_NC_DIMS ]; - char pszName[ MAX_STR_LEN ]; + char pszName[ NCDF_MAX_STR_LEN ]; int i,j; int Sum=-1; int Taken=-1; @@ -754,6 +731,29 @@ netCDFDataset::~netCDFDataset() nc_close( cdfid ); } +/************************************************************************/ +/* GetMetadata() */ +/************************************************************************/ +char **netCDFDataset::GetMetadata( const char *pszDomain ) +{ + if( pszDomain != NULL && EQUALN( pszDomain, "SUBDATASETS", 11 ) ) + return papszSubDatasets; + else + return GDALDataset::GetMetadata( pszDomain ); +} + +/************************************************************************/ +/* GetProjectionRef() */ +/************************************************************************/ + +const char * netCDFDataset::GetProjectionRef() +{ + if( bGotGeoTransform ) + return pszProjection; + else + return GDALPamDataset::GetProjectionRef(); +} + /************************************************************************/ /* FetchCopyParm() */ /************************************************************************/ @@ -790,7 +790,7 @@ char** netCDFDataset::FetchStandardParallels( const char *pszGridMappingValue ) //cf-1.0 tags strcpy( szTemp,pszGridMappingValue ); strcat( szTemp, "#" ); - strcat( szTemp, STD_PARALLEL ); + strcat( szTemp, CF_PP_STD_PARALLEL ); pszValue = CSLFetchNameValue( papszMetadata, szTemp ); if( pszValue != NULL ) papszValues = CSLTokenizeString2( pszValue, ",", CSLT_STRIPLEADSPACES | @@ -800,7 +800,7 @@ char** netCDFDataset::FetchStandardParallels( const char *pszGridMappingValue ) { strcpy( szTemp, pszGridMappingValue ); strcat( szTemp, "#" ); - strcat( szTemp, STD_PARALLEL_1 ); + strcat( szTemp, CF_PP_STD_PARALLEL_1 ); pszValue = CSLFetchNameValue( papszMetadata, szTemp ); @@ -809,7 +809,7 @@ char** netCDFDataset::FetchStandardParallels( const char *pszGridMappingValue ) strcpy( szTemp,pszGridMappingValue ); strcat( szTemp, "#" ); - strcat( szTemp, STD_PARALLEL_2 ); + strcat( szTemp, CF_PP_STD_PARALLEL_2 ); pszValue = CSLFetchNameValue( papszMetadata, szTemp ); @@ -897,7 +897,7 @@ void netCDFDataset::SetProjection( int var ) nc_inq_varname( cdfid, var, szVarName ); strcpy(szTemp,szVarName); strcat(szTemp,"#"); - strcat(szTemp,GRD_MAPPING); + strcat(szTemp,CF_GRD_MAPPING); pszValue = CSLFetchNameValue(poDS->papszMetadata, szTemp); if( pszValue ) { strcpy(szGridMappingName,szTemp); @@ -932,7 +932,7 @@ void netCDFDataset::SetProjection( int var ) strcpy( szTemp, szGridMappingValue ); strcat( szTemp, "#" ); - strcat( szTemp, GRD_MAPPING_NAME ); + strcat( szTemp, CF_GRD_MAPPING_NAME ); pszValue = CSLFetchNameValue(poDS->papszMetadata, szTemp); if( pszValue != NULL ) { @@ -942,27 +942,27 @@ void netCDFDataset::SetProjection( int var ) /* -------------------------------------------------------------------- */ dfEarthRadius = poDS->FetchCopyParm( szGridMappingValue, - EARTH_RADIUS, + CF_PP_EARTH_RADIUS, -1.0 ); dfLonPrimeMeridian = poDS->FetchCopyParm( szGridMappingValue, - LONG_PRIME_MERIDIAN, + CF_PP_LONG_PRIME_MERIDIAN, 0.0 ); dfInverseFlattening = poDS->FetchCopyParm( szGridMappingValue, - INVERSE_FLATTENING, + CF_PP_INVERSE_FLATTENING, -1.0 ); dfSemiMajorAxis = poDS->FetchCopyParm( szGridMappingValue, - SEMI_MAJOR_AXIS, + CF_PP_SEMI_MAJOR_AXIS, -1.0 ); dfSemiMinorAxis = poDS->FetchCopyParm( szGridMappingValue, - SEMI_MINOR_AXIS, + CF_PP_SEMI_MINOR_AXIS, -1.0 ); //see if semi-major exists if radius doesn't @@ -972,7 +972,7 @@ void netCDFDataset::SetProjection( int var ) //if still no radius, check old tag if( dfEarthRadius < 0.0 ) dfEarthRadius = poDS->FetchCopyParm( szGridMappingValue, - "spherical_earth_radius_meters", + CF_PP_EARTH_RADIUS_OLD, -1.0 ); //has radius value @@ -1020,27 +1020,27 @@ void netCDFDataset::SetProjection( int var ) /* Transverse Mercator */ /* -------------------------------------------------------------------- */ - if( EQUAL( pszValue, TM ) ) { + if( EQUAL( pszValue, CF_PT_TM ) ) { dfScale = poDS->FetchCopyParm( szGridMappingValue, - SCALE_FACTOR_ORIGIN, 1.0 ); + CF_PP_SCALE_FACTOR_ORIGIN, 1.0 ); dfCenterLon = poDS->FetchCopyParm( szGridMappingValue, - LONG_CENTRAL_MERIDIAN, 0.0 ); + CF_PP_LONG_CENTRAL_MERIDIAN, 0.0 ); dfCenterLat = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); oSRS.SetTM( dfCenterLat, dfCenterLon, @@ -1056,16 +1056,16 @@ void netCDFDataset::SetProjection( int var ) /* Albers Equal Area */ /* -------------------------------------------------------------------- */ - if( EQUAL( pszValue, AEA ) ) { + if( EQUAL( pszValue, CF_PT_AEA ) ) { char **papszStdParallels = NULL; dfCenterLon = poDS->FetchCopyParm( szGridMappingValue, - LONG_CENTRAL_MERIDIAN, 0.0 ); + CF_PP_LONG_CENTRAL_MERIDIAN, 0.0 ); dfCenterLat = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfScale = poDS->FetchCopyParm( szGridMappingValue, @@ -1073,11 +1073,11 @@ void netCDFDataset::SetProjection( int var ) dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); papszStdParallels = FetchStandardParallels( szGridMappingValue ); @@ -1098,11 +1098,11 @@ void netCDFDataset::SetProjection( int var ) else { dfStdP1 = poDS->FetchCopyParm( szGridMappingValue, - STD_PARALLEL_1, 0.0 ); + CF_PP_STD_PARALLEL_1, 0.0 ); dfStdP2 = poDS->FetchCopyParm( szGridMappingValue, - STD_PARALLEL_2, 0.0 ); + CF_PP_STD_PARALLEL_2, 0.0 ); } oSRS.SetACEA( dfStdP1, dfStdP2, dfCenterLat, dfCenterLon, dfFalseEasting, dfFalseNorthing ); @@ -1117,21 +1117,21 @@ void netCDFDataset::SetProjection( int var ) /* Cylindrical Equal Area */ /* -------------------------------------------------------------------- */ - else if( EQUAL( pszValue, CEA ) || EQUAL( pszValue, LCEA ) ) { + else if( EQUAL( pszValue, CF_PT_CEA ) || EQUAL( pszValue, CF_PT_LCEA ) ) { dfStdP1 = poDS->FetchCopyParm( szGridMappingValue, - STD_PARALLEL_1, 0.0 ); + CF_PP_STD_PARALLEL_1, 0.0 ); dfCentralMeridian = poDS->FetchCopyParm( szGridMappingValue, - LONG_CENTRAL_MERIDIAN, 0.0 ); + CF_PP_LONG_CENTRAL_MERIDIAN, 0.0 ); dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); oSRS.SetCEA( dfStdP1, dfCentralMeridian, dfFalseEasting, dfFalseNorthing ); @@ -1144,31 +1144,31 @@ void netCDFDataset::SetProjection( int var ) /* -------------------------------------------------------------------- */ /* lambert_azimuthal_equal_area */ /* -------------------------------------------------------------------- */ - else if( EQUAL( pszValue, LAEA ) ) { + else if( EQUAL( pszValue, CF_PT_LAEA ) ) { dfCenterLon = poDS->FetchCopyParm( szGridMappingValue, - LON_PROJ_ORIGIN, 0.0 ); + CF_PP_LON_PROJ_ORIGIN, 0.0 ); dfCenterLat = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); /* dfLonOrig = poDS->FetchCopyParm( szGridMappingValue, - LON_PROJ_ORIGIN, 0.0 ); + CF_PP_LON_PROJ_ORIGIN, 0.0 ); dfLatOrig = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfScaleFactorOrig = poDS->FetchCopyParm( szGridMappingValue, @@ -1184,11 +1184,11 @@ void netCDFDataset::SetProjection( int var ) dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); */ oSRS.SetProjCS( "LAEA (WGS84) " ); @@ -1203,22 +1203,22 @@ void netCDFDataset::SetProjection( int var ) /* -------------------------------------------------------------------- */ /* Azimuthal Equidistant */ /* -------------------------------------------------------------------- */ - else if( EQUAL( pszValue, AE ) ) { + else if( EQUAL( pszValue, CF_PT_AE ) ) { dfCenterLon = poDS->FetchCopyParm( szGridMappingValue, - LON_PROJ_ORIGIN, 0.0 ); + CF_PP_LON_PROJ_ORIGIN, 0.0 ); dfCenterLat = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); oSRS.SetAE( dfCenterLat, dfCenterLon, dfFalseEasting, dfFalseNorthing ); @@ -1231,17 +1231,17 @@ void netCDFDataset::SetProjection( int var ) /* -------------------------------------------------------------------- */ /* Lambert conformal conic */ /* -------------------------------------------------------------------- */ - else if( EQUAL( pszValue, L_C_CONIC ) ) { + else if( EQUAL( pszValue, CF_PT_LCC ) ) { char **papszStdParallels = NULL; dfCenterLon = poDS->FetchCopyParm( szGridMappingValue, - LONG_CENTRAL_MERIDIAN, 0.0 ); + CF_PP_LONG_CENTRAL_MERIDIAN, 0.0 ); dfCenterLat = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfScale = poDS->FetchCopyParm( szGridMappingValue, @@ -1249,11 +1249,11 @@ void netCDFDataset::SetProjection( int var ) dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); papszStdParallels = FetchStandardParallels( szGridMappingValue ); @@ -1278,11 +1278,11 @@ void netCDFDataset::SetProjection( int var ) else { dfStdP1 = poDS->FetchCopyParm( szGridMappingValue, - STD_PARALLEL_1, 0.0 ); + CF_PP_STD_PARALLEL_1, 0.0 ); dfStdP2 = poDS->FetchCopyParm( szGridMappingValue, - STD_PARALLEL_2, 0.0 ); + CF_PP_STD_PARALLEL_2, 0.0 ); oSRS.SetLCC( dfStdP1, dfStdP2, dfCenterLat, dfCenterLon, dfFalseEasting, dfFalseNorthing ); @@ -1298,7 +1298,7 @@ void netCDFDataset::SetProjection( int var ) /* Is this Latitude/Longitude Grid explicitly */ /* -------------------------------------------------------------------- */ - else if ( EQUAL ( pszValue, LATITUDE_LONGITUDE ) ) { + else if ( EQUAL ( pszValue, CF_PT_LATITUDE_LONGITUDE ) ) { if( !bGotGeogCS ) oSRS.SetWellKnownGeogCS( "WGS84" ); } @@ -1306,27 +1306,27 @@ void netCDFDataset::SetProjection( int var ) /* Mercator */ /* -------------------------------------------------------------------- */ - else if ( EQUAL ( pszValue, MERCATOR ) ) { + else if ( EQUAL ( pszValue, CF_PT_MERCATOR ) ) { dfCenterLon = poDS->FetchCopyParm( szGridMappingValue, - LON_PROJ_ORIGIN, 0.0 ); + CF_PP_LON_PROJ_ORIGIN, 0.0 ); dfCenterLat = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfScale = poDS->FetchCopyParm( szGridMappingValue, - SCALE_FACTOR_ORIGIN, + CF_PP_SCALE_FACTOR_ORIGIN, 1.0 ); dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); oSRS.SetMercator( dfCenterLat, dfCenterLon, dfScale, dfFalseEasting, dfFalseNorthing ); @@ -1339,22 +1339,22 @@ void netCDFDataset::SetProjection( int var ) /* Orthographic */ /* -------------------------------------------------------------------- */ - else if ( EQUAL ( pszValue, ORTHOGRAPHIC ) ) { + else if ( EQUAL ( pszValue, CF_PT_ORTHOGRAPHIC ) ) { dfCenterLon = poDS->FetchCopyParm( szGridMappingValue, - LON_PROJ_ORIGIN, 0.0 ); + CF_PP_LON_PROJ_ORIGIN, 0.0 ); dfCenterLat = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); oSRS.SetOrthographic( dfCenterLat, dfCenterLon, dfFalseEasting, dfFalseNorthing ); @@ -1367,28 +1367,28 @@ void netCDFDataset::SetProjection( int var ) /* Polar Stereographic */ /* -------------------------------------------------------------------- */ - else if ( EQUAL ( pszValue, POLAR_STEREO ) ) { + else if ( EQUAL ( pszValue, CF_PT_POLAR_STEREO ) ) { dfCenterLon = poDS->FetchCopyParm( szGridMappingValue, - LON_PROJ_ORIGIN, 0.0 ); + CF_PP_LON_PROJ_ORIGIN, 0.0 ); dfCenterLat = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfScale = poDS->FetchCopyParm( szGridMappingValue, - SCALE_FACTOR_ORIGIN, + CF_PP_SCALE_FACTOR_ORIGIN, 1.0 ); dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); oSRS.SetPS( dfCenterLat, dfCenterLon, dfScale, dfFalseEasting, dfFalseNorthing ); @@ -1401,28 +1401,28 @@ void netCDFDataset::SetProjection( int var ) /* Stereographic */ /* -------------------------------------------------------------------- */ - else if ( EQUAL ( pszValue, STEREO ) ) { + else if ( EQUAL ( pszValue, CF_PT_STEREO ) ) { dfCenterLon = poDS->FetchCopyParm( szGridMappingValue, - LON_PROJ_ORIGIN, 0.0 ); + CF_PP_LON_PROJ_ORIGIN, 0.0 ); dfCenterLat = poDS->FetchCopyParm( szGridMappingValue, - LAT_PROJ_ORIGIN, 0.0 ); + CF_PP_LAT_PROJ_ORIGIN, 0.0 ); dfScale = poDS->FetchCopyParm( szGridMappingValue, - SCALE_FACTOR_ORIGIN, + CF_PP_SCALE_FACTOR_ORIGIN, 1.0 ); dfFalseEasting = poDS->FetchCopyParm( szGridMappingValue, - FALSE_EASTING, 0.0 ); + CF_PP_FALSE_EASTING, 0.0 ); dfFalseNorthing = poDS->FetchCopyParm( szGridMappingValue, - FALSE_NORTHING, 0.0 ); + CF_PP_FALSE_NORTHING, 0.0 ); oSRS.SetStereographic( dfCenterLat, dfCenterLon, dfScale, dfFalseEasting, dfFalseNorthing ); @@ -1635,7 +1635,7 @@ void netCDFDataset::SetProjection( int var ) if( !EQUAL( szGridMappingValue, "" ) ) { strcpy( szTemp,szGridMappingValue); strcat( szTemp, "#" ); - strcat( szTemp, "spatial_ref"); + strcat( szTemp, NCDF_SPATIAL_REF); pszWKT = CSLFetchNameValue(poDS->papszMetadata, szTemp); if( pszWKT != NULL ) { @@ -1644,7 +1644,7 @@ void netCDFDataset::SetProjection( int var ) strcpy(szTemp,szGridMappingValue); strcat( szTemp, "#" ); - strcat( szTemp, "GeoTransform"); + strcat( szTemp, NCDF_GEOTRANSFORM); pszGeoTransform = CSLFetchNameValue(poDS->papszMetadata, szTemp); @@ -1794,7 +1794,7 @@ CPLErr netCDFDataset::ReadAttributes( int cdfid, int var) nc_type nAttrType; size_t nAttrLen, m; int nbAttr; - char szTemp[ MAX_STR_LEN ]; + char szTemp[ NCDF_MAX_STR_LEN ]; nc_inq_varnatts( cdfid, var, &nbAttr ); if( var == NC_GLOBAL ) { @@ -2433,9 +2433,9 @@ void CopyMetadata( void *poDS, int fpImage, int CDFVarID ) { char **papszMetadata; char **papszFieldData; const char *pszField; - char szMetaName[ MAX_STR_LEN ]; - char szMetaValue[ MAX_STR_LEN ]; - char szTemp[ MAX_STR_LEN ]; + char szMetaName[ NCDF_MAX_STR_LEN ]; + char szMetaValue[ NCDF_MAX_STR_LEN ]; + char szTemp[ NCDF_MAX_STR_LEN ]; int nItems; int bCopyItem; @@ -2501,9 +2501,9 @@ void CopyMetadata( void *poDS, int fpImage, int CDFVarID ) { if ( strncmp( szMetaName, "NETCDF_VARNAME", 14) == 0 ) bCopyItem = FALSE; /* Remove add_offset and scale_factor, but set them later from band data */ - else if ( strcmp( szMetaName, NCDF_ADD_OFFSET ) == 0 ) + else if ( strcmp( szMetaName, CF_ADD_OFFSET ) == 0 ) bCopyItem = FALSE; - else if ( strcmp( szMetaName, NCDF_SCALE_FACTOR ) == 0 ) + else if ( strcmp( szMetaName, CF_SCALE_FACTOR ) == 0 ) bCopyItem = FALSE; } @@ -2573,35 +2573,25 @@ void CopyMetadata( void *poDS, int fpImage, int CDFVarID ) { papszMetadata = GDALGetMetadata( (GDALDataset *) poDS,""); - nc_put_att_text( fpImage, - NC_GLOBAL, - "Conventions", - 6, - "CF-1.2" ); - - // pszField = GDALVersionInfo("--version"); - // nc_put_att_text( fpImage, - // NC_GLOBAL, - // "GDAL", - // strlen(pszField), - // pszField ); + nc_put_att_text( fpImage, NC_GLOBAL, "Conventions", + strlen(NCDF_CONVENTIONS_CF), + NCDF_CONVENTIONS_CF ); + + nc_put_att_text( fpImage, NC_GLOBAL, "GDAL", + strlen(NCDF_GDAL), NCDF_GDAL ); } + /* Set add_offset and scale_factor here if needed */ else { int bGotAddOffset, bGotScale; double dfAddOffset = GDALGetRasterOffset( (GDALRasterBandH) poDS, &bGotAddOffset ); double dfScale = GDALGetRasterScale( (GDALRasterBandH) poDS, &bGotScale ); + if ( bGotAddOffset && dfAddOffset != 0.0 && bGotScale && dfScale != 1.0 ) { - nc_put_att_double( fpImage, CDFVarID, - NCDF_ADD_OFFSET, - NC_DOUBLE, - 1, - &dfAddOffset ); - nc_put_att_double( fpImage, CDFVarID, - NCDF_SCALE_FACTOR, - NC_DOUBLE, - 1, - &dfScale ); + nc_put_att_double( fpImage, CDFVarID, CF_ADD_OFFSET, + NC_DOUBLE, 1, &dfAddOffset ); + nc_put_att_double( fpImage, CDFVarID, CF_SCALE_FACTOR, + NC_DOUBLE, 1, &dfScale ); } } @@ -2629,8 +2619,8 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, int bWriteGeoTransform = FALSE; char pszNetcdfProjection[ NC_MAX_NAME ]; - char pszXDimName[ MAX_STR_LEN ]; - char pszYDimName[ MAX_STR_LEN ]; + char pszXDimName[ NCDF_MAX_STR_LEN ]; + char pszYDimName[ NCDF_MAX_STR_LEN ]; if (nBands == 0) { @@ -2722,8 +2712,8 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, double dfNN, dfSN=0.0, dfEE=0.0, dfWE=0.0; double adfGeoTransform[6]; - char szGeoTransform[ MAX_STR_LEN ]; - char szTemp[ MAX_STR_LEN ]; + char szGeoTransform[ NCDF_MAX_STR_LEN ]; + char szTemp[ NCDF_MAX_STR_LEN ]; double dfX0=0.0, dfDX=0.0, dfY0=0.0, dfDY=0.0; double dfTemp=0.0; @@ -2775,7 +2765,7 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, 0, NULL, &NCDFVarID ); nc_put_att_text( fpImage, NCDFVarID, - GRD_MAPPING_NAME, + CF_GRD_MAPPING_NAME, strlen("latitude_longitude"), "latitude_longitude" ); dfTemp = oSRS.GetPrimeMeridian(); @@ -2922,8 +2912,8 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, double dfEE=0.0; double dfWE=0.0; double adfGeoTransform[6]; - char szGeoTransform[ MAX_STR_LEN ]; - char szTemp[ MAX_STR_LEN ]; + char szGeoTransform[ NCDF_MAX_STR_LEN ]; + char szTemp[ NCDF_MAX_STR_LEN ]; /* netcdf standard is bottom-up, but leave it top first for now */ bBottomUp = FALSE; @@ -2999,7 +2989,7 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, szGeoTransform ); nc_put_att_text( fpImage, NCDFVarID, - GRD_MAPPING_NAME, + CF_GRD_MAPPING_NAME, strlen( pszNetcdfProjection ), pszNetcdfProjection ); @@ -3065,8 +3055,8 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, float *pafScanline = NULL; double *padScanline = NULL; int NCDFVarID; - size_t start[ GDALNBDIM ]; - size_t count[ GDALNBDIM ]; + size_t start[ NCDF_NBDIM ]; + size_t count[ NCDF_NBDIM ]; double dfNoDataValue; unsigned char cNoDataValue; float fNoDataValue; @@ -3112,7 +3102,7 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, CPLDebug( "GDAL_netCDF", "%s = GDT_Byte ", szBandName ); status = nc_def_var( fpImage, szBandName, NC_BYTE, - GDALNBDIM, anBandDims, &NCDFVarID ); + NCDF_NBDIM, anBandDims, &NCDFVarID ); /* -------------------------------------------------------------------- */ @@ -3172,7 +3162,7 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, } else if( ( eDT == GDT_UInt16 ) || ( eDT == GDT_Int16 ) ) { CPLDebug( "GDAL_netCDF", "%s = GDT_Int16 ",szBandName ); status = nc_def_var( fpImage, szBandName, NC_SHORT, - GDALNBDIM, anBandDims, &NCDFVarID ); + NCDF_NBDIM, anBandDims, &NCDFVarID ); pasScanline = (GInt16 *) CPLMalloc( nBands * nXSize * sizeof( GInt16 ) ); @@ -3214,7 +3204,7 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, } else if( (eDT == GDT_UInt32) || (eDT == GDT_Int32) ) { CPLDebug( "GDAL_netCDF", "%s = GDT_Int32 ",szBandName ); status = nc_def_var( fpImage, szBandName, NC_INT, - GDALNBDIM, anBandDims, &NCDFVarID ); + NCDF_NBDIM, anBandDims, &NCDFVarID ); panScanline = (GInt32 *) CPLMalloc( nBands * nXSize * sizeof( GInt32 ) ); @@ -3258,7 +3248,7 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, } else if( (eDT == GDT_Float32) ) { CPLDebug( "GDAL_netCDF", "%s = GDT_Float32 ",szBandName ); status = nc_def_var( fpImage, szBandName, NC_FLOAT, - GDALNBDIM, anBandDims, &NCDFVarID ); + NCDF_NBDIM, anBandDims, &NCDFVarID ); pafScanline = (float *) CPLMalloc( nBands * nXSize * sizeof( float ) ); @@ -3302,7 +3292,7 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, } else if( (eDT == GDT_Float64) ) { CPLDebug( "GDAL_netCDF", "%s = GDT_Float64 ",szBandName ); status = nc_def_var( fpImage, szBandName, NC_DOUBLE, - GDALNBDIM, anBandDims, &NCDFVarID ); + NCDF_NBDIM, anBandDims, &NCDFVarID ); padScanline = (double *) CPLMalloc( nBands * nXSize * sizeof( double ) ); @@ -3347,12 +3337,12 @@ NCDFCreateCopy( const char * pszFilename, GDALDataset *poSrcDS, /* -------------------------------------------------------------------- */ if( bWriteGeoTransform == TRUE ) { /* nc_put_att_text( fpImage, NCDFVarID, - COORDINATES, + CF_COORDINATES, 7, LONLAT ); */ nc_put_att_text( fpImage, NCDFVarID, - GRD_MAPPING, + CF_GRD_MAPPING, strlen( pszNetcdfProjection ), pszNetcdfProjection ); } @@ -3421,168 +3411,3 @@ void GDALRegister_netCDF() } } - - -/* -------------------------------------------------------------------- */ -/* Set Lambert Conformal Conic Projection */ -/* -------------------------------------------------------------------- */ - - - -//Albers equal area -// -//grid_mapping_name = albers_conical_equal_area -// -//Map parameters: -// -// * standard_parallel - There may be 1 or 2 values. -// * longitude_of_central_meridian -// * latitude_of_projection_origin -// * false_easting -// * false_northing -//Azimuthal equidistant -// -//grid_mapping_name = azimuthal_equidistant -// -//Map parameters: -// -// * longitude_of_projection_origin -// * latitude_of_projection_origin -// * false_easting -// * false_northing -//Lambert azimuthal equal area -// -//grid_mapping_name = lambert_azimuthal_equal_area -// -//Map parameters: -// -// * longitude_of_projection_origin -// * latitude_of_projection_origin -// * false_easting -// * false_northing -//Lambert conformal -// -//grid_mapping_name = lambert_conformal_conic -// -//Map parameters: -// -// * standard_parallel - There may be 1 or 2 values. -// * longitude_of_central_meridian -// * latitude_of_projection_origin -// * false_easting -// * false_northing -//Lambert Cylindrical Equal Area -// -//grid_mapping_name = lambert_cylindrical_equal_area -// -//Map parameters: -// -// * longitude_of_central_meridian -// * either standard_parallel or scale_factor_at_projection_origin -// * false_easting -// * false_northing -//Latitude-Longitude -// -//grid_mapping_name = latitude_longitude -// -//Map parameters: -// -// * None -//Mercator -// -//grid_mapping_name = mercator -// -//Map parameters: -// -// * longitude_of_projection_origin -// * either standard_parallel or scale_factor_at_projection_origin -// * false_easting -// * false_northing -//Orthographic -// -//grid_mapping_name = orthographic -// -//Map parameters: -// -// * longitude_of_projection_origin -// * latitude_of_projection_origin -// * false_easting -// * false_northing -//Polar stereographic -// -//grid_mapping_name = polar_stereographic -// -//Map parameters: -// -// * straight_vertical_longitude_from_pole -// * latitude_of_projection_origin - Either +90. or -90. -// * Either standard_parallel or scale_factor_at_projection_origin -// * false_easting -// * false_northing -//Rotated pole -// -//grid_mapping_name = rotated_latitude_longitude -// -//Map parameters: -// -// * grid_north_pole_latitude -// * grid_north_pole_longitude -// * north_pole_grid_longitude - This parameter is optional (default is 0.). -//Stereographic -// -//grid_mapping_name = stereographic -// -//Map parameters: -// -// * longitude_of_projection_origin -// * latitude_of_projection_origin -// * scale_factor_at_projection_origin -// * false_easting -// * false_northing -//Transverse Mercator -// -//grid_mapping_name = transverse_mercator -// -//Map parameters: -// -// * scale_factor_at_central_meridian -// * longitude_of_central_meridian -// * latitude_of_projection_origin -// * false_easting -// * false_northing -//Vertical perspective -// -//grid_mapping_name = vertical_perspective -// -//Map parameters: -// -// * latitude_of_projection_origin -// * longitude_of_projection_origin -// * perspective_point_height -// * false_easting -// * false_northing -// -// -//Grid mapping attributes -// -//earth_radius -//false_easting -//false_northing -//grid_mapping_name -//grid_north_pole_latitude -//grid_north_pole_longitude -//inverse_flattening -//latitude_of_projection_origin -//longitude_of_central_meridian -//longitude_of_prime_meridian -//longitude_of_projection_origin -//north_pole_grid_longitude -//perspective_point_height -//scale_factor_at_central_meridian -//scale_factor_at_projection_origin -//semi_major_axis -//semi_minor_axis -//standard_parallel -//straight_vertical_longitude_from_pole - - diff --git a/frmts/netcdf/netcdfdataset.h b/frmts/netcdf/netcdfdataset.h index 8f7ac6cedd8a..2f75af8e2df8 100644 --- a/frmts/netcdf/netcdfdataset.h +++ b/frmts/netcdf/netcdfdataset.h @@ -41,60 +41,30 @@ /************************************************************************/ /* ==================================================================== */ -/* netCDFDataset */ +/* defines */ /* ==================================================================== */ /************************************************************************/ -#define MAX_STR_LEN 8192 -#define AEA "albers_conical_equal_area" -#define AE "azimuthal_equidistant" -#define CEA "cylindrical_equal_area" -#define LCEA "lambert_cylindrical_equal_area" -#define L_C_CONIC "lambert_conformal_conic" -#define TM "transverse_mercator" -#define LAEA "lambert_azimuthal_equal_area" -#define GRD_MAPPING_NAME "grid_mapping_name" -#define GRD_MAPPING "grid_mapping" -#define COORDINATES "coordinates" -#define LONLAT "lon lat" -#define LATITUDE_LONGITUDE "latitude_longitude" -#define MERCATOR "mercator" -#define ORTHOGRAPHIC "orthographic" -#define POLAR_STEREO "polar_stereographic" -#define STEREO "stereographic" - -#define STD_PARALLEL "standard_parallel" -#define STD_PARALLEL_1 "standard_parallel_1" -#define STD_PARALLEL_2 "standard_parallel_2" -#define CENTRAL_MERIDIAN "central_meridian" -#define LONG_CENTRAL_MERIDIAN "longitude_of_central_meridian" -#define LON_PROJ_ORIGIN "longitude_of_projection_origin" -#define LAT_PROJ_ORIGIN "latitude_of_projection_origin" -#define SCALE_FACTOR_ORIGIN "scale_factor_at_projection_origin" -#define PROJ_X_ORIGIN "projection_x_coordinate_origin" -#define PROJ_Y_ORIGIN "projection_y_coordinate_origin" -#define EARTH_SHAPE "GRIB_earth_shape" -#define EARTH_SHAPE_CODE "GRIB_earth_shape_code" -#define SCALE_FACTOR "scale_factor_at_central_meridian" -#define FALSE_EASTING "false_easting" -#define FALSE_NORTHING "false_northing" -#define EARTH_RADIUS "earth_radius" -#define INVERSE_FLATTENING "inverse_flattening" -#define LONG_PRIME_MERIDIAN "longitude_of_prime_meridian" -#define SEMI_MAJOR_AXIS "semi_major_axis" -#define SEMI_MINOR_AXIS "semi_minor_axis" - -#define STD_NAME "standard_name" -#define LNG_NAME "long_name" -#define UNITS "units" -#define AXIS "axis" -#define BOUNDS "bounds" -#define ORIG_AXIS "original_units" - -#define GDALNBDIM 2 - -/* netcdf file types, as in libcdi/cdo */ + +/* -------------------------------------------------------------------- */ +/* Driver-specific defines */ +/* -------------------------------------------------------------------- */ + +/* GDAL or NETCDF driver defs */ +#define NCDF_MAX_STR_LEN 8192 +#define NCDF_CONVENTIONS_CF "CF-1.5" +#define NCDF_GDAL GDALVersionInfo("--version") +#define NCDF_NBDIM 2 +#define NCDF_SPATIAL_REF "spatial_ref" +#define NCDF_GEOTRANSFORM "GeoTransform" +#define NCDF_DIMNAME_X "x" +#define NCDF_DIMNAME_Y "y" +#define NCDF_DIMNAME_LON "lon" +#define NCDF_DIMNAME_LAT "lat" +#define NCDF_LONLAT "lon lat" + +/* netcdf file types, as in libcdi/cdo and compat w/netcdf.h */ #define NCDF_FILETYPE_NONE 0 /* Not a netCDF file */ -#define NCDF_FILETYPE_NC 1 /* File type netCDF */ +#define NCDF_FILETYPE_NC 1 /* File type netCDF */ #define NCDF_FILETYPE_NC2 2 /* File type netCDF version 2 (64-bit) */ #define NCDF_FILETYPE_NC4 3 /* File type netCDF version 4 */ #define NCDF_FILETYPE_NC4C 4 /* File type netCDF version 4 (classic) - not used yet */ @@ -102,8 +72,102 @@ #define NCDF_FILETYPE_HDF5 5 #define NCDF_FILETYPE_UNKNOWN 10 /* Filetype not determined (yet) */ -#define NCDF_ADD_OFFSET "add_offset" -#define NCDF_SCALE_FACTOR "scale_factor" +/* compression parameters */ +#define NCDF_COMPRESS_NONE 0 +/* TODO */ +/* http://www.unidata.ucar.edu/software/netcdf/docs/BestPractices.html#Packed%20Data%20Values */ +#define NCDF_COMPRESS_PACKED 1 +#define NCDF_COMPRESS_DEFLATE 2 +#define NCDF_DEFLATE_LEVEL 1 /* best time/size ratio */ +#define NCDF_COMPRESS_SZIP 3 /* no support for writting */ + +/* helper inline function for libnetcdf errors */ +/* how can we make this a multi-line define ? */ +//#define NCDF_ERR(status) ( if ( status != NC_NOERR ) +//{ CPLError( CE_Failure, CPLE_AppDefined, "netcdf error #%d : %s .\n", status, nc_strerror(status) ); } ) +void NCDF_ERR(int status) { if ( status != NC_NOERR ) { + CPLError( CE_Failure, CPLE_AppDefined, + "netcdf error #%d : %s .\n", + status, nc_strerror(status) ); } } + +/* -------------------------------------------------------------------- */ +/* CF or NUG (NetCDF User's Guide) defs */ +/* -------------------------------------------------------------------- */ + +/* CF: http://cf-pcmdi.llnl.gov/documents/cf-conventions/1.5/cf-conventions.html */ +/* NUG: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf.html#Variables */ +#define CF_STD_NAME "standard_name" +#define CF_LNG_NAME "long_name" +#define CF_UNITS "units" +#define CF_ADD_OFFSET "add_offset" +#define CF_SCALE_FACTOR "scale_factor" +/* should be SRS_UL_METER but use meter now for compat with gtiff files */ +#define CF_UNITS_M "metre" +#define CF_UNITS_D SRS_UA_DEGREE +#define CF_PROJ_X_COORD "projection_x_coordinate" +#define CF_PROJ_Y_COORD "projection_y_coordinate" +#define CF_GRD_MAPPING_NAME "grid_mapping_name" +#define CF_GRD_MAPPING "grid_mapping" +#define CF_COORDINATES "coordinates" +/* #define CF_AXIS "axis" */ +/* #define CF_BOUNDS "bounds" */ +/* #define CF_ORIG_UNITS "original_units" */ + +/* -------------------------------------------------------------------- */ +/* CF-1 convention standard variables related to */ +/* mapping & projection - see http://cf-pcmdi.llnl.gov/ */ +/* -------------------------------------------------------------------- */ + +/* projection types */ +#define CF_PT_AEA "albers_conical_equal_area" +#define CF_PT_AE "azimuthal_equidistant" +#define CF_PT_CEA "cylindrical_equal_area" +#define CF_PT_LAEA "lambert_azimuthal_equal_area" +#define CF_PT_LCEA "lambert_cylindrical_equal_area" +#define CF_PT_LCC "lambert_conformal_conic" +#define CF_PT_TM "transverse_mercator" +#define CF_PT_LATITUDE_LONGITUDE "latitude_longitude" +#define CF_PT_MERCATOR "mercator" +#define CF_PT_ORTHOGRAPHIC "orthographic" +#define CF_PT_POLAR_STEREO "polar_stereographic" +#define CF_PT_STEREO "stereographic" + +/* projection parameters */ +#define CF_PP_STD_PARALLEL "standard_parallel" +/* CF uses only "standard_parallel" */ +#define CF_PP_STD_PARALLEL_1 "standard_parallel_1" +#define CF_PP_STD_PARALLEL_2 "standard_parallel_2" +#define CF_PP_CENTRAL_MERIDIAN "central_meridian" +#define CF_PP_LONG_CENTRAL_MERIDIAN "longitude_of_central_meridian" +#define CF_PP_LON_PROJ_ORIGIN "longitude_of_projection_origin" +#define CF_PP_LAT_PROJ_ORIGIN "latitude_of_projection_origin" +/* #define PROJ_X_ORIGIN "projection_x_coordinate_origin" */ +/* #define PROJ_Y_ORIGIN "projection_y_coordinate_origin" */ +#define CF_PP_EARTH_SHAPE "GRIB_earth_shape" +#define CF_PP_EARTH_SHAPE_CODE "GRIB_earth_shape_code" +/* scale_factor is not CF, there are two possible translations */ +/* for WKT scale_factor : SCALE_FACTOR_MERIDIAN and SCALE_FACTOR_ORIGIN */ +/* TODO add both in generic mapping, remove CF_PP_SCALE_FACTOR */ +#define SCALE_FACTOR "scale_factor" /* TODO: this has to go */ +#define CF_PP_SCALE_FACTOR_MERIDIAN "scale_factor_at_central_meridian" +#define CF_PP_SCALE_FACTOR_ORIGIN "scale_factor_at_projection_origin" +#define CF_PP_VERT_LONG_FROM_POLE "straight_vertical_longitude_from_pole" +#define CF_PP_FALSE_EASTING "false_easting" +#define CF_PP_FALSE_NORTHING "false_northing" +#define CF_PP_EARTH_RADIUS "earth_radius" +#define CF_PP_EARTH_RADIUS_OLD "spherical_earth_radius_meters" +#define CF_PP_INVERSE_FLATTENING "inverse_flattening" +#define CF_PP_LONG_PRIME_MERIDIAN "longitude_of_prime_meridian" +#define CF_PP_SEMI_MAJOR_AXIS "semi_major_axis" +#define CF_PP_SEMI_MINOR_AXIS "semi_minor_axis" +#define CF_PP_VERT_PERSP "vertical_perspective" /*not used yet */ + + +/************************************************************************/ +/* ==================================================================== */ +/* netCDFDataset */ +/* ==================================================================== */ +/************************************************************************/ typedef struct { const char *netCDFSRS; @@ -146,15 +210,15 @@ static const oNetcdfSRS poNetcdfSRS[] = { {"transverse_mercator", SRS_PT_TRANSVERSE_MERCATOR }, {"TM_south_oriented", SRS_PT_TRANSVERSE_MERCATOR_SOUTH_ORIENTED }, - {LONG_CENTRAL_MERIDIAN, SRS_PP_CENTRAL_MERIDIAN }, + {CF_PP_LONG_CENTRAL_MERIDIAN, SRS_PP_CENTRAL_MERIDIAN }, {SCALE_FACTOR, SRS_PP_SCALE_FACTOR }, - {STD_PARALLEL_1, SRS_PP_STANDARD_PARALLEL_1 }, - {STD_PARALLEL_2, SRS_PP_STANDARD_PARALLEL_2 }, + {CF_PP_STD_PARALLEL_1, SRS_PP_STANDARD_PARALLEL_1 }, + {CF_PP_STD_PARALLEL_2, SRS_PP_STANDARD_PARALLEL_2 }, {"longitude_of_central_meridian", SRS_PP_LONGITUDE_OF_CENTER }, {"longitude_of_projection_origin", SRS_PP_LONGITUDE_OF_ORIGIN }, {"latitude_of_projection_origin", SRS_PP_LATITUDE_OF_ORIGIN }, - {FALSE_EASTING, SRS_PP_FALSE_EASTING }, - {FALSE_NORTHING, SRS_PP_FALSE_NORTHING }, + {CF_PP_FALSE_EASTING, SRS_PP_FALSE_EASTING }, + {CF_PP_FALSE_NORTHING, SRS_PP_FALSE_NORTHING }, {NULL, NULL }, };