23#define CPL_SUPRESS_CPLUSPLUS   
   25#include "gdalwarper.h" 
   26#include "cpl_string.h" 
   28#include <QNetworkProxy> 
   36  const QString driverShortName = GDALGetDriverShortName( driver );
 
   37  if ( driverShortName == QLatin1String( 
"SQLite" ) )
 
   42  return GDALGetMetadataItem( driver, GDAL_DCAP_CREATE, 
nullptr ) &&
 
   43         GDALGetMetadataItem( driver, GDAL_DCAP_RASTER, 
nullptr );
 
 
   53  GDALDriverH hDriverMem = GDALGetDriverByName( 
"MEM" );
 
   61  const double cellSizeX = extent.
width() / width;
 
   62  const double cellSizeY = extent.
height() / height;
 
   63  double geoTransform[6];
 
   65  geoTransform[1] = cellSizeX;
 
   67  geoTransform[3] = extent.
yMinimum() + ( cellSizeY * height );
 
   69  geoTransform[5] = -cellSizeY;
 
   72  GDALSetGeoTransform( hSrcDS.get(), geoTransform );
 
 
   78  const double cellSizeX = extent.
width() / width;
 
   79  const double cellSizeY = extent.
height() / height;
 
   80  double geoTransform[6];
 
   82  geoTransform[1] = cellSizeX;
 
   84  geoTransform[3] = extent.
yMinimum() + ( cellSizeY * height );
 
   86  geoTransform[5] = -cellSizeY;
 
   88  GDALDriverH hDriver = GDALGetDriverByName( 
"GTiff" );
 
   95  gdal::dataset_unique_ptr hDstDS( GDALCreate( hDriver, filename.toUtf8().constData(), width, height, 1, dataType, 
nullptr ) );
 
  103  GDALSetGeoTransform( hDstDS.get(), geoTransform );
 
 
  109  if ( image.isNull() )
 
  112  const QRgb *rgb = 
reinterpret_cast<const QRgb *
>( image.constBits() );
 
  113  GDALDriverH hDriverMem = GDALGetDriverByName( 
"MEM" );
 
  118  gdal::dataset_unique_ptr hSrcDS( GDALCreate( hDriverMem, 
"",  image.width(), image.height(), 0, GDT_Byte, 
nullptr ) );
 
  121                        << QStringLiteral( 
"PIXELOFFSET=%1" ).arg( 
sizeof( QRgb ) )
 
  122                        << QStringLiteral( 
"LINEOFFSET=%1" ).arg( image.bytesPerLine() )
 
  123                        << QStringLiteral( 
"DATAPOINTER=%1" ).arg( 
reinterpret_cast< qulonglong 
>( rgb ) + 2 ) );
 
  124  GDALAddBand( hSrcDS.get(), GDT_Byte, papszOptions );
 
  125  CSLDestroy( papszOptions );
 
  128                 << QStringLiteral( 
"PIXELOFFSET=%1" ).arg( 
sizeof( QRgb ) )
 
  129                 << QStringLiteral( 
"LINEOFFSET=%1" ).arg( image.bytesPerLine() )
 
  130                 << QStringLiteral( 
"DATAPOINTER=%1" ).arg( 
reinterpret_cast< qulonglong 
>( rgb ) + 1 ) );
 
  131  GDALAddBand( hSrcDS.get(), GDT_Byte, papszOptions );
 
  132  CSLDestroy( papszOptions );
 
  135                 << QStringLiteral( 
"PIXELOFFSET=%1" ).arg( 
sizeof( QRgb ) )
 
  136                 << QStringLiteral( 
"LINEOFFSET=%1" ).arg( image.bytesPerLine() )
 
  137                 << QStringLiteral( 
"DATAPOINTER=%1" ).arg( 
reinterpret_cast< qulonglong 
>( rgb ) ) );
 
  138  GDALAddBand( hSrcDS.get(), GDT_Byte, papszOptions );
 
  139  CSLDestroy( papszOptions );
 
  142                 << QStringLiteral( 
"PIXELOFFSET=%1" ).arg( 
sizeof( QRgb ) )
 
  143                 << QStringLiteral( 
"LINEOFFSET=%1" ).arg( image.bytesPerLine() )
 
  144                 << QStringLiteral( 
"DATAPOINTER=%1" ).arg( 
reinterpret_cast< qulonglong 
>( rgb ) + 3 ) );
 
  145  GDALAddBand( hSrcDS.get(), GDT_Byte, papszOptions );
 
  146  CSLDestroy( papszOptions );
 
 
  156  GDALDriverH hDriverMem = GDALGetDriverByName( 
"MEM" );
 
  160  const double cellSizeX = extent.
