--- hdf4imagedataset.cpp.orig	2008-02-14 06:25:46.000000000 -0900
+++ hdf4imagedataset.cpp	2008-04-22 14:56:05.000000000 -0800
@@ -2239,7 +2239,10 @@
 GDALDataset *HDF4ImageDataset::Open( GDALOpenInfo * poOpenInfo )
 {
     int     i;
-    
+    const char  *pszValue;
+    const char *pszGeoTransform;
+    char **papszGeoTransform=NULL;
+
     if( !EQUALN( poOpenInfo->pszFilename, "HDF4_SDS:", 9 ) &&
         !EQUALN( poOpenInfo->pszFilename, "HDF4_GR:", 8 ) &&
         !EQUALN( poOpenInfo->pszFilename, "HDF4_GD:", 8 ) &&
@@ -2822,8 +2825,6 @@
 /* -------------------------------------------------------------------- */
       case GDAL_HDF4:
       {
-          const char  *pszValue;
-
           CPLDebug( "HDF4Image",
                     "Input dataset interpreted as GDAL_HDF4" );
 
@@ -3011,7 +3012,84 @@
 
     poDS->TryLoadXML();
 
-    return( poDS );
+
+/* -------------------------------------------------------------------- */
+/*      Look for spatial_ref                                            */
+/* -------------------------------------------------------------------- */
+      pszValue = CSLFetchNameValue( poDS->papszGlobalMetadata, "spatial_ref" );
+      if( pszValue) {
+            CPLDebug( "HDF4Image", "Found spatial_ref.  Loading..." );
+	    pszValue = CPLUnescapeString( pszValue, NULL, CPLES_BackslashQuotable );
+	    if ( strncmp(pszValue,"GEOGCS",6) != 0
+		 && strncmp(pszValue,"PROJCS",6) != 0
+		 && strncmp(pszValue,"LOCAL_CS",8) != 0 ) {
+	      if ( poDS->oSRS.SetFromUserInput( pszValue ) != OGRERR_NONE ) {
+		CPLError( CE_Warning, CPLE_AppDefined,
+			  "Failed to recognise 'spatial_ref' value of: %s", pszValue );
+	      } else {
+		poDS->oSRS.exportToWkt( &(poDS->pszProjection) );
+	      }
+	    } else {
+	      poDS->pszProjection = strdup( pszValue );
+	    }
+	    
+	    pszGeoTransform = CSLFetchNameValue( poDS->papszGlobalMetadata, "GeoTransform" );
+	    
+/* -------------------------------------------------------------------- */
+/*      Look for GeoTransform Array                                     */
+/* -------------------------------------------------------------------- */
+	    if( pszGeoTransform != NULL ) {
+		papszGeoTransform = CSLTokenizeString2( pszGeoTransform,
+							" ", 
+							CSLT_HONOURSTRINGS );
+		
+                poDS->bHasGeoTransform = TRUE;
+		poDS->adfGeoTransform[0] = atof( papszGeoTransform[0] );
+		poDS->adfGeoTransform[1] = atof( papszGeoTransform[1] );
+		poDS->adfGeoTransform[2] = atof( papszGeoTransform[2] );
+		poDS->adfGeoTransform[3] = atof( papszGeoTransform[3] );
+		poDS->adfGeoTransform[4] = atof( papszGeoTransform[4] );
+		poDS->adfGeoTransform[5] = atof( papszGeoTransform[5] );
+	    }
+      }
+
+/* -------------------------------------------------------------------- */
+/*      Look for corner array values                                    */
+/* -------------------------------------------------------------------- */
+      if (!poDS->bHasGeoTransform) {
+	    double dfNN, dfSN, dfEE, dfWE;
+	    pszValue = CSLFetchNameValue( poDS->papszGlobalMetadata, "Northernmost_Northing" );
+	    if( pszValue != NULL ) {
+	      dfNN = atof( pszValue );
+	    }
+	    pszValue = CSLFetchNameValue( poDS->papszGlobalMetadata, "Southernmost_Northing" );
+	    if( pszValue != NULL ) {
+	      dfSN = atof( pszValue );
+	    }
+	    pszValue = CSLFetchNameValue( poDS->papszGlobalMetadata, "Easternmost_Easting" );
+	    if( pszValue != NULL ) {
+	      dfEE = atof( pszValue );
+	    }
+	    pszValue = CSLFetchNameValue( poDS->papszGlobalMetadata, "Westernmost_Easting" );
+	    if( pszValue != NULL ) {
+	      dfWE = atof( pszValue );
+	    }
+	    
+	    poDS->adfGeoTransform[0] = dfWE;
+	    poDS->adfGeoTransform[1] = (dfEE - dfWE) / 
+	      ( poDS->GetRasterXSize() );
+	    poDS->adfGeoTransform[2] = 0.0;
+	    poDS->adfGeoTransform[3] = dfNN;
+	    poDS->adfGeoTransform[4] = 0.0;
+	    poDS->adfGeoTransform[5] = (dfSN - dfNN) / 
+	      ( poDS->GetRasterYSize() );
+	    
+	    poDS->bHasGeoTransform = TRUE;
+      }
+      
+      CSLDestroy( papszGeoTransform );
+      
+      return( poDS );
 }
 
 /************************************************************************/

