diff -Naur gdal-1.6.2/frmts/netcdf/netcdfdataset.cpp gdal-1.6.2-tbouffon/frmts/netcdf/netcdfdataset.cpp
--- gdal-1.6.2/frmts/netcdf/netcdfdataset.cpp	2009-01-24 21:17:32.000000000 +0100
+++ gdal-1.6.2-tbouffon/frmts/netcdf/netcdfdataset.cpp	2009-11-02 16:53:25.000000000 +0100
@@ -496,7 +496,12 @@
 /* -------------------------------------------------------------------- */
 	
     start[nBandXPos] = 0;          // x dim can move arround in array
-    start[nBandYPos] = nBlockYOff; // y
+    // check y order
+    if( ( ( netCDFDataset *) poDS )->bBottomUp ) {
+        start[nBandYPos] = ( ( netCDFDataset * ) poDS )->ydim - 1 - nBlockYOff;
+    } else {
+        start[nBandYPos] = nBlockYOff; // y
+    }
         
     edge[nBandXPos] = nBlockXSize; 
     edge[nBandYPos] = 1;
@@ -597,6 +602,7 @@
     papszName        = NULL;
     pszFilename      = NULL;
     cdfid             = 0;
+    bBottomUp        = FALSE;
 }
 
 
@@ -680,6 +686,7 @@
     double       *pdfXCoord;
     double       *pdfYCoord;
     char         szDimNameX[ MAX_NC_NAME ];
+    char         szDimNameY[ MAX_NC_NAME ];
     int          nSpacingBegin;
     int          nSpacingMiddle;
     int          nSpacingLast;
@@ -730,6 +737,11 @@
 	szDimNameX[i] = tolower( ( poDS->papszDimName[poDS->nDimXid] )[i] );
     }
     szDimNameX[3] = '\0';
+    for( i = 0; (i < strlen( poDS->papszDimName[ poDS->nDimYid ] )  && 
+		 i < 3 ); i++ ) {
+	szDimNameY[i] = tolower( ( poDS->papszDimName[poDS->nDimYid] )[i] );
+    }
+    szDimNameY[3] = '\0';
 
 /* -------------------------------------------------------------------- */
 /*      Read grid_mappinginformation and set projections               */
@@ -1019,8 +1031,14 @@
                     yMinMax[1] = pdfYCoord[ydim-1];
                     node_offset = 0;
                 }
+                /* for CF-1 conventions, assume bottom first */
+		char tmpstring[NC_MAX_NAME];
+		if (CSLFetchNameValue(poDS->papszMetadata,"y#long_name") != NULL) {strcpy(tmpstring,CSLFetchNameValue(poDS->papszMetadata,"y#long_name")) ;}
+                if( (EQUAL(tmpstring,"Latitude")||EQUAL( szDimNameY, "lat"))  && pdfYCoord[0] < pdfYCoord[1] ) {
+                   poDS->bBottomUp = TRUE;
+                   fprintf(stderr,"%s\n", "Grille créée avec GMT et l'option -fg -> retournement") ;}
+                else {fprintf(stderr,"Cette grille a été créée avec GMT, avec la commande :\n%s\nL'option -fg (voir man xyz2grd par exemple) n'a pas été utilisée.Si les données sont en Lat/lon, la grille risque d'être tête en bas\n",CSLFetchNameValue(poDS->papszMetadata,"NC_GLOBAL#history"));}
 
-#ifdef notdef
                 // Check for reverse order of y-coordinate
                 if ( yMinMax[0] > yMinMax[1] ) {
                     dummy[0] = yMinMax[1];
@@ -1028,7 +1046,6 @@
                     yMinMax[0] = dummy[0];
                     yMinMax[1] = dummy[1];
                 }
-#endif
 
                 poDS->adfGeoTransform[0] = xMinMax[0];
                 poDS->adfGeoTransform[2] = 0;
diff -Naur gdal-1.6.2/frmts/netcdf/netcdfdataset.h gdal-1.6.2-tbouffon/frmts/netcdf/netcdfdataset.h
--- gdal-1.6.2/frmts/netcdf/netcdfdataset.h	2008-11-06 23:51:54.000000000 +0100
+++ gdal-1.6.2-tbouffon/frmts/netcdf/netcdfdataset.h	2009-10-29 15:28:37.000000000 +0100
@@ -158,6 +158,7 @@
     int          *paDimIds;
     size_t        xdim, ydim;
     int           nDimXid, nDimYid;
+    bool          bBottomUp;
 
 		netCDFDataset( );
 		~netCDFDataset( );

