<html><div style='background-color:'><DIV class=RTE>
<P>Hello Frank,</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; It does not fail in a sense that it crashes, it just doesn't do anything&nbsp;to the image as was the case before I added projection to be latlong. The pszSrcWKT, and pszDstWKT seem to correct, and the functions that compose the latter do not complain either.&nbsp;Here is the code I use, I apologize for the mess, don't want to erase experimental lines:</P>
<P>void CTest01Dlg::OnButtonProcess() <BR>{<BR>&nbsp;// ------------ Example of initializing an image into the GDALDataset object<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; GDALDataset&nbsp; *poDataset;</P>
<P>&nbsp;&nbsp;&nbsp; // -------------- Reprojection example</P>
<P>&nbsp;GDALDatasetH&nbsp; hSrcDS, hDstDS; //, hRefDS;</P>
<P>&nbsp;&nbsp;&nbsp; // Open input and output files. </P>
<P>&nbsp;&nbsp;&nbsp; GDALAllRegister();</P>
<P>&nbsp;&nbsp;&nbsp; hSrcDS = GDALOpen( fileNameIn, GA_ReadOnly );<BR>&nbsp;//hRefDS = GDALOpen( fileNameRef, GA_ReadOnly );</P>
<P><BR>&nbsp;//AfxMessageBox(str.Format("%d\n",hSrcDS-&gt;GetGCPCount()));</P>
<P>&nbsp;poDataset = (GDALDataset *) hSrcDS;<BR>&nbsp;&nbsp;&nbsp; if( poDataset == NULL )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CTest01Dlg::SendDlgItemMessage(IDC_LIST_STATUS, LB_ADDSTRING, 0, (LPARAM)strcat("The input file does not exist: ", fileNameIn));<BR>&nbsp;&nbsp;exit(1);<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;GDALDriverH hDriver;<BR>&nbsp;&nbsp;&nbsp; GDALDataType eDT;</P>
<P>&nbsp;&nbsp;&nbsp; // Open the source file. </P>
<P>&nbsp;&nbsp;&nbsp; CPLAssert( hSrcDS != NULL );<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; // Create output with same datatype as first input band. </P>
<P>&nbsp;&nbsp;&nbsp; eDT = GDALGetRasterDataType(GDALGetRasterBand(hSrcDS,1));</P>
<P>&nbsp;//CString str;<BR>&nbsp;//str.Format("%d\n",eDT);<BR>&nbsp;//AfxMessageBox(str);</P>
<P>&nbsp;&nbsp;&nbsp; // Get output driver (GeoTIFF format)</P>
<P>&nbsp;&nbsp;&nbsp; hDriver = GDALGetDriverByName("GTiff");<BR>&nbsp;&nbsp;&nbsp; CPLAssert( hDriver != NULL );</P>
<P>&nbsp;&nbsp;&nbsp; // Get Source coordinate system. </P>
<P>&nbsp;&nbsp;&nbsp; const char *pszSrcWKT = NULL;<BR>&nbsp;//const char *pszRefWKT = NULL;<BR>&nbsp;char *pszDstWKT;</P>
<P>&nbsp;&nbsp;&nbsp; pszSrcWKT = GDALGetProjectionRef( hSrcDS );<BR>&nbsp;&nbsp;&nbsp; CPLAssert( pszSrcWKT != NULL &amp;&amp; strlen(pszSrcWKT) &gt; 0 );<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; //pszRefWKT = GDALGetProjectionRef( hRefDS );<BR>&nbsp;&nbsp;&nbsp; //CPLAssert( pszRefWKT != NULL &amp;&amp; strlen(pszRefWKT) &gt; 0 );</P>
<P>&nbsp;&nbsp;&nbsp; // Setup output coordinate system that is UTM 17 WGS84. </P>
<P>&nbsp;&nbsp;&nbsp; OGRSpatialReference oSRS;</P>
<P>&nbsp;&nbsp;&nbsp; //oSRS.SetUTM(17, TRUE);</P>
<P>&nbsp;&nbsp;&nbsp; //oSRS.SetWellKnownGeogCS("WGS84");<BR>&nbsp;oSRS.importFromProj4("+proj=latlong +datum=WGS84");</P>
<P>&nbsp;&nbsp;&nbsp; oSRS.exportToWkt( &amp;pszDstWKT );</P>
<P>&nbsp;&nbsp;&nbsp; // Create a transformer that maps from source pixel/line coordinates<BR>&nbsp;&nbsp;&nbsp; // to destination georeferenced coordinates (not destination <BR>&nbsp;&nbsp;&nbsp; // pixel line).&nbsp; We do that by omitting the destination dataset<BR>&nbsp;&nbsp;&nbsp; // handle (setting it to NULL). </P>
<P>&nbsp;&nbsp;&nbsp; void *hTransformArg;</P>
<P>&nbsp;&nbsp;&nbsp; hTransformArg = GDALCreateGenImgProjTransformer( hSrcDS, pszSrcWKT, NULL, pszDstWKT, FALSE, 0, 1 );<BR>&nbsp;&nbsp;&nbsp; CPLAssert( hTransformArg != NULL );</P>
<P>&nbsp;&nbsp;&nbsp; // Get approximate output georeferenced bounds and resolution for file. </P>
<P>&nbsp;&nbsp;&nbsp; double adfDstGeoTransform[6];<BR>&nbsp;&nbsp;&nbsp; int nPixels = 0, nLines = 0;<BR>&nbsp;&nbsp;&nbsp; CPLErr eErr;</P>
<P>&nbsp;&nbsp;&nbsp; eErr = GDALSuggestedWarpOutput( hSrcDS, GDALGenImgProjTransform, hTransformArg, adfDstGeoTransform, &amp;nPixels, &amp;nLines );<BR>&nbsp;&nbsp;&nbsp; CPLAssert( eErr == CE_None );</P>
<P>&nbsp;&nbsp;&nbsp; GDALDestroyGenImgProjTransformer( hTransformArg );</P>
<P>&nbsp;&nbsp;&nbsp; // Create the output file.<BR>&nbsp;char *apszOptions[] = {"INTERLEAVE=PIXEL", NULL};<BR>&nbsp;hDstDS = GDALCreate(hDriver, fileNameOut, nPixels, nLines, GDALGetRasterCount(hSrcDS), eDT, apszOptions);<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; CPLAssert( hDstDS != NULL );</P>
<P>&nbsp;&nbsp;&nbsp; // Write out the projection definition. </P>
<P>&nbsp;&nbsp;&nbsp; GDALSetProjection(hDstDS, pszDstWKT);<BR>&nbsp;&nbsp;&nbsp; GDALSetGeoTransform(hDstDS, adfDstGeoTransform);</P>
<P>&nbsp;&nbsp;&nbsp; // Copy the color table, if required.</P>
<P>&nbsp;// --------------- For debugging-----------------------<BR>&nbsp;//str.Format("DEBUG INFO: %d\n",GDALGetRasterCount(hDstDS));<BR>&nbsp;//AfxMessageBox(str);<BR>&nbsp;// ----------------------------------------------------</P>
<P>&nbsp;&nbsp;&nbsp; GDALColorTableH hCT;</P>
<P>&nbsp;&nbsp;&nbsp; hCT = GDALGetRasterColorTable(GDALGetRasterBand(hSrcDS,1));<BR>&nbsp;GDALSetRasterColorTable(GDALGetRasterBand(hDstDS,1), hCT);</P>
<P>&nbsp;//str.Format("DEBUG INFO: \n %d \n ",GDALGetRasterCount(hDstDS));<BR>&nbsp;//AfxMessageBox(eRBCI.*/<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; hCT = GDALGetRasterColorTable(GDALGetRasterBand(hSrcDS,2));<BR>&nbsp;&nbsp;&nbsp; GDALSetRasterColorTable(GDALGetRasterBand(hDstDS,2), hCT);</P>
<P>&nbsp;<BR>&nbsp;&nbsp;&nbsp; hCT = GDALGetRasterColorTable(GDALGetRasterBand(hSrcDS,3));<BR>&nbsp;&nbsp;&nbsp; GDALSetRasterColorTable(GDALGetRasterBand(hDstDS,3), hCT);</P>
<P><BR>&nbsp;CTest01Dlg::SendDlgItemMessage(IDC_LIST_STATUS, LB_ADDSTRING, 0, (LPARAM)"Setup warp options ...");</P>
<P>&nbsp;&nbsp;&nbsp; // Setup warp options. </P>
<P>&nbsp;&nbsp;&nbsp; GDALWarpOptions *psWarpOptions = GDALCreateWarpOptions();</P>
<P>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;hSrcDS = hSrcDS;<BR>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;hDstDS = hDstDS;<BR>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;nBandCount = 3;<BR>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;panSrcBands = (int *) CPLMalloc(sizeof(int) * psWarpOptions-&gt;nBandCount);<BR>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;panSrcBands[0] = 1;<BR>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;panSrcBands[1] = 2;<BR>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;panSrcBands[2] = 3;<BR>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;panDstBands = (int *) CPLMalloc(sizeof(int) * psWarpOptions-&gt;nBandCount);<BR>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;panDstBands[0] = 1;<BR>&nbsp;psWarpOptions-&gt;panDstBands[1] = 2;<BR>&nbsp;psWarpOptions-&gt;panDstBands[2] = 3;</P>
<P>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;pfnProgress = GDALTermProgress;<BR>&nbsp;<BR>&nbsp;CTest01Dlg::SendDlgItemMessage(IDC_LIST_STATUS, LB_ADDSTRING, 0, (LPARAM)"Establishing transformer ...");</P>
<P>&nbsp;&nbsp;&nbsp; // Establish reprojection transformer. </P>
<P>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;pTransformerArg = GDALCreateGenImgProjTransformer(hSrcDS, GDALGetProjectionRef(hSrcDS), hDstDS, GDALGetProjectionRef(hDstDS), FALSE, 0.0, 1);<BR>&nbsp;&nbsp;&nbsp; psWarpOptions-&gt;pfnTransformer = GDALGenImgProjTransform;</P>
<P>&nbsp;&nbsp;&nbsp; // Initialize and execute the warp operation.<BR>&nbsp;<BR>&nbsp;CTest01Dlg::SendDlgItemMessage(IDC_LIST_STATUS, LB_ADDSTRING, 0, (LPARAM)"Executing ...");</P>
<P>&nbsp;&nbsp;&nbsp; GDALWarpOperation oOperation;</P>
<P>&nbsp;&nbsp;&nbsp; // Initialize transformation operation<BR>&nbsp;oOperation.Initialize(psWarpOptions);</P>
<P>&nbsp;// Perform the transformation<BR>&nbsp;&nbsp;&nbsp; oOperation.ChunkAndWarpImage(0, 0, GDALGetRasterXSize(hDstDS), GDALGetRasterYSize(hDstDS));</P>
<P>&nbsp;// Clean up the intermediate objects<BR>&nbsp;&nbsp;&nbsp; GDALDestroyGenImgProjTransformer(psWarpOptions-&gt;pTransformerArg);<BR>&nbsp;&nbsp;&nbsp; GDALDestroyWarpOptions(psWarpOptions);</P>
<P>&nbsp;CTest01Dlg::SendDlgItemMessage(IDC_LIST_STATUS, LB_ADDSTRING, 0, (LPARAM)"Done ...");</P>
<P>&nbsp;// Close the input and output files<BR>&nbsp;&nbsp;&nbsp; GDALClose(hDstDS);<BR>&nbsp;&nbsp;&nbsp; GDALClose(hSrcDS);<BR>&nbsp;// GDALClose(hRefDS);<BR>}</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thank you.</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ilya.</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR></P></DIV>
<DIV></DIV>&gt;From: Frank Warmerdam &lt;fwarmerdam@gmail.com&gt;
<DIV></DIV>&gt;Reply-To: warmerdam@pobox.com
<DIV></DIV>&gt;To: Ilya Serebrianik &lt;predator2448@hotmail.com&gt;
<DIV></DIV>&gt;CC: gdal-dev@xserve.flids.com
<DIV></DIV>&gt;Subject: Re: [Gdal-dev] UTM to Lat/Long projection
<DIV></DIV>&gt;Date: Wed, 4 May 2005 15:10:44 -0400
<DIV></DIV>&gt;
<DIV></DIV>&gt;On 5/4/05, Ilya Serebrianik &lt;predator2448@hotmail.com&gt; wrote:
<DIV></DIV>&gt; &gt;
<DIV></DIV>&gt; &gt; Hello Frank,
<DIV></DIV>&gt; &gt;
<DIV></DIV>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thanks for clearing this up. I am not sure how to project from UTM
<DIV></DIV>&gt; &gt; NAD83 to Lat/Long WGS84. In your example application, namely gdalwrap, there
<DIV></DIV>&gt; &gt; is a option "+proj=latlong" which would be specified for the -t_srs in order
<DIV></DIV>&gt; &gt; to go from whatever the projection of the source into lat and long, I tried
<DIV></DIV>&gt; &gt; that and it works, but I do not know how to set this up inside my code, I
<DIV></DIV>&gt; &gt; tried using importFromProj4("+proj=longlat"), which should
<DIV></DIV>&gt; &gt; automatically set the lat/long option into the srs object I am about to
<DIV></DIV>&gt; &gt; assign to the destination image, like this:
<DIV></DIV>&gt;
<DIV></DIV>&gt;Ilya,
<DIV></DIV>&gt;
<DIV></DIV>&gt;And did the example you gave not work? In what way does it fail?
<DIV></DIV>&gt;Do the pszSrcWKT and pszDstWKT seem OK?
<DIV></DIV>&gt;
<DIV></DIV>&gt; &gt; OGRSpatialReference oSRS;
<DIV></DIV>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; //oSRS.SetUTM(17, TRUE);
<DIV></DIV>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; //oSRS.SetWellKnownGeogCS("WGS84");
<DIV></DIV>&gt; &gt;&nbsp;&nbsp;oSRS.importFromProj4("+proj=longlat");
<DIV></DIV>&gt;
<DIV></DIV>&gt;I would encourage you to be specific about the datum.&nbsp;&nbsp;So
<DIV></DIV>&gt;you could do:
<DIV></DIV>&gt;
<DIV></DIV>&gt;&nbsp;&nbsp; oSRS.importFromProj4( "+proj=latlong +datum=WGS84" );
<DIV></DIV>&gt;
<DIV></DIV>&gt;Best regards,
<DIV></DIV>&gt;--
<DIV></DIV>&gt;---------------------------------------+--------------------------------------
<DIV></DIV>&gt;I set the clouds in motion - turn up&nbsp;&nbsp; | Frank Warmerdam, warmerdam@pobox.com
<DIV></DIV>&gt;light and sound - activate the windows | http://pobox.com/~warmerdam
<DIV></DIV>&gt;and watch the world go round - Rush&nbsp;&nbsp;&nbsp;&nbsp;| Geospatial Programmer for Rent
<DIV></DIV></div></html>