<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>