width() / pixelWidth;
 
  161  const double cellSizeY = extent.
height() / pixelHeight;
 
  162  double geoTransform[6];
 
  163  geoTransform[0] = extent.
xMinimum();
 
  164  geoTransform[1] = cellSizeX;
 
  166  geoTransform[3] = extent.
yMinimum() + ( cellSizeY * pixelHeight );
 
  168  geoTransform[5] = -cellSizeY;
 
  172  int dataTypeSize = GDALGetDataTypeSizeBytes( dataType );
 
  174                        << QStringLiteral( 
"PIXELOFFSET=%1" ).arg( dataTypeSize )
 
  175                        << QStringLiteral( 
"LINEOFFSET=%1" ).arg( pixelWidth * dataTypeSize )
 
  176                        << QStringLiteral( 
"DATAPOINTER=%1" ).arg( 
reinterpret_cast< qulonglong 
>( block ) ) );
 
  177  GDALAddBand( hDstDS.get(), dataType, papszOptions );
 
  178  CSLDestroy( papszOptions );
 
  180  GDALSetGeoTransform( hDstDS.get(), geoTransform );
 
 
  193    GDALRasterBandH band = GDALGetRasterBand( ret.get(), 1 );
 
  195      GDALSetRasterNoDataValue( band, block->
noDataValue() );
 
 
  212  GDALDriverH hDriverMem = GDALGetDriverByName( 
"MEM" );
 
  216  const double cellSizeX = gridXSize / block->
width();
 
  217  const double cellSizeY = gridYSize / block->
height();
 
  218  double geoTransform[6];
 
  219  geoTransform[0] = origin.
x();
 
  220  geoTransform[1] = cellSizeX * std::cos( rotation );
 
  221  geoTransform[2] = cellSizeY * std::sin( rotation );
 
  222  geoTransform[3] = origin.
y();
 
  223  geoTransform[4] = cellSizeX * std::sin( rotation );
 
  224  geoTransform[5] = -cellSizeY * std::cos( rotation );
 
  229  int dataTypeSize = GDALGetDataTypeSizeBytes( dataType );
 
  231                        << QStringLiteral( 
"PIXELOFFSET=%1" ).arg( dataTypeSize )
 
  232                        << QStringLiteral( 
"LINEOFFSET=%1" ).arg( block->
width() * dataTypeSize )
 
  233                        << QStringLiteral( 
"DATAPOINTER=%1" ).arg( 
reinterpret_cast< qulonglong 
>( block->
bits() ) ) );
 
  234  GDALAddBand( hDstDS.get(), dataType, papszOptions );
 
  235  CSLDestroy( papszOptions );
 
  237  GDALSetGeoTransform( hDstDS.get(), geoTransform );
 
  239  GDALRasterBandH band = GDALGetRasterBand( hDstDS.get(), 1 );
 
  241    GDALSetRasterNoDataValue( band, block->
noDataValue() );
 
 
  246static bool resampleSingleBandRasterStatic( 
GDALDatasetH hSrcDS, 
GDALDatasetH hDstDS, GDALResampleAlg resampleAlg, 
char **papszOptions )
 
  249  psWarpOptions->hSrcDS = hSrcDS;
 
  250  psWarpOptions->hDstDS = hDstDS;
 
  252  psWarpOptions->nBandCount = 1;
 
  253  psWarpOptions->panSrcBands = 
reinterpret_cast< int * 
>( CPLMalloc( 
sizeof( 
int ) * 1 ) );
 
  254  psWarpOptions->panDstBands = 
reinterpret_cast< int * 
>( CPLMalloc( 
sizeof( 
int ) * 1 ) );
 
  255  psWarpOptions->panSrcBands[0] = 1;
 
  256  psWarpOptions->panDstBands[0] = 1;
 
  257  double noDataValue = GDALGetRasterNoDataValue( GDALGetRasterBand( hDstDS, 1 ), 
nullptr );
 
  258  psWarpOptions->padfDstNoDataReal = 
