<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">When calling ChunkAndWarpImage I have an unhandled exception on the line<o:p></o:p></p>
<p class="MsoNormal">pTransformArg = psInfo->pDstTransformArg;<br>
in gdaltransformer.cpp.<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal">Does anyone have any advice for where I should start debugging or what I may be doing wrong?<br>
My full function is as follows:<br>
<br>
bool WarpDataset(GDALDataset* srcDataset, GDALDataset*& dstDataset, int32 px, int32 py,
<o:p></o:p></p>
<p class="MsoNormal">                FVector2D TopLeft, FVector2D BottomRight, OGRSpatialReference* dstSpatRef)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">                if (!srcDataset)<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                return false;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                GDALAllRegister();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                //Source data<o:p></o:p></p>
<p class="MsoNormal">                GDALDatasetH hSrcDS = GDALDataset::ToHandle(srcDataset);<o:p></o:p></p>
<p class="MsoNormal">                CSLConstList CSL = CSLConstList();<o:p></o:p></p>
<p class="MsoNormal">                GDALDriverH hDriver = GDALGetDriverByName("MEM");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                if (!hDriver)<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                UE_LOG(LogTemp, Warning, TEXT("Resize failed. No valid driver!"));<o:p></o:p></p>
<p class="MsoNormal">                                return false;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                int32 NumBands = srcDataset->GetRasterCount();<o:p></o:p></p>
<p class="MsoNormal">                if (NumBands < 1)<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                return false;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                GDALDataType sourceDatatype = GDALGetRasterDataType(GDALGetRasterBand(hSrcDS, 1));<o:p></o:p></p>
<p class="MsoNormal">                //Destination data<o:p></o:p></p>
<p class="MsoNormal">                GDALDatasetH hDstDS = GDALCreate(hDriver, "", px, py, NumBands, sourceDatatype, CSL);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                if (dstSpatRef)<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                char* pszDstWKT = NULL;<o:p></o:p></p>
<p class="MsoNormal">                                int32 Err = dstSpatRef->exportToWkt(&pszDstWKT);<o:p></o:p></p>
<p class="MsoNormal">                                GDALDataset::FromHandle(hDstDS)->SetProjection(pszDstWKT);<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                else<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                char* pszDstWKT = NULL;<o:p></o:p></p>
<p class="MsoNormal">                                int32 Err = GDALDataset::FromHandle(hSrcDS)->GetSpatialRef()->exportToWkt(&pszDstWKT);<o:p></o:p></p>
<p class="MsoNormal">                                GDALDataset::FromHandle(hDstDS)->SetProjection(pszDstWKT);<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                GDALDataset::FromHandle(hDstDS)->SetMetadata(GDALDataset::FromHandle(hSrcDS)->GetMetadata());<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal">                bool InvertY = true;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                //Affine<o:p></o:p></p>
<p class="MsoNormal">                double T[6];<o:p></o:p></p>
<p class="MsoNormal">                double MaxX = BottomRight.X;<o:p></o:p></p>
<p class="MsoNormal">                double MaxY = BottomRight.Y;<o:p></o:p></p>
<p class="MsoNormal">                double MinX = TopLeft.X;<o:p></o:p></p>
<p class="MsoNormal">                double MinY = TopLeft.Y;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                T[0] = (MaxX - MinX) / double(px);<o:p></o:p></p>
<p class="MsoNormal">                T[1] = 0;<o:p></o:p></p>
<p class="MsoNormal">                T[2] = MinX;<o:p></o:p></p>
<p class="MsoNormal">                T[3] = (InvertY ? (MinY - MaxY) : (MaxY - MinY)) / double(py);<o:p></o:p></p>
<p class="MsoNormal">                T[4] = 0;<o:p></o:p></p>
<p class="MsoNormal">                T[5] = InvertY ? MaxY : MinY;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                GDALDataset::FromHandle(hDstDS)->SetGeoTransform(T);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                // Setup warp options. <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                GDALWarpOptions* psWarpOptions = GDALCreateWarpOptions();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                psWarpOptions->hSrcDS = hSrcDS;<o:p></o:p></p>
<p class="MsoNormal">                psWarpOptions->hDstDS = hDstDS;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                psWarpOptions->nBandCount = NumBands;<o:p></o:p></p>
<p class="MsoNormal">                psWarpOptions->panSrcBands = (int*)CPLMalloc(sizeof(int) * psWarpOptions->nBandCount);<o:p></o:p></p>
<p class="MsoNormal">                psWarpOptions->panDstBands = (int*)CPLMalloc(sizeof(int) * psWarpOptions->nBandCount);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                for (int32 B = 0; B < NumBands; B++)<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                psWarpOptions->panSrcBands[B] = B + 1;<o:p></o:p></p>
<p class="MsoNormal">                                psWarpOptions->panDstBands[B] = B + 1;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                psWarpOptions->pfnProgress = GDALTermProgress;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                // Establish reprojection transformer.<o:p></o:p></p>
<p class="MsoNormal">                psWarpOptions->pTransformerArg = GDALCreateGenImgProjTransformer(hSrcDS, GDALGetProjectionRef(hSrcDS),<o:p></o:p></p>
<p class="MsoNormal">                                hDstDS, GDALGetProjectionRef(hDstDS), FALSE, 0.0, 1);<o:p></o:p></p>
<p class="MsoNormal">                psWarpOptions->pfnTransformer = GDALGenImgProjTransform;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                // Initialize and execute the warp operation.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                GDALWarpOperation oOperation;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                oOperation.Initialize(psWarpOptions);<o:p></o:p></p>
<p class="MsoNormal">                oOperation.ChunkAndWarpImage(0, 0, GDALGetRasterXSize(hDstDS), GDALGetRasterYSize(hDstDS));<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                GDALDestroyGenImgProjTransformer(psWarpOptions->pTransformerArg);<o:p></o:p></p>
<p class="MsoNormal">                GDALDestroyWarpOptions(psWarpOptions);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                dstDataset = GDALDataset::FromHandle(hDstDS);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                for (int32 B = 0; B < dstDataset->GetRasterCount(); B++)<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                double Mean, Min, Max, SDev;<o:p></o:p></p>
<p class="MsoNormal">                                dstDataset->GetRasterBand(B + 1)->ComputeStatistics(0, &Min, &Max, &Mean, &SDev, NULL, NULL);<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                return true;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
</body>
</html>