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 char **driverMetadata = GDALGetMetadata( driver,
nullptr );
43 return CSLFetchBoolean( driverMetadata, GDAL_DCAP_CREATE,
false ) &&
44 CSLFetchBoolean( driverMetadata, GDAL_DCAP_RASTER,
false );
54 GDALDriverH hDriverMem = GDALGetDriverByName(
"MEM" );
62 const double cellSizeX = extent.
width() / width;
63 const double cellSizeY = extent.
height() / height;
64 double geoTransform[6];
66 geoTransform[1] = cellSizeX;
68 geoTransform[3] = extent.
yMinimum() + ( cellSizeY * height );
70 geoTransform[5] = -cellSizeY;
73 GDALSetGeoTransform( hSrcDS.get(), geoTransform );
79 const double cellSizeX = extent.
width() / width;
80 const double cellSizeY = extent.
height() / height;
81 double geoTransform[6];
83 geoTransform[1] = cellSizeX;
85 geoTransform[3] = extent.
yMinimum() + ( cellSizeY * height );
87 geoTransform[5] = -cellSizeY;
89 GDALDriverH hDriver = GDALGetDriverByName(
"GTiff" );
96 gdal::dataset_unique_ptr hDstDS( GDALCreate( hDriver, filename.toUtf8().constData(), width, height, 1, dataType,
nullptr ) );
104 GDALSetGeoTransform( hDstDS.get(), geoTransform );
110 if ( image.isNull() )
113 const QRgb *rgb =
reinterpret_cast<const QRgb *
>( image.constBits() );
114 GDALDriverH hDriverMem = GDALGetDriverByName(
"MEM" );
119 gdal::dataset_unique_ptr hSrcDS( GDALCreate( hDriverMem,
"", image.width(), image.height(), 0, GDT_Byte,
nullptr ) );
122 << QStringLiteral(
"PIXELOFFSET=%1" ).arg(
sizeof( QRgb ) )
123 << QStringLiteral(
"LINEOFFSET=%1" ).arg( image.bytesPerLine() )
124 << QStringLiteral(
"DATAPOINTER=%1" ).arg(
reinterpret_cast< qulonglong
>( rgb ) + 2 ) );
125 GDALAddBand( hSrcDS.get(), GDT_Byte, papszOptions );
126 CSLDestroy( papszOptions );
129 << QStringLiteral(
"PIXELOFFSET=%1" ).arg(
sizeof( QRgb ) )
130 << QStringLiteral(
"LINEOFFSET=%1" ).arg( image.bytesPerLine() )
131 << QStringLiteral(
"DATAPOINTER=%1" ).arg(
reinterpret_cast< qulonglong
>( rgb ) + 1 ) );
132 GDALAddBand( hSrcDS.get(), GDT_Byte, papszOptions );
133 CSLDestroy( papszOptions );
136 << QStringLiteral(
"PIXELOFFSET=%1" ).arg(
sizeof( QRgb ) )
137 << QStringLiteral(
"LINEOFFSET=%1" ).arg( image.bytesPerLine() )
138 << QStringLiteral(
"DATAPOINTER=%1" ).arg(
reinterpret_cast< qulonglong
>( rgb ) ) );
139 GDALAddBand( hSrcDS.get(), GDT_Byte, papszOptions );
140 CSLDestroy( papszOptions );
143 << QStringLiteral(
"PIXELOFFSET=%1" ).arg(
sizeof( QRgb ) )
144 << QStringLiteral(
"LINEOFFSET=%1" ).arg( image.bytesPerLine() )
145 << QStringLiteral(
"DATAPOINTER=%1" ).arg(
reinterpret_cast< qulonglong
>( rgb ) + 3 ) );
146 GDALAddBand( hSrcDS.get(), GDT_Byte, papszOptions );
147 CSLDestroy( papszOptions );
157 GDALDriverH hDriverMem = GDALGetDriverByName(
"MEM" );
161 const double cellSizeX = extent.
width() / pixelWidth;
162 const double cellSizeY = extent.
height() / pixelHeight;
163 double geoTransform[6];
164 geoTransform[0] = extent.
xMinimum();
165 geoTransform[1] = cellSizeX;
167 geoTransform[3] = extent.
yMinimum() + ( cellSizeY * pixelHeight );
169 geoTransform[5] = -cellSizeY;
173 int dataTypeSize = GDALGetDataTypeSizeBytes( dataType );
175 << QStringLiteral(
"PIXELOFFSET=%1" ).arg( dataTypeSize )
176 << QStringLiteral(
"LINEOFFSET=%1" ).arg( pixelWidth * dataTypeSize )
177 << QStringLiteral(
"DATAPOINTER=%1" ).arg(
reinterpret_cast< qulonglong
>( block ) ) );
178 GDALAddBand( hDstDS.get(), dataType, papszOptions );
179 CSLDestroy( papszOptions );
181 GDALSetGeoTransform( hDstDS.get(), geoTransform );
194 GDALRasterBandH band = GDALGetRasterBand( ret.get(), 1 );
196 GDALSetRasterNoDataValue( band, block->
noDataValue() );
213 GDALDriverH hDriverMem = GDALGetDriverByName(
"MEM" );
217 const double cellSizeX = gridXSize / block->
width();
218 const double cellSizeY = gridYSize / block->
height();
219 double geoTransform[6];
220 geoTransform[0] = origin.
x();
221 geoTransform[1] = cellSizeX * std::cos( rotation );
222 geoTransform[2] = cellSizeY * std::sin( rotation );
223 geoTransform[3] = origin.
y();
224 geoTransform[4] = cellSizeX * std::sin( rotation );
225 geoTransform[5] = -cellSizeY * std::cos( rotation );
230 int dataTypeSize = GDALGetDataTypeSizeBytes( dataType );
232 << QStringLiteral(
"PIXELOFFSET=%1" ).arg( dataTypeSize )
233 << QStringLiteral(
"LINEOFFSET=%1" ).arg( block->
width() * dataTypeSize )
234 << QStringLiteral(
"DATAPOINTER=%1" ).arg(
reinterpret_cast< qulonglong
>( block->
bits() ) ) );
235 GDALAddBand( hDstDS.get(), dataType, papszOptions );
236 CSLDestroy( papszOptions );
238 GDALSetGeoTransform( hDstDS.get(), geoTransform );
240 GDALRasterBandH band = GDALGetRasterBand( hDstDS.get(), 1 );
242 GDALSetRasterNoDataValue( band, block->
noDataValue() );
247static bool resampleSingleBandRasterStatic(
GDALDatasetH hSrcDS,
GDALDatasetH hDstDS, GDALResampleAlg resampleAlg,
char **papszOptions )
250 psWarpOptions->hSrcDS = hSrcDS;
251 psWarpOptions->hDstDS = hDstDS;
253 psWarpOptions->nBandCount = 1;
254 psWarpOptions->panSrcBands =
reinterpret_cast< int *
>( CPLMalloc(
sizeof(
int ) * 1 ) );
255 psWarpOptions->panDstBands =
reinterpret_cast< int *
>( CPLMalloc(
sizeof(
int ) * 1 ) );
256 psWarpOptions->panSrcBands[0] = 1;
257 psWarpOptions->panDstBands[0] = 1;
258 double noDataValue = GDALGetRasterNoDataValue( GDALGetRasterBand( hDstDS, 1 ),
nullptr );
259 psWarpOptions->padfDstNoDataReal =
reinterpret_cast< double *
>( CPLMalloc(
sizeof(
double ) * 1 ) );
260 psWarpOptions->padfDstNoDataReal[0] = noDataValue;
261 psWarpOptions->eResampleAlg = resampleAlg;
264 psWarpOptions->pTransformerArg = GDALCreateGenImgProjTransformer2( hSrcDS, hDstDS, papszOptions );
266 if ( ! psWarpOptions->pTransformerArg )
271 psWarpOptions->pfnTransformer = GDALGenImgProjTransform;
272 psWarpOptions->papszWarpOptions = CSLSetNameValue( psWarpOptions-> papszWarpOptions,
"INIT_DEST",
"NO_DATA" );
276 GDALWarpOperation oOperation;
277 CPLErr initResult = oOperation.Initialize( psWarpOptions.get() );
278 if ( initResult != CE_Failure )
279 retVal = oOperation.ChunkAndWarpImage( 0, 0, GDALGetRasterXSize( hDstDS ), GDALGetRasterYSize( hDstDS ) ) == CE_None;
280 GDALDestroyGenImgProjTransformer( psWarpOptions->pTransformerArg );
286 char **papszOptions =
nullptr;
287 if ( pszCoordinateOperation !=
nullptr )
288 papszOptions = CSLSetNameValue( papszOptions,
"COORDINATE_OPERATION", pszCoordinateOperation );
290 bool result = resampleSingleBandRasterStatic( hSrcDS, hDstDS, resampleAlg, papszOptions );
291 CSLDestroy( papszOptions );
297 GDALResampleAlg resampleAlg,
301 char **papszOptions =
nullptr;
306 bool result = resampleSingleBandRasterStatic( hSrcDS, hDstDS, resampleAlg, papszOptions );
307 CSLDestroy( papszOptions );
317 GDALRasterIOExtraArg extra;
318 INIT_RASTERIO_EXTRA_ARG( extra );
319 extra.eResampleAlg = resampleAlg;
321 QImage res( outputSize, image.format() );
325 GByte *rgb =
reinterpret_cast<GByte *
>( res.bits() );
327 CPLErr err = GDALRasterIOEx( GDALGetRasterBand( srcDS.get(), 1 ), GF_Read, 0, 0, image.width(), image.height(), rgb + 2, outputSize.width(),
328 outputSize.height(), GDT_Byte,
sizeof( QRgb ), res.bytesPerLine(), &extra );
329 if ( err != CE_None )
331 QgsDebugError( QStringLiteral(
"failed to read red band" ) );
335 err = GDALRasterIOEx( GDALGetRasterBand( srcDS.get(), 2 ), GF_Read, 0, 0, image.width(), image.height(), rgb + 1, outputSize.width(),
336 outputSize.height(), GDT_Byte,
sizeof( QRgb ), res.bytesPerLine(), &extra );
337 if ( err != CE_None )
339 QgsDebugError( QStringLiteral(
"failed to read green band" ) );
343 err = GDALRasterIOEx( GDALGetRasterBand( srcDS.get(), 3 ), GF_Read, 0, 0, image.width(), image.height(), rgb, outputSize.width(),
344 outputSize.height(), GDT_Byte,
sizeof( QRgb ), res.bytesPerLine(), &extra );
345 if ( err != CE_None )
347 QgsDebugError( QStringLiteral(
"failed to read blue band" ) );
351 err = GDALRasterIOEx( GDALGetRasterBand( srcDS.get(), 4 ), GF_Read, 0, 0, image.width(), image.height(), rgb + 3, outputSize.width(),
352 outputSize.height(), GDT_Byte,
sizeof( QRgb ), res.bytesPerLine(), &extra );
353 if ( err != CE_None )
355 QgsDebugError( QStringLiteral(
"failed to read alpha band" ) );
365 GDALDriverH myGdalDriver = GDALGetDriverByName( format.toLocal8Bit().constData() );
369 char **GDALmetadata = GDALGetMetadata( myGdalDriver,
nullptr );
370 message += QLatin1String(
"Format Details:\n" );
371 message += QStringLiteral(
" Extension: %1\n" ).arg( CSLFetchNameValue( GDALmetadata, GDAL_DMD_EXTENSION ) );
372 message += QStringLiteral(
" Short Name: %1" ).arg( GDALGetDriverShortName( myGdalDriver ) );
373 message += QStringLiteral(
" / Long Name: %1\n" ).arg( GDALGetDriverLongName( myGdalDriver ) );
374 message += QStringLiteral(
" Help page: http://www.gdal.org/%1\n\n" ).arg( CSLFetchNameValue( GDALmetadata, GDAL_DMD_HELPTOPIC ) );
378 CPLXMLNode *psCOL = CPLParseXMLString( GDALGetMetadataItem( myGdalDriver,
379 GDAL_DMD_CREATIONOPTIONLIST,
"" ) );
380 char *pszFormattedXML = CPLSerializeXMLTree( psCOL );
381 if ( pszFormattedXML )
382 message += QString( pszFormattedXML );
384 CPLDestroyXMLNode( psCOL );
385 if ( pszFormattedXML )
386 CPLFree( pszFormattedXML );
393 char **papszRetList =
nullptr;
394 const auto constList = list;
395 for (
const QString &elem : constList )
397 papszRetList = CSLAddString( papszRetList, elem.toLocal8Bit().constData() );
404 GDALDriverH myGdalDriver = GDALGetDriverByName( format.toLocal8Bit().constData() );
405 if ( ! myGdalDriver )
406 return QStringLiteral(
"invalid GDAL driver" );
410 const int ok = GDALValidateCreationOptions( myGdalDriver, papszOptions );
411 CSLDestroy( papszOptions );
414 return QStringLiteral(
"Failed GDALValidateCreationOptions() test" );
420 const char *pszSrcWKT,
421 const char *pszDstWKT,
422 GDALResampleAlg eResampleAlg,
424 const GDALWarpOptions *psOptionsIn )
426 char **opts =
nullptr;
427 if ( GDALGetMetadata( hSrcDS,
"RPC" ) )
430 const char *heightOffStr = GDALGetMetadataItem( hSrcDS,
"HEIGHT_OFF",
"RPC" );
432 opts = CSLAddNameValue( opts,
"RPC_HEIGHT", heightOffStr );
435 return GDALAutoCreateWarpedVRTEx( hSrcDS, pszSrcWKT, pszDstWKT, eResampleAlg, dfMaxError, psOptionsIn, opts );
440 char **opts = CSLDuplicate( papszOptions );
441 if ( GDALGetMetadata( hSrcDS,
"RPC" ) )
444 const char *heightOffStr = GDALGetMetadataItem( hSrcDS,
"HEIGHT_OFF",
"RPC" );
446 opts = CSLAddNameValue( opts,
"RPC_HEIGHT", heightOffStr );
448 void *transformer = GDALCreateGenImgProjTransformer2( hSrcDS, hDstDS, opts );
458 return GDALDataType::GDT_Unknown;
461 return GDALDataType::GDT_Byte;
464#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,7,0)
465 return GDALDataType::GDT_Int8;
467 return GDALDataType::GDT_Unknown;
471 return GDALDataType::GDT_UInt16;
474 return GDALDataType::GDT_Int16;
477 return GDALDataType::GDT_UInt32;
480 return GDALDataType::GDT_Int32;
483 return GDALDataType::GDT_Float32;
486 return GDALDataType::GDT_Float64;
489 return GDALDataType::GDT_CInt16;
492 return GDALDataType::GDT_CInt32;
495 return GDALDataType::GDT_CFloat32;
498 return GDALDataType::GDT_CFloat64;
502 return GDALDataType::GDT_Unknown;
506 return GDALDataType::GDT_Unknown;
511 GDALResampleAlg eResampleAlg = GRA_NearestNeighbour;
516 eResampleAlg = GRA_NearestNeighbour;
520 eResampleAlg = GRA_Bilinear;
524 eResampleAlg = GRA_Cubic;
528 eResampleAlg = GRA_CubicSpline;
532 eResampleAlg = GRA_Lanczos;
536 eResampleAlg = GRA_Average;
540 eResampleAlg = GRA_Mode;
547#ifndef QT_NO_NETWORKPROXY
557 if ( settings.
value( QStringLiteral(
"proxy/proxyEnabled" ),
false ).toBool() )
561 if ( ! proxies.isEmpty() )
563 const QNetworkProxy proxy( proxies.first() );
568 const QString proxyHost( proxy.hostName() );
569 const quint16 proxyPort( proxy.port() );
571 const QString proxyUser( proxy.user() );
572 const QString proxyPassword( proxy.password() );
574 if ( ! proxyHost.isEmpty() )
576 QString connection( proxyHost );
579 connection +=
':' + QString::number( proxyPort );
581 CPLSetConfigOption(
"GDAL_HTTP_PROXY", connection.toUtf8() );
582 if ( ! proxyUser.isEmpty( ) )
584 QString credentials( proxyUser );
585 if ( ! proxyPassword.isEmpty( ) )
587 credentials +=
':' + proxyPassword;
589 CPLSetConfigOption(
"GDAL_HTTP_PROXYUSERPWD", credentials.toUtf8() );
598 const QFileInfo info( path );
599 const long long size = info.size();
605 const QString suffix = info.suffix().toLower();
606 static const QStringList sFileSizeDependentExtensions
608 QStringLiteral(
"xlsx" ),
609 QStringLiteral(
"ods" ),
610 QStringLiteral(
"csv" )
612 if ( sFileSizeDependentExtensions.contains( suffix ) )
615 return size < smallFileSizeLimit;
625#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,4,0)
627 static std::once_flag initialized;
628 static QStringList SUPPORTED_DB_LAYERS_EXTENSIONS;
629 std::call_once( initialized, [ = ]
633 GDALDriverH driver =
nullptr;
635 QSet< QString > extensions;
637 for (
int i = 0; i < GDALGetDriverCount(); ++i )
639 driver = GDALGetDriver( i );
646 bool isMultiLayer =
false;
647 if ( QString( GDALGetMetadataItem( driver, GDAL_DCAP_RASTER,
nullptr ) ) == QLatin1String(
"YES" ) )
649 if ( GDALGetMetadataItem( driver, GDAL_DMD_SUBDATASETS,
nullptr ) !=
nullptr )
654 if ( !isMultiLayer && QString( GDALGetMetadataItem( driver, GDAL_DCAP_VECTOR,
nullptr ) ) == QLatin1String(
"YES" ) )
656 if ( GDALGetMetadataItem( driver, GDAL_DCAP_MULTIPLE_VECTOR_LAYERS,
nullptr ) !=
nullptr )
665 const QString driverExtensions = GDALGetMetadataItem( driver, GDAL_DMD_EXTENSIONS,
"" );
666 if ( driverExtensions.isEmpty() )
669 const QStringList splitExtensions = driverExtensions.split(
' ', Qt::SkipEmptyParts );
671 for (
const QString &ext : splitExtensions )
674 if ( ext == QLatin1String(
"tif" ) || ext == QLatin1String(
"tiff" ) )
677 extensions.insert( ext );
681 SUPPORTED_DB_LAYERS_EXTENSIONS = QStringList( extensions.constBegin(), extensions.constEnd() );
683 return SUPPORTED_DB_LAYERS_EXTENSIONS;
686 static const QStringList SUPPORTED_DB_LAYERS_EXTENSIONS
688 QStringLiteral(
"gpkg" ),
689 QStringLiteral(
"sqlite" ),
690 QStringLiteral(
"db" ),
691 QStringLiteral(
"gdb" ),
692 QStringLiteral(
"kml" ),
693 QStringLiteral(
"kmz" ),
694 QStringLiteral(
"osm" ),
695 QStringLiteral(
"mdb" ),
696 QStringLiteral(
"accdb" ),
697 QStringLiteral(
"xls" ),
698 QStringLiteral(
"xlsx" ),
699 QStringLiteral(
"ods" ),
700 QStringLiteral(
"gpx" ),
701 QStringLiteral(
"pdf" ),
702 QStringLiteral(
"pbf" ),
703 QStringLiteral(
"vrt" ),
704 QStringLiteral(
"nc" ),
705 QStringLiteral(
"dxf" ),
706 QStringLiteral(
"shp.zip" ) };
707 return SUPPORTED_DB_LAYERS_EXTENSIONS;
715 for (
const QString &vsiPrefix : vsiPrefixes )
717 if ( path.startsWith( vsiPrefix, Qt::CaseInsensitive ) )
721 if ( path.endsWith( QLatin1String(
".shp.zip" ), Qt::CaseInsensitive ) )
724 if ( GDALIdentifyDriverEx( path.toUtf8().constData(), GDAL_OF_VECTOR,
nullptr,
nullptr ) )
726 return QStringLiteral(
"/vsizip/" );
728 else if ( path.endsWith( QLatin1String(
".zip" ), Qt::CaseInsensitive ) )
729 return QStringLiteral(
"/vsizip/" );
730 else if ( path.endsWith( QLatin1String(
".tar" ), Qt::CaseInsensitive ) ||
731 path.endsWith( QLatin1String(
".tar.gz" ), Qt::CaseInsensitive ) ||
732 path.endsWith( QLatin1String(
".tgz" ), Qt::CaseInsensitive ) )
733 return QStringLiteral(
"/vsitar/" );
734 else if ( path.endsWith( QLatin1String(
".gz" ), Qt::CaseInsensitive ) )
735 return QStringLiteral(
"/vsigzip/" );
736#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,7,0)
737 else if ( vsiPrefixes.contains( QStringLiteral(
"/vsi7z/" ) ) &&
738 ( path.endsWith( QLatin1String(
".7z" ), Qt::CaseInsensitive ) ||
739 path.endsWith( QLatin1String(
".lpk" ), Qt::CaseInsensitive ) ||
740 path.endsWith( QLatin1String(
".lpkx" ), Qt::CaseInsensitive ) ||
741 path.endsWith( QLatin1String(
".mpk" ), Qt::CaseInsensitive ) ||
742 path.endsWith( QLatin1String(
".mpkx" ), Qt::CaseInsensitive ) ) )
743 return QStringLiteral(
"/vsi7z/" );
744 else if ( vsiPrefixes.contains( QStringLiteral(
"/vsirar/" ) ) &&
745 path.endsWith( QLatin1String(
".rar" ), Qt::CaseInsensitive ) )
746 return QStringLiteral(
"/vsirar/" );
754 QStringList res { QStringLiteral(
"/vsizip/" ),
755 QStringLiteral(
"/vsitar/" ),
756 QStringLiteral(
"/vsigzip/" ),
758#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,7,0)
759 res.append( QStringLiteral(
"/vsi7z/" ) );
760 res.append( QStringLiteral(
"/vsirar/" ) );
772 QStringList res { QStringLiteral(
".zip" ),
773 QStringLiteral(
".tar" ),
774 QStringLiteral(
".tar.gz" ),
775 QStringLiteral(
".tgz" ),
776 QStringLiteral(
".gz" ),
778#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,7,0)
779 res.append( { QStringLiteral(
".7z" ),
780 QStringLiteral(
".lpk" ),
781 QStringLiteral(
".lpkx" ),
782 QStringLiteral(
".mpk" ),
783 QStringLiteral(
".mpkx" ),
784 QStringLiteral(
".rar" )
792 const QString extWithDot = extension.startsWith(
'.' ) ? extension : (
'.' + extension );
798 CPLPushErrorHandler( CPLQuietErrorHandler );
800 GDALDriverH hDriver =
nullptr;
805 hDriver = GDALIdentifyDriverEx( vrtPath.toUtf8().constData(), GDAL_OF_VECTOR,
nullptr,
nullptr );
809 hDriver = GDALIdentifyDriverEx( vrtPath.toUtf8().constData(), GDAL_OF_RASTER,
nullptr,
nullptr );
822 CPLPopErrorHandler();
823 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.
This class represents a coordinate reference system (CRS).
@ WKT_PREFERRED_GDAL
Preferred format for conversion of CRS to WKT for use with the GDAL library.
QString toWkt(WktVariant variant=WKT1_GDAL, 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