reinterpret_cast< double * 
>( CPLMalloc( 
sizeof( 
double ) * 1 ) );
 
  259  psWarpOptions->padfDstNoDataReal[0] = noDataValue;
 
  260  psWarpOptions->eResampleAlg = resampleAlg;
 
  263  psWarpOptions->pTransformerArg = GDALCreateGenImgProjTransformer2( hSrcDS, hDstDS, papszOptions );
 
  265  if ( ! psWarpOptions->pTransformerArg )
 
  270  psWarpOptions->pfnTransformer = GDALGenImgProjTransform;
 
  271  psWarpOptions->papszWarpOptions = CSLSetNameValue( psWarpOptions-> papszWarpOptions, 
"INIT_DEST", 
"NO_DATA" );
 
  275  GDALWarpOperation oOperation;
 
  276  CPLErr initResult = oOperation.Initialize( psWarpOptions.get() );
 
  277  if ( initResult != CE_Failure )
 
  278    retVal =  oOperation.ChunkAndWarpImage( 0, 0, GDALGetRasterXSize( hDstDS ), GDALGetRasterYSize( hDstDS ) ) == CE_None;
 
  279  GDALDestroyGenImgProjTransformer( psWarpOptions->pTransformerArg );
 
  285  char **papszOptions = 
nullptr;
 
  286  if ( pszCoordinateOperation != 
nullptr )
 
  287    papszOptions = CSLSetNameValue( papszOptions, 
"COORDINATE_OPERATION", pszCoordinateOperation );
 
  289  bool result = resampleSingleBandRasterStatic( hSrcDS, hDstDS, resampleAlg, papszOptions );
 
  290  CSLDestroy( papszOptions );
 
 
  296    GDALResampleAlg resampleAlg,
 
  300  char **papszOptions = 
nullptr;
 
  305  bool result = resampleSingleBandRasterStatic( hSrcDS, hDstDS, resampleAlg, papszOptions );
 
  306  CSLDestroy( papszOptions );
 
 
  316  GDALRasterIOExtraArg extra;
 
  317  INIT_RASTERIO_EXTRA_ARG( extra );
 
  318  extra.eResampleAlg = resampleAlg;
 
  320  QImage res( outputSize, image.format() );
 
  324  GByte *rgb = 
reinterpret_cast<GByte *
>( res.bits() );
 
  326  CPLErr err = GDALRasterIOEx( GDALGetRasterBand( srcDS.get(), 1 ), GF_Read, 0, 0, image.width(), image.height(), rgb + 2, outputSize.width(),
 
  327                               outputSize.height(), GDT_Byte, 
sizeof( QRgb ), res.bytesPerLine(), &extra );
 
  328  if ( err != CE_None )
 
  330    QgsDebugError( QStringLiteral( 
"failed to read red band" ) );
 
  334  err = GDALRasterIOEx( GDALGetRasterBand( srcDS.get(), 2 ), GF_Read, 0, 0, image.width(), image.height(), rgb + 1, outputSize.width(),
 
  335                        outputSize.height(), GDT_Byte, 
sizeof( QRgb ), res.bytesPerLine(), &extra );
 
  336  if ( err != CE_None )
 
  338    QgsDebugError( QStringLiteral( 
"failed to read green band" ) );
 
  342  err = GDALRasterIOEx( GDALGetRasterBand( srcDS.get(), 3 ), GF_Read, 0, 0, image.width(), image.height(), rgb, outputSize.width(),
 
  343                        outputSize.height(), GDT_Byte, 
sizeof( QRgb ), res.bytesPerLine(), &extra );
 
  344  if ( err != CE_None )
 
  346    QgsDebugError( QStringLiteral( 
"failed to read blue band" ) );
 
  350  err = GDALRasterIOEx( GDALGetRasterBand( srcDS.get(), 4 ), GF_Read, 0, 0, image.width(), image.height(), rgb + 3, outputSize.width(),
 
  351                        outputSize.height(), GDT_Byte, 
sizeof( QRgb ), res.bytesPerLine(), &extra );
 
  352  if ( err != CE_None )
 
  354    QgsDebugError( QStringLiteral( 
"failed to read alpha band" ) );
 
 
  364  GDALDriverH myGdalDriver = GDALGetDriverByName( format.toLocal8Bit().constData() );
 
  368    char **GDALmetadata = GDALGetMetadata( myGdalDriver, 
nullptr );
 
  369    message += QLatin1String( 
"Format Details:\n" );
 
  370    message += QStringLiteral( 
"  Extension: %1\n" ).arg( CSLFetchNameValue( GDALmetadata, GDAL_DMD_EXTENSION ) );
 
  371    message += QStringLiteral( 
"  Short Name: %1" ).arg( GDALGetDriverShortName( myGdalDriver ) );
 
  372    message += QStringLiteral( 
"  /  Long Name: %1\n" ).arg( GDALGetDriverLongName( myGdalDriver ) );
 
  373    message += QStringLiteral( 
"  Help page:  http://www.gdal.org/%1\n\n" ).arg( CSLFetchNameValue( GDALmetadata, GDAL_DMD_HELPTOPIC ) );
 
  377    CPLXMLNode *psCOL = CPLParseXMLString( GDALGetMetadataItem( myGdalDriver,
 
  378                                           GDAL_DMD_CREATIONOPTIONLIST, 
"" ) );
 
  379    char *pszFormattedXML = CPLSerializeXMLTree( psCOL );
 
  380    if ( pszFormattedXML )
 
  381      message += QString( pszFormattedXML );
 
  383      CPLDestroyXMLNode( psCOL );
 
  384    if ( pszFormattedXML )
 
  385      CPLFree( pszFormattedXML );
 
 
  392  char **papszRetList = 
