28 #include <QCoreApplication> 29 #include <QProgressDialog> 30 #include <QTextStream> 31 #include <QMessageBox> 34 #include <cpl_string.h> 42 double geoTransform[6];
43 globalOutputParameters( extent, width, height, geoTransform, pixelSize );
45 return initOutput( width, height, crs, geoTransform, 1, dataType, QList<bool>(), QList<double>() );
54 double geoTransform[6];
55 globalOutputParameters( extent, width, height, geoTransform, pixelSize );
57 return initOutput( width, height, crs, geoTransform, nBands, dataType, QList<bool>(), QList<double>() );
61 : mOutputUrl( outputUrl )
99 QgsDebugMsgLevel( QStringLiteral(
"reading from %1" ).arg(
typeid( *iface ).name() ), 4 );
103 QgsDebugMsg( QStringLiteral(
"iface->srcInput() == 0" ) );
108 QgsDebugMsgLevel( QStringLiteral(
"srcInput = %1" ).arg(
typeid( srcInput ).name() ), 4 );
111 mFeedback = feedback;
118 QFileInfo fileInfo( mOutputUrl );
119 if ( !fileInfo.exists() )
121 QDir dir = fileInfo.dir();
122 if ( !dir.mkdir( fileInfo.fileName() ) )
124 QgsDebugMsg(
"Cannot create output VRT directory " + fileInfo.fileName() +
" in " + dir.absolutePath() );
131 QFile pyramidFile( mOutputUrl + ( mTiledMode ?
".vrt.ovr" :
".ovr" ) );
132 if ( pyramidFile.exists() )
133 pyramidFile.remove();
134 pyramidFile.setFileName( mOutputUrl + ( mTiledMode ?
".vrt.rrd" :
".rrd" ) );
135 if ( pyramidFile.exists() )
136 pyramidFile.remove();
138 if ( mMode ==
Image )
140 WriterError e = writeImageRaster( &iter, nCols, nRows, outputExtent, crs, feedback );
145 WriterError e = writeDataRaster( pipe, &iter, nCols, nRows, outputExtent, crs, feedback );
168 QgsDebugMsg( QStringLiteral(
"Cannot get source data provider" ) );
185 for (
int i = 2; i <= nBands; ++i )
197 QList<bool> destHasNoDataValueList;
198 QList<double> destNoDataValueList;
199 QList<Qgis::DataType> destDataTypeList;
200 destDataTypeList.reserve( nBands );
201 destHasNoDataValueList.reserve( nBands );
202 destNoDataValueList.reserve( nBands );
204 for (
int bandNo = 1; bandNo <= nBands; bandNo++ )
209 bool destHasNoDataValue =
false;
210 double destNoDataValue = std::numeric_limits<double>::quiet_NaN();
214 if ( srcHasNoDataValue )
219 destHasNoDataValue =
true;
221 else if ( nuller && !nuller->
noData( bandNo ).isEmpty() )
224 destNoDataValue = nuller->
noData( bandNo ).value( 0 ).min();
225 destHasNoDataValue =
true;
237 srcExtent = ct.transformBoundingBox( outputExtent );
250 destNoDataValue = typeMinValue;
254 destNoDataValue = typeMaxValue;
261 destHasNoDataValue =
true;
265 if ( nuller && destHasNoDataValue )
270 QgsDebugMsgLevel( QStringLiteral(
"bandNo = %1 destDataType = %2 destHasNoDataValue = %3 destNoDataValue = %4" ).arg( bandNo ).arg( destDataType ).arg( destHasNoDataValue ).arg( destNoDataValue ), 4 );
271 destDataTypeList.append( destDataType );
272 destHasNoDataValueList.append( destHasNoDataValue );
273 destNoDataValueList.append( destNoDataValue );
278 for (
int i = 1; i < nBands; i++ )
280 if ( destDataTypeList.value( i ) > destDataType )
282 destDataType = destDataTypeList.value( i );
290 double geoTransform[6];
291 globalOutputParameters( outputExtent, nCols, nRows, geoTransform, pixelSize );
294 destProvider = initOutput( nCols, nRows, crs, geoTransform, nBands, destDataType, destHasNoDataValueList, destNoDataValueList );
296 WriterError error = writeDataRaster( pipe, iter, nCols, nRows, outputExtent, crs, destDataType, destHasNoDataValueList, destNoDataValueList, destProvider, feedback );
305 destProvider =
nullptr;
313 for (
int i = 0; i < nBands; i++ )
315 double destNoDataValue;
317 destDataTypeList.replace( i, destDataType );
318 destNoDataValueList.replace( i, destNoDataValue );
320 destDataType = destDataTypeList.value( 0 );
323 destProvider = initOutput( nCols, nRows, crs, geoTransform, nBands, destDataType, destHasNoDataValueList, destNoDataValueList );
324 error = writeDataRaster( pipe, iter, nCols, nRows, outputExtent, crs, destDataType, destHasNoDataValueList, destNoDataValueList, destProvider, feedback );
333 int nCols,
int nRows,
337 const QList<bool> &destHasNoDataValueList,
338 const QList<double> &destNoDataValueList,
343 Q_UNUSED( destHasNoDataValueList );
357 QList<QgsRasterBlock *> blockList;
358 blockList.reserve( nBands );
359 for (
int i = 1; i <= nBands; ++i )
362 blockList.push_back(
nullptr );
363 if ( destProvider && destHasNoDataValueList.value( i - 1 ) )
365 destProvider->
setNoDataValue( i, destNoDataValueList.value( i - 1 ) );
375 nParts = nPartsX * nPartsY;
382 for (
int i = 1; i <= nBands; ++i )
384 if ( !iter->
readNextRasterPart( i, iterCols, iterRows, &( blockList[i - 1] ), iterLeft, iterTop ) )
389 QString vrtFilePath( mOutputUrl +
'/' + vrtFileName() );
390 writeVRT( vrtFilePath );
393 buildPyramids( vrtFilePath );
400 buildPyramids( mOutputUrl, destProvider );
410 if ( feedback && fileIndex < ( nParts - 1 ) )
412 feedback->
setProgress( 100.0 * fileIndex / static_cast< double >( nParts ) );
415 for (
int i = 0; i < nBands; ++i )
424 QList<QgsRasterBlock *> destBlockList;
425 for (
int i = 1; i <= nBands; ++i )
427 if ( srcProvider && srcProvider->
dataType( i ) == destDataType )
429 destBlockList.push_back( blockList[i - 1] );
434 blockList[i - 1]->convert( destDataType );
435 destBlockList.push_back( blockList[i - 1] );
437 blockList[i - 1] =
nullptr;
443 nCols, iterCols, iterRows,
444 iterLeft, iterTop, mOutputUrl,
445 fileIndex, nBands, destDataType, crs );
447 if ( partDestProvider )
450 for (
int i = 1; i <= nBands; ++i )
452 if ( destHasNoDataValueList.value( i - 1 ) )
454 partDestProvider->
setNoDataValue( i, destNoDataValueList.value( i - 1 ) );
456 partDestProvider->
write( destBlockList[i - 1]->bits( 0 ), i, iterCols, iterRows, 0, 0 );
457 delete destBlockList[i - 1];
458 addToVRT( partFileName( fileIndex ), i, iterCols, iterRows, iterLeft, iterTop );
460 delete partDestProvider;
463 else if ( destProvider )
466 for (
int i = 1; i <= nBands; ++i )
468 destProvider->
write( destBlockList[i - 1]->bits( 0 ), i, iterCols, iterRows, iterLeft, iterTop );
469 delete destBlockList[i - 1];
501 void *redData =
qgsMalloc( mMaxTileWidth * mMaxTileHeight );
502 void *greenData =
qgsMalloc( mMaxTileWidth * mMaxTileHeight );
503 void *blueData =
qgsMalloc( mMaxTileWidth * mMaxTileHeight );
504 void *alphaData =
qgsMalloc( mMaxTileWidth * mMaxTileHeight );
505 int iterLeft = 0, iterTop = 0, iterCols = 0, iterRows = 0;
510 double geoTransform[6];
511 globalOutputParameters( outputExtent, nCols, nRows, geoTransform, pixelSize );
513 std::unique_ptr< QgsRasterDataProvider > destProvider( initOutput( nCols, nRows, crs, geoTransform, 4,
Qgis::Byte ) );
522 nParts = nPartsX * nPartsY;
525 std::unique_ptr< QgsRasterBlock > inputBlock;
526 while ( iter->
readNextRasterPart( 1, iterCols, iterRows, inputBlock, iterLeft, iterTop ) )
533 if ( feedback && fileIndex < ( nParts - 1 ) )
535 feedback->
setProgress( 100.0 * fileIndex / static_cast< double >( nParts ) );
549 for (
qgssize i = 0; i < nPixels; ++i )
551 QRgb
c = inputBlock->color( i );
559 double a = alpha / 255.;
560 QgsDebugMsgLevel( QStringLiteral(
"red = %1 green = %2 blue = %3 alpha = %4 p = %5 a = %6" ).arg( red ).arg( green ).arg( blue ).arg( alpha ).arg( static_cast< int >( c ), 0, 16 ).arg( a ), 5 );
565 memcpy( reinterpret_cast< char * >( redData ) + i, &red, 1 );
566 memcpy( reinterpret_cast< char * >( greenData ) + i, &green, 1 );
567 memcpy( reinterpret_cast< char * >( blueData ) + i, &blue, 1 );
568 memcpy( reinterpret_cast< char * >( alphaData ) + i, &alpha, 1 );
575 std::unique_ptr< QgsRasterDataProvider > partDestProvider( createPartProvider( outputExtent,
576 nCols, iterCols, iterRows,
577 iterLeft, iterTop, mOutputUrl, fileIndex,
580 if ( partDestProvider )
583 partDestProvider->write( redData, 1, iterCols, iterRows, 0, 0 );
584 partDestProvider->write( greenData, 2, iterCols, iterRows, 0, 0 );
585 partDestProvider->write( blueData, 3, iterCols, iterRows, 0, 0 );
586 partDestProvider->write( alphaData, 4, iterCols, iterRows, 0, 0 );
588 addToVRT( partFileName( fileIndex ), 1, iterCols, iterRows, iterLeft, iterTop );
589 addToVRT( partFileName( fileIndex ), 2, iterCols, iterRows, iterLeft, iterTop );
590 addToVRT( partFileName( fileIndex ), 3, iterCols, iterRows, iterLeft, iterTop );
591 addToVRT( partFileName( fileIndex ), 4, iterCols, iterRows, iterLeft, iterTop );
594 else if ( destProvider )
596 destProvider->write( redData, 1, iterCols, iterRows, iterLeft, iterTop );
597 destProvider->write( greenData, 2, iterCols, iterRows, iterLeft, iterTop );
598 destProvider->write( blueData, 3, iterCols, iterRows, iterLeft, iterTop );
599 destProvider->write( alphaData, 4, iterCols, iterRows, iterLeft, iterTop );
604 destProvider.reset();
618 QString vrtFilePath( mOutputUrl +
'/' + vrtFileName() );
619 writeVRT( vrtFilePath );
622 buildPyramids( vrtFilePath );
629 buildPyramids( mOutputUrl );
635 void QgsRasterFileWriter::addToVRT(
const QString &filename,
int band,
int xSize,
int ySize,
int xOffset,
int yOffset )
637 QDomElement bandElem = mVRTBands.value( band - 1 );
639 QDomElement simpleSourceElem = mVRTDocument.createElement( QStringLiteral(
"SimpleSource" ) );
642 QDomElement sourceFilenameElem = mVRTDocument.createElement( QStringLiteral(
"SourceFilename" ) );
643 sourceFilenameElem.setAttribute( QStringLiteral(
"relativeToVRT" ), QStringLiteral(
"1" ) );
644 QDomText sourceFilenameText = mVRTDocument.createTextNode( filename );
645 sourceFilenameElem.appendChild( sourceFilenameText );
646 simpleSourceElem.appendChild( sourceFilenameElem );
649 QDomElement sourceBandElem = mVRTDocument.createElement( QStringLiteral(
"SourceBand" ) );
650 QDomText sourceBandText = mVRTDocument.createTextNode( QString::number( band ) );
651 sourceBandElem.appendChild( sourceBandText );
652 simpleSourceElem.appendChild( sourceBandElem );
655 QDomElement sourcePropertiesElem = mVRTDocument.createElement( QStringLiteral(
"SourceProperties" ) );
656 sourcePropertiesElem.setAttribute( QStringLiteral(
"RasterXSize" ), xSize );
657 sourcePropertiesElem.setAttribute( QStringLiteral(
"RasterYSize" ), ySize );
658 sourcePropertiesElem.setAttribute( QStringLiteral(
"BlockXSize" ), xSize );
659 sourcePropertiesElem.setAttribute( QStringLiteral(
"BlockYSize" ), ySize );
660 sourcePropertiesElem.setAttribute( QStringLiteral(
"DataType" ), QStringLiteral(
"Byte" ) );
661 simpleSourceElem.appendChild( sourcePropertiesElem );
664 QDomElement srcRectElem = mVRTDocument.createElement( QStringLiteral(
"SrcRect" ) );
665 srcRectElem.setAttribute( QStringLiteral(
"xOff" ), QStringLiteral(
"0" ) );
666 srcRectElem.setAttribute( QStringLiteral(
"yOff" ), QStringLiteral(
"0" ) );
667 srcRectElem.setAttribute( QStringLiteral(
"xSize" ), xSize );
668 srcRectElem.setAttribute( QStringLiteral(
"ySize" ), ySize );
669 simpleSourceElem.appendChild( srcRectElem );
672 QDomElement dstRectElem = mVRTDocument.createElement( QStringLiteral(
"DstRect" ) );
673 dstRectElem.setAttribute( QStringLiteral(
"xOff" ), xOffset );
674 dstRectElem.setAttribute( QStringLiteral(
"yOff" ), yOffset );
675 dstRectElem.setAttribute( QStringLiteral(
"xSize" ), xSize );
676 dstRectElem.setAttribute( QStringLiteral(
"ySize" ), ySize );
677 simpleSourceElem.appendChild( dstRectElem );
679 bandElem.appendChild( simpleSourceElem );
682 void QgsRasterFileWriter::buildPyramids(
const QString &filename,
QgsRasterDataProvider *destProviderIn )
691 if ( !destProvider || !destProvider->
isValid() )
701 QList< QgsRasterPyramid> myPyramidList;
702 if ( ! mPyramidsList.isEmpty() )
704 for (
int myCounterInt = 0; myCounterInt < myPyramidList.count(); myCounterInt++ )
706 myPyramidList[myCounterInt].build =
true;
709 QgsDebugMsgLevel( QStringLiteral(
"building pyramids : %1 pyramids, %2 resampling, %3 format, %4 options" ).arg( myPyramidList.count() ).arg( mPyramidsResampling ).arg( mPyramidsFormat ).arg( mPyramidsConfigOptions.count() ), 4 );
711 QString res = destProvider->
buildPyramids( myPyramidList, mPyramidsResampling,
712 mPyramidsFormat, mPyramidsConfigOptions );
718 QString title, message;
719 if ( res == QLatin1String(
"ERROR_WRITE_ACCESS" ) )
721 title = QObject::tr(
"Building Pyramids" );
722 message = QObject::tr(
"Write access denied. Adjust the file permissions and try again." );
724 else if ( res == QLatin1String(
"ERROR_WRITE_FORMAT" ) )
726 title = QObject::tr(
"Building Pyramids" );
727 message = QObject::tr(
"The file was not writable. Some formats do not " 728 "support pyramid overviews. Consult the GDAL documentation if in doubt." );
730 else if ( res == QLatin1String(
"FAILED_NOT_SUPPORTED" ) )
732 title = QObject::tr(
"Building Pyramids" );
733 message = QObject::tr(
"Building pyramid overviews is not supported on this type of raster." );
735 else if ( res == QLatin1String(
"ERROR_VIRTUAL" ) )
737 title = QObject::tr(
"Building Pyramids" );
738 message = QObject::tr(
"Building pyramid overviews is not supported on this type of raster." );
740 QMessageBox::warning(
nullptr, title, message );
743 if ( !destProviderIn )
748 int QgsRasterFileWriter::pyramidsProgress(
double dfComplete,
const char *pszMessage,
void *pData )
750 Q_UNUSED( pszMessage );
751 GDALTermProgress( dfComplete, 0, 0 );
752 QProgressDialog *progressDialog =
static_cast<QProgressDialog *
>( pData );
753 if ( pData && progressDialog->wasCanceled() )
760 progressDialog->setRange( 0, 100 );
761 progressDialog->setValue( dfComplete * 100 );
767 void QgsRasterFileWriter::createVRT(
int xSize,
int ySize,
const QgsCoordinateReferenceSystem &crs,
double *geoTransform,
Qgis::DataType type,
const QList<bool> &destHasNoDataValueList,
const QList<double> &destNoDataValueList )
769 mVRTDocument.clear();
770 QDomElement VRTDatasetElem = mVRTDocument.createElement( QStringLiteral(
"VRTDataset" ) );
773 VRTDatasetElem.setAttribute( QStringLiteral(
"rasterXSize" ), xSize );
774 VRTDatasetElem.setAttribute( QStringLiteral(
"rasterYSize" ), ySize );
775 mVRTDocument.appendChild( VRTDatasetElem );
778 QDomElement SRSElem = mVRTDocument.createElement( QStringLiteral(
"SRS" ) );
779 QDomText crsText = mVRTDocument.createTextNode( crs.
toWkt() );
780 SRSElem.appendChild( crsText );
781 VRTDatasetElem.appendChild( SRSElem );
786 QDomElement geoTransformElem = mVRTDocument.createElement( QStringLiteral(
"GeoTransform" ) );
787 QString geoTransformString = QString::number( geoTransform[0],
'f', 6 ) +
", " + QString::number( geoTransform[1] ) +
", " + QString::number( geoTransform[2] ) +
788 ", " + QString::number( geoTransform[3],
'f', 6 ) +
", " + QString::number( geoTransform[4] ) +
", " + QString::number( geoTransform[5] );
789 QDomText geoTransformText = mVRTDocument.createTextNode( geoTransformString );
790 geoTransformElem.appendChild( geoTransformText );
791 VRTDatasetElem.appendChild( geoTransformElem );
804 QStringList colorInterp;
805 colorInterp << QStringLiteral(
"Red" ) << QStringLiteral(
"Green" ) << QStringLiteral(
"Blue" ) << QStringLiteral(
"Alpha" );
807 QMap<Qgis::DataType, QString> dataTypes;
808 dataTypes.insert(
Qgis::Byte, QStringLiteral(
"Byte" ) );
809 dataTypes.insert(
Qgis::UInt16, QStringLiteral(
"UInt16" ) );
810 dataTypes.insert(
Qgis::Int16, QStringLiteral(
"Int16" ) );
811 dataTypes.insert(
Qgis::UInt32, QStringLiteral(
"Int32" ) );
812 dataTypes.insert(
Qgis::Float32, QStringLiteral(
"Float32" ) );
813 dataTypes.insert(
Qgis::Float64, QStringLiteral(
"Float64" ) );
814 dataTypes.insert(
Qgis::CInt16, QStringLiteral(
"CInt16" ) );
815 dataTypes.insert(
Qgis::CInt32, QStringLiteral(
"CInt32" ) );
819 for (
int i = 1; i <= nBands; i++ )
821 QDomElement VRTBand = mVRTDocument.createElement( QStringLiteral(
"VRTRasterBand" ) );
823 VRTBand.setAttribute( QStringLiteral(
"band" ), QString::number( i ) );
824 QString dataType = dataTypes.value( type );
825 VRTBand.setAttribute( QStringLiteral(
"dataType" ), dataType );
827 if ( mMode ==
Image )
829 VRTBand.setAttribute( QStringLiteral(
"dataType" ), QStringLiteral(
"Byte" ) );
830 QDomElement colorInterpElement = mVRTDocument.createElement( QStringLiteral(
"ColorInterp" ) );
831 QDomText interpText = mVRTDocument.createTextNode( colorInterp.value( i - 1 ) );
832 colorInterpElement.appendChild( interpText );
833 VRTBand.appendChild( colorInterpElement );
836 if ( !destHasNoDataValueList.isEmpty() && destHasNoDataValueList.value( i - 1 ) )
838 VRTBand.setAttribute( QStringLiteral(
"NoDataValue" ), QString::number( destNoDataValueList.value( i - 1 ) ) );
841 mVRTBands.append( VRTBand );
842 VRTDatasetElem.appendChild( VRTBand );
846 bool QgsRasterFileWriter::writeVRT(
const QString &file )
848 QFile outputFile( file );
849 if ( ! outputFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
854 QTextStream outStream( &outputFile );
855 mVRTDocument.save( outStream, 2 );
860 int iterRows,
int iterLeft,
int iterTop,
const QString &
outputUrl,
int fileIndex,
int nBands,
Qgis::DataType type,
863 double mup = extent.
width() / nCols;
864 double mapLeft = extent.
xMinimum() + iterLeft * mup;
865 double mapRight = mapLeft + mup * iterCols;
866 double mapTop = extent.
yMaximum() - iterTop * mup;
867 double mapBottom = mapTop - iterRows * mup;
868 QgsRectangle mapRect( mapLeft, mapBottom, mapRight, mapTop );
870 QString outputFile =
outputUrl +
'/' + partFileName( fileIndex );
873 double geoTransform[6];
874 geoTransform[0] = mapRect.
xMinimum();
875 geoTransform[1] = mup;
876 geoTransform[2] = 0.0;
877 geoTransform[3] = mapRect.
yMaximum();
878 geoTransform[4] = 0.0;
879 geoTransform[5] = -mup;
891 const QList<bool> &destHasNoDataValueList,
const QList<double> &destNoDataValueList )
895 createVRT( nCols, nRows, crs, geoTransform, type, destHasNoDataValueList, destNoDataValueList );
903 if ( mBuildPyramidsFlag == -4 && mOutputProviderKey ==
"gdal" && mOutputFormat.compare( QLatin1String(
"gtiff" ), Qt::CaseInsensitive ) == 0 )
904 mCreateOptions <<
"COPY_SRC_OVERVIEWS=YES";
911 QgsDebugMsg( QStringLiteral(
"No provider created" ) );
918 void QgsRasterFileWriter::globalOutputParameters(
const QgsRectangle &extent,
int nCols,
int &nRows,
919 double *geoTransform,
double &pixelSize )
921 pixelSize = extent.
width() / nCols;
926 nRows =
static_cast< double >( nCols ) / extent.
width() * extent.
height() + 0.5;
928 geoTransform[0] = extent.
xMinimum();
929 geoTransform[1] = pixelSize;
930 geoTransform[2] = 0.0;
931 geoTransform[3] = extent.
yMaximum();
932 geoTransform[4] = 0.0;
933 geoTransform[5] = -( extent.
height() / nRows );
936 QString QgsRasterFileWriter::partFileName(
int fileIndex )
939 QFileInfo outputInfo( mOutputUrl );
940 return QStringLiteral(
"%1.%2.tif" ).arg( outputInfo.fileName() ).arg( fileIndex );
943 QString QgsRasterFileWriter::vrtFileName()
945 QFileInfo outputInfo( mOutputUrl );
946 return QStringLiteral(
"%1.vrt" ).arg( outputInfo.fileName() );
951 QString ext = extension.trimmed();
955 if ( ext.startsWith(
'.' ) )
959 int const drvCount = GDALGetDriverCount();
961 for (
int i = 0; i < drvCount; ++i )
963 GDALDriverH drv = GDALGetDriver( i );
966 char **driverMetadata = GDALGetMetadata( drv,
nullptr );
967 if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_RASTER,
false ) )
969 QString drvName = GDALGetDriverShortName( drv );
970 QStringList driverExtensions = QString( GDALGetMetadataItem( drv, GDAL_DMD_EXTENSIONS,
nullptr ) ).split(
' ' );
972 Q_FOREACH (
const QString &driver, driverExtensions )
974 if ( driver.compare( ext, Qt::CaseInsensitive ) == 0 )
985 GDALDriverH drv = GDALGetDriverByName( format.toLocal8Bit().data() );
988 char **driverMetadata = GDALGetMetadata( drv,
nullptr );
989 if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_RASTER,
false ) )
991 return QString( GDALGetMetadataItem( drv, GDAL_DMD_EXTENSIONS,
nullptr ) ).split(
' ' );
994 return QStringList();
999 GDALDriverH drv = GDALGetDriverByName( driverName.toLocal8Bit().data() );
1002 QString drvName = GDALGetDriverLongName( drv );
1003 QString extensionsString = QString( GDALGetMetadataItem( drv, GDAL_DMD_EXTENSIONS,
nullptr ) );
1004 if ( extensionsString.isEmpty() )
1008 QStringList extensions = extensionsString.split(
' ' );
1009 QString filter = drvName +
" (";
1010 for (
const QString &ext : extensions )
1012 filter.append( QStringLiteral(
"*.%1 *.%2 " ).arg( ext.toLower(), ext.toUpper() ) );
1014 filter = filter.trimmed().append( QStringLiteral(
")" ) );
1023 QList< FilterFormatDetails > results;
1026 int const drvCount = GDALGetDriverCount();
1030 for (
int i = 0; i < drvCount; ++i )
1032 GDALDriverH drv = GDALGetDriver( i );
1037 QString drvName = GDALGetDriverShortName( drv );
1039 if ( filterString.isEmpty() )
1048 if ( drvName == QLatin1String(
"GTiff" ) )
1050 tifFormat = details;
1069 results.insert( 0, tifFormat );
1079 QStringList extensions;
1081 QRegularExpression rx( QStringLiteral(
"\\*\\.([a-zA-Z0-9]*)" ) );
1085 QString ext = format.filterString;
1086 QRegularExpressionMatch match = rx.match( ext );
1087 if ( !match.hasMatch() )
1090 QString matched = match.captured( 1 );
1091 extensions << matched;
virtual int bandCount() const =0
Gets number of bands.
QgsRasterDataProvider * createOneBandRaster(Qgis::DataType dataType, int width, int height, const QgsRectangle &extent, const QgsCoordinateReferenceSystem &crs)
Create a raster file with one band without initializing the pixel data.
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
A rectangle specified with double values.
QgsRasterFileWriter(const QString &outputUrl)
Base class for processing modules.
void * qgsMalloc(size_t size)
Allocates size bytes and returns a pointer to the allocated memory.
Iterator for sequentially processing raster cells.
Writing was manually canceled.
static Qgis::DataType typeWithNoDataValue(Qgis::DataType dataType, double *noDataValue)
For given data type returns wider type and sets no data value.
static bool typeIsColor(Qgis::DataType type)
Returns true if data type is color.
static QString filterForDriver(const QString &driverName)
Creates a filter for an GDAL driver key.
void setProgress(double progress)
Sets the current progress for the feedback object.
QgsRasterProjector * projector() const
Raster pipe that deals with null values.
Thirty two bit unsigned integer (quint32)
#define Q_NOWARN_DEPRECATED_PUSH
DataType
Raster data types.
QgsRasterInterface * last() const
double maximumValue
The maximum cell value in the raster band.
static QStringList extensionsForFormat(const QString &format)
Returns a list of known file extensions for the given GDAL driver format.
Qgis::DataType sourceDataType(int bandNo) const override=0
Returns source data type for the band specified by number, source data type may be shorter than dataT...
virtual bool setNoDataValue(int bandNo, double noDataValue)
Set no data value on created dataset.
virtual Qgis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
Thirty two bit floating point (float)
const QgsCoordinateReferenceSystem & crs
virtual QString buildPyramids(const QList< QgsRasterPyramid > &pyramidList, const QString &resamplingMethod="NEAREST", QgsRaster::RasterPyramidsFormat format=QgsRaster::PyramidsGTiff, const QStringList &configOptions=QStringList(), QgsRasterBlockFeedback *feedback=nullptr)
Create pyramid overviews.
static bool supportsRasterCreate(GDALDriverH driver)
Reads whether a driver supports GDALCreate() for raster purposes.
Sixteen bit signed integer (qint16)
virtual double sourceNoDataValue(int bandNo) const
Value representing no data value.
Sixty four bit floating point (double)
QgsDataProvider * createProvider(const QString &providerKey, const QString &dataSource, const QgsDataProvider::ProviderOptions &options=QgsDataProvider::ProviderOptions())
Creates a new instance of a provider.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
static QString driverForExtension(const QString &extension)
Returns the GDAL driver name for a specified file extension.
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
QgsRasterDataProvider * createMultiBandRaster(Qgis::DataType dataType, int width, int height, const QgsRectangle &extent, const QgsCoordinateReferenceSystem &crs, int nBands)
Create a raster file with given number of bands without initializing the pixel data.
The RasterBandStats struct is a container for statistics about a single raster band.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
static QStringList supportedFormatExtensions(RasterFormatOptions options=SortRecommended)
Returns a list of file extensions for supported formats.
QgsCoordinateReferenceSystem sourceCrs() const
Returns the source CRS.
#define QgsDebugMsgLevel(str, level)
virtual QList< QgsRasterPyramid > buildPyramidList(QList< int > overviewList=QList< int >())
Returns the raster layers pyramid list.
QgsRectangle extent() const override=0
Returns the extent of the layer.
virtual bool isValid() const =0
Returns true if this is a valid layer.
double width() const
Returns the width of the rectangle.
static int typeSize(int dataType)
Sixteen bit unsigned integer (quint16)
WriterError writeRaster(const QgsRasterPipe *pipe, int nCols, int nRows, const QgsRectangle &outputExtent, const QgsCoordinateReferenceSystem &crs, QgsRasterBlockFeedback *feedback=nullptr)
Write raster file.
QgsRasterRangeList noData(int bandNo) const
bool readNextRasterPart(int bandNumber, int &nCols, int &nRows, QgsRasterBlock **block, int &topLeftCol, int &topLeftRow)
Fetches next part of raster data, caller takes ownership of the block and caller should delete the bl...
Base class for processing filters like renderers, reprojector, resampler etc.
static QList< QgsRasterFileWriter::FilterFormatDetails > supportedFiltersAndFormats(RasterFormatOptions options=SortRecommended)
Returns a list or pairs, with format filter string as first element and GDAL format key as second ele...
virtual bool sourceHasNoDataValue(int bandNo) const
Returns true if source band has no data value.
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
void setOutputNoDataValue(int bandNo, double noData)
Sets the output no data value.
QgsRasterProjector implements approximate projection support for it calculates grid of points in sour...
virtual QgsRasterBandStats bandStatistics(int bandNo, int stats=QgsRasterBandStats::All, const QgsRectangle &extent=QgsRectangle(), int sampleSize=0, QgsRasterBlockFeedback *feedback=nullptr)
Returns the band statistics.
#define Q_NOWARN_DEPRECATED_POP
void setMaximumTileWidth(int w)
Sets the maximum tile width returned during iteration.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination CRS.
Setting options for creating vector data providers.
void setMaximumTileHeight(int h)
Sets the minimum tile height returned during iteration.
Internal error if a value used for 'no data' was found in input.
const QgsRasterInterface * input() const
Returns the input raster interface which is being iterated over.
int maximumTileHeight() const
Returns the minimum tile width returned during iteration.
bool isCanceled() const
Tells whether the operation has been canceled already.
static double maximumValuePossible(Qgis::DataType)
Helper function that returns the maximum possible value for a GDAL data type.
virtual bool remove()
Remove dataset.
This class represents a coordinate reference system (CRS).
QString toWkt() const
Returns a WKT representation of this CRS.
Use recommended sort order, with extremely commonly used formats listed first.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
double minimumValue
The minimum cell value in the raster band.
QgsRasterNuller * nuller() const
double yMaximum() const
Returns the y maximum value (top side of rectangle).
virtual bool write(void *data, int band, int width, int height, int xOffset, int yOffset)
Writes into the provider datasource.
Feedback object tailored for raster block reading.
void qgsFree(void *ptr)
Frees the memory space pointed to by ptr.
QString outputUrl() const
Returns the output URL for the raster.
void startRasterRead(int bandNumber, int nCols, int nRows, const QgsRectangle &extent, QgsRasterBlockFeedback *feedback=nullptr)
Start reading of raster band.
Eight bit unsigned integer (quint8)
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32.
virtual const QgsRasterInterface * sourceInput() const
Gets source / raw input, the first in pipe, usually provider.
int maximumTileWidth() const
Returns the maximum tile width returned during iteration.
double height() const
Returns the height of the rectangle.
Base class for raster data providers.
static QgsRasterDataProvider * create(const QString &providerKey, const QString &uri, const QString &format, int nBands, Qgis::DataType type, int width, int height, double *geoTransform, const QgsCoordinateReferenceSystem &crs, const QStringList &createOptions=QStringList())
Creates a new dataset with mDataSourceURI.