@@ -10621,7 +10621,7 @@ CPLErr GDALDataset::GetExtent(OGREnvelope *psExtent,
1062110621 if (auto poLayer = poThisDS->GetLayer (0 ))
1062210622 poThisCRS = poLayer->GetSpatialRef ();
1062310623 }
10624- if (!poThisCRS)
10624+ if (poCRS && !poThisCRS)
1062510625 return CE_Failure;
1062610626 }
1062710627 if (!poCRS)
@@ -10633,34 +10633,46 @@ CPLErr GDALDataset::GetExtent(OGREnvelope *psExtent,
1063310633 const bool bHasGT = poThisDS->GetGeoTransform (gt) == CE_None;
1063410634 if (bHasGT)
1063510635 {
10636- auto poCT = std::unique_ptr<OGRCoordinateTransformation>(
10637- OGRCreateCoordinateTransformation (poThisCRS, poCRS));
10636+ std::unique_ptr<OGRCoordinateTransformation> poCT;
10637+ if (poCRS)
10638+ {
10639+ poCT.reset (OGRCreateCoordinateTransformation (poThisCRS, poCRS));
10640+ }
10641+
10642+ constexpr int DENSIFY_POINT_COUNT = 21 ;
10643+ double dfULX = gt[0 ];
10644+ double dfULY = gt[3 ];
10645+ double dfURX = 0 , dfURY = 0 ;
10646+ gt.Apply (nRasterXSize, 0 , &dfURX, &dfURY);
10647+ double dfLLX = 0 , dfLLY = 0 ;
10648+ gt.Apply (0 , nRasterYSize, &dfLLX, &dfLLY);
10649+ double dfLRX = 0 , dfLRY = 0 ;
10650+ gt.Apply (nRasterXSize, nRasterYSize, &dfLRX, &dfLRY);
10651+ const double xmin =
10652+ std::min (std::min (dfULX, dfURX), std::min (dfLLX, dfLRX));
10653+ const double ymin =
10654+ std::min (std::min (dfULY, dfURY), std::min (dfLLY, dfLRY));
10655+ const double xmax =
10656+ std::max (std::max (dfULX, dfURX), std::max (dfLLX, dfLRX));
10657+ const double ymax =
10658+ std::max (std::max (dfULY, dfURY), std::max (dfLLY, dfLRY));
1063810659 if (poCT)
1063910660 {
10640- constexpr int DENSIFY_POINT_COUNT = 21 ;
1064110661 OGREnvelope sEnvTmp ;
10642- double dfULX = gt[0 ];
10643- double dfULY = gt[3 ];
10644- double dfURX = 0 , dfURY = 0 ;
10645- gt.Apply (nRasterXSize, 0 , &dfURX, &dfURY);
10646- double dfLLX = 0 , dfLLY = 0 ;
10647- gt.Apply (0 , nRasterYSize, &dfLLX, &dfLLY);
10648- double dfLRX = 0 , dfLRY = 0 ;
10649- gt.Apply (nRasterXSize, nRasterYSize, &dfLRX, &dfLRY);
10650- const double xmin =
10651- std::min (std::min (dfULX, dfURX), std::min (dfLLX, dfLRX));
10652- const double ymin =
10653- std::min (std::min (dfULY, dfURY), std::min (dfLLY, dfLRY));
10654- const double xmax =
10655- std::max (std::max (dfULX, dfURX), std::max (dfLLX, dfLRX));
10656- const double ymax =
10657- std::max (std::max (dfULY, dfURY), std::max (dfLLY, dfLRY));
10658- if (poCT->TransformBounds (xmin, ymin, xmax, ymax, &(sEnvTmp .MinX ),
10659- &(sEnvTmp .MinY ), &(sEnvTmp .MaxX ),
10660- &(sEnvTmp .MaxY ), DENSIFY_POINT_COUNT))
10662+ if (!poCT->TransformBounds (xmin, ymin, xmax, ymax, &(sEnvTmp .MinX ),
10663+ &(sEnvTmp .MinY ), &(sEnvTmp .MaxX ),
10664+ &(sEnvTmp .MaxY ), DENSIFY_POINT_COUNT))
1066110665 {
10662- *psExtent = std::move ( sEnvTmp ) ;
10666+ return CE_Failure ;
1066310667 }
10668+ *psExtent = sEnvTmp ;
10669+ }
10670+ else
10671+ {
10672+ psExtent->MinX = xmin;
10673+ psExtent->MinY = ymin;
10674+ psExtent->MaxX = xmax;
10675+ psExtent->MaxY = ymax;
1066410676 }
1066510677 }
1066610678
0 commit comments