nullptr;
 
  393  const auto constList = list;
 
  394  for ( 
const QString &elem : constList )
 
  396    papszRetList = CSLAddString( papszRetList, elem.toLocal8Bit().constData() );
 
 
  403  GDALDriverH myGdalDriver = GDALGetDriverByName( format.toLocal8Bit().constData() );
 
  404  if ( ! myGdalDriver )
 
  405    return QStringLiteral( 
"invalid GDAL driver" );
 
  409  const int ok = GDALValidateCreationOptions( myGdalDriver, papszOptions );
 
  410  CSLDestroy( papszOptions );
 
  413    return QStringLiteral( 
"Failed GDALValidateCreationOptions() test" );
 
 
  419  const char *pszSrcWKT,
 
  420  const char *pszDstWKT,
 
  421  GDALResampleAlg eResampleAlg,
 
  423  const GDALWarpOptions *psOptionsIn )
 
  425  char **opts = 
nullptr;
 
  426  if ( GDALGetMetadata( hSrcDS, 
"RPC" ) )
 
  429    const char *heightOffStr = GDALGetMetadataItem( hSrcDS, 
"HEIGHT_OFF", 
"RPC" );
 
  431      opts = CSLAddNameValue( opts, 
"RPC_HEIGHT", heightOffStr );
 
  434  return GDALAutoCreateWarpedVRTEx( hSrcDS, pszSrcWKT, pszDstWKT, eResampleAlg, dfMaxError, psOptionsIn, opts );
 
 
  439  char **opts = CSLDuplicate( papszOptions );
 
  440  if ( GDALGetMetadata( hSrcDS, 
"RPC" ) )
 
  443    const char *heightOffStr = GDALGetMetadataItem( hSrcDS, 
"HEIGHT_OFF", 
"RPC" );
 
  445      opts = CSLAddNameValue( opts, 
"RPC_HEIGHT", heightOffStr );
 
  447  void *transformer = GDALCreateGenImgProjTransformer2( hSrcDS, hDstDS, opts );
 
 
  457      return GDALDataType::GDT_Unknown;
 
  460      return GDALDataType::GDT_Byte;
 
  463#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,7,0) 
  464      return GDALDataType::GDT_Int8;
 
  466      return GDALDataType::GDT_Unknown;
 
  470      return GDALDataType::GDT_UInt16;
 
  473      return GDALDataType::GDT_Int16;
 
  476      return GDALDataType::GDT_UInt32;
 
  479      return GDALDataType::GDT_Int32;
 
  482      return GDALDataType::GDT_Float32;
 
  485      return GDALDataType::GDT_Float64;
 
  488      return GDALDataType::GDT_CInt16;
 
  491      return GDALDataType::GDT_CInt32;
 
  494      return GDALDataType::GDT_CFloat32;
 
  497      return GDALDataType::GDT_CFloat64;
 
  501      return GDALDataType::GDT_Unknown;
 
  505  return GDALDataType::GDT_Unknown;
 
 
  510  GDALResampleAlg eResampleAlg = GRA_NearestNeighbour;
 
  515      eResampleAlg = GRA_NearestNeighbour;
 
  519      eResampleAlg = GRA_Bilinear;
 
  523      eResampleAlg = GRA_Cubic;
 
  527      eResampleAlg = GRA_CubicSpline;
 
  531      eResampleAlg = GRA_Lanczos;
 
  535      eResampleAlg = GRA_Average;
 
  539      eResampleAlg = GRA_Mode;
 
 
  546#ifndef QT_NO_NETWORKPROXY 
  556  if ( settings.
value( QStringLiteral( 
"proxy/proxyEnabled" ), 
false ).toBool() )
 
  560    if ( ! proxies.isEmpty() )
 
  562      const QNetworkProxy proxy( proxies.first() );
 
  567      const QString proxyHost( proxy.hostName() );
 
  568      const quint16 proxyPort( proxy.port() );
 
  570      const QString proxyUser( proxy.user() );
 
  571      const QString proxyPassword( proxy.password() );
 
  573      if ( ! proxyHost.isEmpty() )
 
  575        QString connection( proxyHost );
 
  578          connection += 
':' +  QString::number( proxyPort );
 
  580        CPLSetConfigOption( 
"GDAL_HTTP_PROXY", connection.toUtf8() );
 
  581        if ( !  proxyUser.isEmpty( ) )
 
  583          QString credentials( proxyUser );
 
  584          if ( !  proxyPassword.isEmpty( ) )
 
  586            credentials += 
':' + proxyPassword;
 
  588          CPLSetConfigOption( 
"GDAL_HTTP_PROXYUSERPWD", credentials.toUtf8() );
 
 
  597  const QFileInfo info( path );
 
  598  const long long size = info.size();
 
  604  const QString suffix = info.suffix().toLower();
 
  605  static const QStringList sFileSizeDependentExtensions
 
  607    QStringLiteral( 
"xlsx" ),
 
  608    QStringLiteral( 
"ods" ),
 
  609    QStringLiteral( 
"csv" )
 
  611  if ( sFileSizeDependentExtensions.contains( suffix ) )
 
  614    return size < smallFileSizeLimit;
 
 
  624#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,4,0) 
  626  static std::once_flag initialized;
 
  627  static QStringList SUPPORTED_DB_LAYERS_EXTENSIONS;
 
  628  std::call_once( initialized, [ = ]
 
  632    GDALDriverH driver = 
nullptr;
 
  634    QSet< QString > extensions;
 
  636    for ( 
int i = 0; i < GDALGetDriverCount(); ++i )
 
  638      driver = GDALGetDriver( i );
 
  645      bool isMultiLayer = 
false;
 
  646      if ( QString( GDALGetMetadataItem( driver, GDAL_DCAP_RASTER, 
nullptr ) ) == QLatin1String( 
"YES" ) )
 
  648        if ( GDALGetMetadataItem( driver, GDAL_DMD_SUBDATASETS, 
nullptr ) != 
nullptr )
 
  653      if ( !isMultiLayer && QString( GDALGetMetadataItem( driver, GDAL_DCAP_VECTOR, 
nullptr ) ) == QLatin1String( 
"YES" ) )
 
  655        if ( GDALGetMetadataItem( driver, GDAL_DCAP_MULTIPLE_VECTOR_LAYERS, 
nullptr ) != 
nullptr )
 
  664      const QString driverExtensions = GDALGetMetadataItem( driver, GDAL_DMD_EXTENSIONS, 
"" );
 
  665      if ( driverExtensions.isEmpty() )
 
  668      const QStringList splitExtensions = driverExtensions.split( 
' ', Qt::SkipEmptyParts );
 
  670      for ( 
const QString &ext : splitExtensions )
 
  673        if ( ext == QLatin1String( 
"tif" ) || ext == QLatin1String( 
"tiff" ) )
 
  676        extensions.insert( ext );
 
  680    SUPPORTED_DB_LAYERS_EXTENSIONS = QStringList( extensions.constBegin(), extensions.constEnd() );
 
  682  return SUPPORTED_DB_LAYERS_EXTENSIONS;
 
  685  static const QStringList SUPPORTED_DB_LAYERS_EXTENSIONS
 
  687    QStringLiteral( 
"gpkg" ),
 
  688    QStringLiteral( 
"sqlite" ),
 
  689    QStringLiteral( 
"db" ),
 
  690    QStringLiteral( 
"gdb" ),
 
  691    QStringLiteral( 
"kml" ),
 
  692    QStringLiteral( 
"kmz" ),
 
  693    QStringLiteral( 
"osm" ),
 
  694    QStringLiteral( 
"mdb" ),
 
  695    QStringLiteral( 
"accdb" ),
 
  696    QStringLiteral( 
"xls" ),
 
  697    QStringLiteral( 
"xlsx" ),
 
  698    QStringLiteral( 
"ods" ),
 
  699    QStringLiteral( 
"gpx" ),
 
  700    QStringLiteral( 
"pdf" ),
 
  701    QStringLiteral( 
"pbf" ),
 
  702    QStringLiteral( 
"vrt" ),
 
  703    QStringLiteral( 
"nc" ),
 
  704    QStringLiteral( 
"dxf" ),
 
  705    QStringLiteral( 
"shp.zip" ) };
 
  706  return SUPPORTED_DB_LAYERS_EXTENSIONS;
 
 
  714  for ( 
const QString &vsiPrefix : vsiPrefixes )
 
  716    if ( path.startsWith( vsiPrefix, Qt::CaseInsensitive ) )
 
  720  if ( path.endsWith( QLatin1String( 
".shp.zip" ), Qt::CaseInsensitive ) )
 
  723    if ( GDALIdentifyDriverEx( path.toUtf8().constData(), GDAL_OF_VECTOR, 
nullptr, 
nullptr ) )
 
  725    return QStringLiteral( 
"/vsizip/" );
 
  727  else if ( path.endsWith( QLatin1String( 
".zip" ), Qt::CaseInsensitive ) )
 
  728    return QStringLiteral( 
"/vsizip/" );
 
  729  else if ( path.endsWith( QLatin1String( 
".tar" ), Qt::CaseInsensitive ) ||
 
  730            path.endsWith( QLatin1String( 
".tar.gz" ), Qt::CaseInsensitive ) ||
 
  731            path.endsWith( QLatin1String( 
".tgz" ), Qt::CaseInsensitive ) )
 
  732    return QStringLiteral( 
"/vsitar/" );
 
  733  else if ( path.endsWith( QLatin1String( 
".gz" ), Qt::CaseInsensitive ) )
 
  734    return QStringLiteral( 
"/vsigzip/" );
 
  735#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,7,0) 
  736  else if ( vsiPrefixes.contains( QStringLiteral( 
"/vsi7z/" ) ) &&
 
  737            ( path.endsWith( QLatin1String( 
".7z" ), Qt::CaseInsensitive ) ||
 
  738              path.endsWith( QLatin1String( 
".lpk" ), Qt::CaseInsensitive ) ||
 
  739              path.endsWith( QLatin1String( 
".lpkx" ), Qt::CaseInsensitive ) ||
 
  740              path.endsWith( QLatin1String( 
".mpk" ), Qt::CaseInsensitive ) ||
 
  741              path.endsWith( QLatin1String( 
".mpkx" ), Qt::CaseInsensitive ) ) )
 
  742    return QStringLiteral( 
"/vsi7z/" );
 
  743  else if ( vsiPrefixes.contains( QStringLiteral( 
"/vsirar/" ) ) &&
 
  744            path.endsWith( QLatin1String( 
".rar" ), Qt::CaseInsensitive ) )
 
  745    return QStringLiteral( 
"/vsirar/" );
 
 
  753  QStringList res { QStringLiteral( 
"/vsizip/" ),
 
  754                    QStringLiteral( 
"/vsitar/" ),
 
  755                    QStringLiteral( 
"/vsigzip/" ),
 
  757#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,7,0) 
  758  res.append( QStringLiteral( 
"/vsi7z/" ) );
 
  759  res.append( QStringLiteral( 
"/vsirar/" ) );
 
 
  771  QStringList res { QStringLiteral( 
".zip" ),
 
  772                    QStringLiteral( 
".tar" ),
 
  773                    QStringLiteral( 
".tar.gz" ),
 
  774                    QStringLiteral( 
".tgz" ),
 
  775                    QStringLiteral( 
".gz" ),
 
  777#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,7,0) 
  778  res.append( { QStringLiteral( 
".7z" ),
 
  779                QStringLiteral( 
".lpk" ),
 
  780                QStringLiteral( 
".lpkx" ),
 
  781                QStringLiteral( 
".mpk" ),
 
  782                QStringLiteral( 
".mpkx" ),
 
  783                QStringLiteral( 
".rar" )
 
 
  791  const QString extWithDot = extension.startsWith( 
'.' ) ? extension : ( 
'.' + extension );
 
 
  797  CPLPushErrorHandler( CPLQuietErrorHandler );
 
  799  GDALDriverH hDriver = 
nullptr;
 
  804      hDriver = GDALIdentifyDriverEx( vrtPath.toUtf8().constData(), GDAL_OF_VECTOR, 
nullptr, 
nullptr );
 
  808      hDriver = GDALIdentifyDriverEx( vrtPath.toUtf8().constData(), GDAL_OF_RASTER, 
nullptr, 
nullptr );
 
  821  CPLPopErrorHandler();
 
  822  return static_cast< bool >( hDriver );
 
 
DataType
Raster data types.
 
@ Float32
Thirty two bit floating point (float)
 
@ CFloat64
Complex Float64.
 
@ Int16
Sixteen bit signed integer (qint16)
 
@ ARGB32_Premultiplied
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
 
@ Int8
Eight bit signed integer (qint8) (added in QGIS 3.30)
 
@ UInt16
Sixteen bit unsigned integer (quint16)
 
@ Byte
Eight bit unsigned integer (quint8)
 
@ UnknownDataType
Unknown or unspecified type.
 
@ ARGB32
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32.
 
@ Int32
Thirty two bit signed integer (qint32)
 
@ Float64
Sixty four bit floating point (double)
 
@ CFloat32
Complex Float32.
 
@ UInt32
Thirty two bit unsigned integer (quint32)
 
LayerType
Types of layers that can be added to a map.
 
@ Group
Composite group layer. Added in QGIS 3.24.
 
@ Plugin
Plugin based layer.
 
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
 
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
 
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
 
@ Mesh
Mesh layer. Added in QGIS 3.2.
 
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
 
@ PreferredGdal
Preferred format for conversion of CRS to WKT for use with the GDAL library.
 
This class represents a coordinate reference system (CRS).
 
QString toWkt(Qgis::CrsWktVariant variant=Qgis::CrsWktVariant::Wkt1Gdal, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
 
static bool pathIsCheapToOpen(const QString &path, int smallFileSizeLimit=50000)
Returns true if the dataset at the specified path is considered "cheap" to open.
 
static QString vsiPrefixForPath(const QString &path)
Returns a the vsi prefix which corresponds to a file path, or an empty string if the path is not asso...
 
static QString helpCreationOptionsFormat(const QString &format)
Gets creation options metadata for a given format.
 
static bool vrtMatchesLayerType(const QString &vrtPath, Qgis::LayerType type)
Returns true if the VRT file at the specified path is a VRT matching the given layer type.
 
static GDALResampleAlg gdalResamplingAlgorithm(QgsRasterDataProvider::ResamplingMethod method)
Returns the GDAL resampling method corresponding to the QGIS resampling method.
 
static bool resampleSingleBandRaster(GDALDatasetH hSrcDS, GDALDatasetH hDstDS, GDALResampleAlg resampleAlg, const char *pszCoordinateOperation)
Resamples a single band raster to the destination dataset with different resolution (and possibly wit...
 
static GDALDatasetH rpcAwareAutoCreateWarpedVrt(GDALDatasetH hSrcDS, const char *pszSrcWKT, const char *pszDstWKT, GDALResampleAlg eResampleAlg, double dfMaxError, const GDALWarpOptions *psOptionsIn)
This is a copy of GDALAutoCreateWarpedVRT optimized for imagery using RPC georeferencing that also se...
 
static bool supportsRasterCreate(GDALDriverH driver)
Reads whether a driver supports GDALCreate() for raster purposes.
 
static bool isVsiArchiveFileExtension(const QString &extension)
Returns true if a file extension is a supported archive style container (e.g.
 
static gdal::dataset_unique_ptr createSingleBandTiffDataset(const QString &filename, GDALDataType dataType, const QgsRectangle &extent, int width, int height, const QgsCoordinateReferenceSystem &crs)
Creates a new single band TIFF dataset with given parameters.
 
static GDALDataType gdalDataTypeFromQgisDataType(Qgis::DataType dataType)
Returns the GDAL data type corresponding to the QGIS data type dataType.
 
static bool isVsiArchivePrefix(const QString &prefix)
Returns true if prefix is a supported archive style container prefix (e.g.
 
static gdal::dataset_unique_ptr createSingleBandMemoryDataset(GDALDataType dataType, const QgsRectangle &extent, int width, int height, const QgsCoordinateReferenceSystem &crs)
Creates a new single band memory dataset with given parameters.
 
static QString validateCreationOptionsFormat(const QStringList &createOptions, const QString &format)
Validates creation options for a given format, regardless of layer.
 
static gdal::dataset_unique_ptr blockToSingleBandMemoryDataset(int pixelWidth, int pixelHeight, const QgsRectangle &extent, void *block, GDALDataType dataType)
Converts a data block to a single band GDAL memory dataset.
 
static gdal::dataset_unique_ptr imageToMemoryDataset(const QImage &image)
Converts an image to a GDAL memory dataset by borrowing image data.
 
static void * rpcAwareCreateTransformer(GDALDatasetH hSrcDS, GDALDatasetH hDstDS=nullptr, char **papszOptions=nullptr)
This is a wrapper around GDALCreateGenImgProjTransformer2() that takes into account RPC georeferencin...
 
static void setupProxy()
Sets the gdal proxy variables.
 
static QStringList vsiArchiveFileExtensions()
Returns a list of file extensions which correspond to archive style containers supported by GDAL (e....
 
static char ** papszFromStringList(const QStringList &list)
Helper function.
 
static QImage resampleImage(const QImage &image, QSize outputSize, GDALRIOResampleAlg resampleAlg)
Resamples a QImage image using GDAL resampler.
 
static gdal::dataset_unique_ptr createMultiBandMemoryDataset(GDALDataType dataType, int bands, const QgsRectangle &extent, int width, int height, const QgsCoordinateReferenceSystem &crs)
Creates a new multi band memory dataset with given parameters.
 
static QStringList multiLayerFileExtensions()
Returns a list of file extensions which potentially contain multiple layers representing GDAL raster ...
 
static QStringList vsiArchivePrefixes()
Returns a list of vsi prefixes which correspond to archive style containers (eg vsizip).
 
static void warning(const QString &msg)
Goes to qWarning.
 
static QgsNetworkAccessManager * instance(Qt::ConnectionType connectionType=Qt::BlockingQueuedConnection)
Returns a pointer to the active QgsNetworkAccessManager for the current thread.
 
A class to represent a 2D point.
 
int height() const
Returns the height (number of rows) of the raster block.
 
char * bits(int row, int column)
Returns a pointer to block data.
 
double noDataValue() const
Returns no data value.
 
Qgis::DataType dataType() const
Returns data type.
 
int width() const
Returns the width (number of columns) of the raster block.
 
ResamplingMethod
Resampling method for provider-level resampling.
 
@ Lanczos
Lanczos windowed sinc interpolation (6x6 kernel)
 
@ Nearest
Nearest-neighbour resampling.
 
@ Mode
Mode (selects the value which appears most often of all the sampled points)
 
@ Bilinear
Bilinear (2x2 kernel) resampling.
 
@ Average
Average resampling.
 
@ CubicSpline
Cubic B-Spline Approximation (4x4 kernel)
 
@ Cubic
Cubic Convolution Approximation (4x4 kernel) resampling.
 
A rectangle specified with double values.
 
double xMinimum() const
Returns the x minimum value (left side of rectangle).
 
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
 
double width() const
Returns the width of the rectangle.
 
double height() const
Returns the height of the rectangle.
 
This class is a composition of two QSettings instances:
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
std::unique_ptr< std::remove_pointer< GDALDatasetH >::type, GDALDatasetCloser > dataset_unique_ptr
Scoped GDAL dataset.
 
std::unique_ptr< GDALWarpOptions, GDALWarpOptionsDeleter > warp_options_unique_ptr
Scoped GDAL warp options.
 
#define QgsDebugError(str)
 
const QgsCoordinateReferenceSystem & crs