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 )
108 QgsDebugMsgLevel( QStringLiteral(
"reading from %1" ).arg(
typeid( *iface ).name() ), 4 );
112 QgsDebugMsg( QStringLiteral(
"iface->srcInput() == 0" ) );
117 QgsDebugMsgLevel( QStringLiteral(
"srcInput = %1" ).arg(
typeid( srcInput ).name() ), 4 );
120 mFeedback = feedback;
127 QFileInfo fileInfo( mOutputUrl );
128 if ( !fileInfo.exists() )
130 QDir dir = fileInfo.dir();
131 if ( !dir.mkdir( fileInfo.fileName() ) )
133 QgsDebugMsg(
"Cannot create output VRT directory " + fileInfo.fileName() +
" in " + dir.absolutePath() );
140 QFile pyramidFile( mOutputUrl + ( mTiledMode ?
".vrt.ovr" :
".ovr" ) );
141 if ( pyramidFile.exists() )
142 pyramidFile.remove();
143 pyramidFile.setFileName( mOutputUrl + ( mTiledMode ?
".vrt.rrd" :
".rrd" ) );
144 if ( pyramidFile.exists() )
145 pyramidFile.remove();
147 if ( mMode ==
Image )
149 WriterError e = writeImageRaster( &iter, nCols, nRows, outputExtent, crs, feedback );
154 WriterError e = writeDataRaster( pipe, &iter, nCols, nRows, outputExtent, crs, transformContext, feedback );
177 QgsDebugMsg( QStringLiteral(
"Cannot get source data provider" ) );
194 for (
int i = 2; i <= nBands; ++i )
206 QList<bool> destHasNoDataValueList;
207 QList<double> destNoDataValueList;
208 QList<Qgis::DataType> destDataTypeList;
209 destDataTypeList.reserve( nBands );
210 destHasNoDataValueList.reserve( nBands );
211 destNoDataValueList.reserve( nBands );
213 for (
int bandNo = 1; bandNo <= nBands; bandNo++ )
218 bool destHasNoDataValue =
false;
219 double destNoDataValue = std::numeric_limits<double>::quiet_NaN();
223 if ( srcHasNoDataValue )
228 destHasNoDataValue =
true;
230 else if ( nuller && !nuller->
noData( bandNo ).isEmpty() )
233 destNoDataValue = nuller->
noData( bandNo ).value( 0 ).min();
234 destHasNoDataValue =
true;
244 srcExtent = ct.transformBoundingBox( outputExtent );
257 destNoDataValue = typeMinValue;
261 destNoDataValue = typeMaxValue;
268 destHasNoDataValue =
true;
272 if ( nuller && destHasNoDataValue )
277 QgsDebugMsgLevel( QStringLiteral(
"bandNo = %1 destDataType = %2 destHasNoDataValue = %3 destNoDataValue = %4" ).arg( bandNo ).arg( destDataType ).arg( destHasNoDataValue ).arg( destNoDataValue ), 4 );
278 destDataTypeList.append( destDataType );
279 destHasNoDataValueList.append( destHasNoDataValue );
280 destNoDataValueList.append( destNoDataValue );
285 for (
int i = 1; i < nBands; i++ )
287 if ( destDataTypeList.value( i ) > destDataType )
289 destDataType = destDataTypeList.value( i );
297 double geoTransform[6];
298 globalOutputParameters( outputExtent, nCols, nRows, geoTransform, pixelSize );
301 destProvider = initOutput( nCols, nRows, crs, geoTransform, nBands, destDataType, destHasNoDataValueList, destNoDataValueList );
303 WriterError error = writeDataRaster( pipe, iter, nCols, nRows, outputExtent, crs, destDataType, destHasNoDataValueList, destNoDataValueList, destProvider, feedback );
312 destProvider =
nullptr;
320 for (
int i = 0; i < nBands; i++ )
322 double destNoDataValue;
324 destDataTypeList.replace( i, destDataType );
325 destNoDataValueList.replace( i, destNoDataValue );
327 destDataType = destDataTypeList.value( 0 );
330 destProvider = initOutput( nCols, nRows, crs, geoTransform, nBands, destDataType, destHasNoDataValueList, destNoDataValueList );
331 error = writeDataRaster( pipe, iter, nCols, nRows, outputExtent, crs, destDataType, destHasNoDataValueList, destNoDataValueList, destProvider, feedback );
340 int nCols,
int nRows,
344 const QList<bool> &destHasNoDataValueList,
345 const QList<double> &destNoDataValueList,
350 Q_UNUSED( destHasNoDataValueList )
364 QList<QgsRasterBlock *> blockList;
365 blockList.reserve( nBands );
366 for (
int i = 1; i <= nBands; ++i )
369 blockList.push_back(
nullptr );
370 if ( destProvider && destHasNoDataValueList.value( i - 1 ) )
372 destProvider->
setNoDataValue( i, destNoDataValueList.value( i - 1 ) );
382 nParts = nPartsX * nPartsY;
389 for (
int i = 1; i <= nBands; ++i )
391 if ( !iter->
readNextRasterPart( i, iterCols, iterRows, &( blockList[i - 1] ), iterLeft, iterTop ) )
396 QString vrtFilePath( mOutputUrl +
'/' + vrtFileName() );
397 writeVRT( vrtFilePath );
400 buildPyramids( vrtFilePath );
407 buildPyramids( mOutputUrl, destProvider );
417 if ( feedback && fileIndex < ( nParts - 1 ) )
419 feedback->
setProgress( 100.0 * fileIndex / static_cast< double >( nParts ) );
422 for (
int i = 0; i < nBands; ++i )
431 QList<QgsRasterBlock *> destBlockList;
432 for (
int i = 1; i <= nBands; ++i )
434 if ( srcProvider && srcProvider->
dataType( i ) == destDataType )
436 destBlockList.push_back( blockList[i - 1] );
441 blockList[i - 1]->convert( destDataType );
442 destBlockList.push_back( blockList[i - 1] );
444 blockList[i - 1] =
nullptr;
450 nCols, iterCols, iterRows,
451 iterLeft, iterTop, mOutputUrl,
452 fileIndex, nBands, destDataType, crs );
454 if ( partDestProvider )
457 for (
int i = 1; i <= nBands; ++i )
459 if ( destHasNoDataValueList.value( i - 1 ) )
461 partDestProvider->
setNoDataValue( i, destNoDataValueList.value( i - 1 ) );
463 partDestProvider->
write( destBlockList[i - 1]->bits( 0 ), i, iterCols, iterRows, 0, 0 );
464 delete destBlockList[i - 1];
465 addToVRT( partFileName( fileIndex ), i, iterCols, iterRows, iterLeft, iterTop );
467 delete partDestProvider;
470 else if ( destProvider )
473 for (
int i = 1; i <= nBands; ++i )
475 destProvider->
write( destBlockList[i - 1]->bits( 0 ), i, iterCols, iterRows, iterLeft, iterTop );
476 delete destBlockList[i - 1];
508 void *redData =
qgsMalloc( static_cast<size_t>( mMaxTileWidth * mMaxTileHeight ) );
509 void *greenData =
qgsMalloc( static_cast<size_t>( mMaxTileWidth * mMaxTileHeight ) );
510 void *blueData =
qgsMalloc( static_cast<size_t>( mMaxTileWidth * mMaxTileHeight ) );
511 void *alphaData =
qgsMalloc( static_cast<size_t>( mMaxTileWidth * mMaxTileHeight ) );
512 int iterLeft = 0, iterTop = 0, iterCols = 0, iterRows = 0;
517 double geoTransform[6];
518 globalOutputParameters( outputExtent, nCols, nRows, geoTransform, pixelSize );
520 std::unique_ptr< QgsRasterDataProvider > destProvider( initOutput( nCols, nRows, crs, geoTransform, 4,
Qgis::Byte ) );
529 nParts = nPartsX * nPartsY;
532 std::unique_ptr< QgsRasterBlock > inputBlock;
533 while ( iter->
readNextRasterPart( 1, iterCols, iterRows, inputBlock, iterLeft, iterTop ) )
540 if ( feedback && fileIndex < ( nParts - 1 ) )
542 feedback->
setProgress( 100.0 * fileIndex / static_cast< double >( nParts ) );
556 for (
qgssize i = 0; i < nPixels; ++i )
558 QRgb
c = inputBlock->color( i );
566 double a = alpha / 255.;
567 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 );
572 memcpy( reinterpret_cast< char * >( redData ) + i, &red, 1 );
573 memcpy( reinterpret_cast< char * >( greenData ) + i, &green, 1 );
574 memcpy( reinterpret_cast< char * >( blueData ) + i, &blue, 1 );
575 memcpy( reinterpret_cast< char * >( alphaData ) + i, &alpha, 1 );
582 std::unique_ptr< QgsRasterDataProvider > partDestProvider( createPartProvider( outputExtent,
583 nCols, iterCols, iterRows,
584 iterLeft, iterTop, mOutputUrl, fileIndex,
587 if ( partDestProvider )
590 partDestProvider->write( redData, 1, iterCols, iterRows, 0, 0 );
591 partDestProvider->write( greenData, 2, iterCols, iterRows, 0, 0 );
592 partDestProvider->write( blueData, 3, iterCols, iterRows, 0, 0 );
593 partDestProvider->write( alphaData, 4, iterCols, iterRows, 0, 0 );
595 addToVRT( partFileName( fileIndex ), 1, iterCols, iterRows, iterLeft, iterTop );
596 addToVRT( partFileName( fileIndex ), 2, iterCols, iterRows, iterLeft, iterTop );
597 addToVRT( partFileName( fileIndex ), 3, iterCols, iterRows, iterLeft, iterTop );
598 addToVRT( partFileName( fileIndex ), 4, iterCols, iterRows, iterLeft, iterTop );
601 else if ( destProvider )
603 destProvider->write( redData, 1, iterCols, iterRows, iterLeft, iterTop );
604 destProvider->write( greenData, 2, iterCols, iterRows, iterLeft, iterTop );
605 destProvider->write( blueData, 3, iterCols, iterRows, iterLeft, iterTop );
606 destProvider->write( alphaData, 4, iterCols, iterRows, iterLeft, iterTop );
611 destProvider.reset();
625 QString vrtFilePath( mOutputUrl +
'/' + vrtFileName() );
626 writeVRT( vrtFilePath );
629 buildPyramids( vrtFilePath );
636 buildPyramids( mOutputUrl );
642 void QgsRasterFileWriter::addToVRT(
const QString &filename,
int band,
int xSize,
int ySize,
int xOffset,
int yOffset )
644 QDomElement bandElem = mVRTBands.value( band - 1 );
646 QDomElement simpleSourceElem = mVRTDocument.createElement( QStringLiteral(
"SimpleSource" ) );
649 QDomElement sourceFilenameElem = mVRTDocument.createElement( QStringLiteral(
"SourceFilename" ) );
650 sourceFilenameElem.setAttribute( QStringLiteral(
"relativeToVRT" ), QStringLiteral(
"1" ) );
651 QDomText sourceFilenameText = mVRTDocument.createTextNode( filename );
652 sourceFilenameElem.appendChild( sourceFilenameText );
653 simpleSourceElem.appendChild( sourceFilenameElem );
656 QDomElement sourceBandElem = mVRTDocument.createElement( QStringLiteral(
"SourceBand" ) );
657 QDomText sourceBandText = mVRTDocument.createTextNode( QString::number( band ) );
658 sourceBandElem.appendChild( sourceBandText );
659 simpleSourceElem.appendChild( sourceBandElem );
662 QDomElement sourcePropertiesElem = mVRTDocument.createElement( QStringLiteral(
"SourceProperties" ) );
663 sourcePropertiesElem.setAttribute( QStringLiteral(
"RasterXSize" ), xSize );
664 sourcePropertiesElem.setAttribute( QStringLiteral(
"RasterYSize" ), ySize );
665 sourcePropertiesElem.setAttribute( QStringLiteral(
"BlockXSize" ), xSize );
666 sourcePropertiesElem.setAttribute( QStringLiteral(
"BlockYSize" ), ySize );
667 sourcePropertiesElem.setAttribute( QStringLiteral(
"DataType" ), QStringLiteral(
"Byte" ) );
668 simpleSourceElem.appendChild( sourcePropertiesElem );
671 QDomElement srcRectElem = mVRTDocument.createElement( QStringLiteral(
"SrcRect" ) );
672 srcRectElem.setAttribute( QStringLiteral(
"xOff" ), QStringLiteral(
"0" ) );
673 srcRectElem.setAttribute( QStringLiteral(
"yOff" ), QStringLiteral(
"0" ) );
674 srcRectElem.setAttribute( QStringLiteral(
"xSize" ), xSize );
675 srcRectElem.setAttribute( QStringLiteral(
"ySize" ), ySize );
676 simpleSourceElem.appendChild( srcRectElem );
679 QDomElement dstRectElem = mVRTDocument.createElement( QStringLiteral(
"DstRect" ) );
680 dstRectElem.setAttribute( QStringLiteral(
"xOff" ), xOffset );
681 dstRectElem.setAttribute( QStringLiteral(
"yOff" ), yOffset );
682 dstRectElem.setAttribute( QStringLiteral(
"xSize" ), xSize );
683 dstRectElem.setAttribute( QStringLiteral(
"ySize" ), ySize );
684 simpleSourceElem.appendChild( dstRectElem );
686 bandElem.appendChild( simpleSourceElem );
689 void QgsRasterFileWriter::buildPyramids(
const QString &filename,
QgsRasterDataProvider *destProviderIn )
698 if ( !destProvider || !destProvider->
isValid() )
708 QList< QgsRasterPyramid> myPyramidList;
709 if ( ! mPyramidsList.isEmpty() )
711 for (
int myCounterInt = 0; myCounterInt < myPyramidList.count(); myCounterInt++ )
713 myPyramidList[myCounterInt].build =
true;
716 QgsDebugMsgLevel( QStringLiteral(
"building pyramids : %1 pyramids, %2 resampling, %3 format, %4 options" ).arg( myPyramidList.count() ).arg( mPyramidsResampling ).arg( mPyramidsFormat ).arg( mPyramidsConfigOptions.count() ), 4 );
718 QString res = destProvider->
buildPyramids( myPyramidList, mPyramidsResampling,
719 mPyramidsFormat, mPyramidsConfigOptions );
725 QString title, message;
726 if ( res == QLatin1String(
"ERROR_WRITE_ACCESS" ) )
728 title = QObject::tr(
"Building Pyramids" );
729 message = QObject::tr(
"Write access denied. Adjust the file permissions and try again." );
731 else if ( res == QLatin1String(
"ERROR_WRITE_FORMAT" ) )
733 title = QObject::tr(
"Building Pyramids" );
734 message = QObject::tr(
"The file was not writable. Some formats do not " 735 "support pyramid overviews. Consult the GDAL documentation if in doubt." );
737 else if ( res == QLatin1String(
"FAILED_NOT_SUPPORTED" ) )
739 title = QObject::tr(
"Building Pyramids" );
740 message = QObject::tr(
"Building pyramid overviews is not supported on this type of raster." );
742 else if ( res == QLatin1String(
"ERROR_VIRTUAL" ) )
744 title = QObject::tr(
"Building Pyramids" );
745 message = QObject::tr(
"Building pyramid overviews is not supported on this type of raster." );
747 QMessageBox::warning(
nullptr, title, message );
750 if ( !destProviderIn )
755 int QgsRasterFileWriter::pyramidsProgress(
double dfComplete,
const char *pszMessage,
void *pData )
757 Q_UNUSED( pszMessage )
758 GDALTermProgress( dfComplete, 0, 0 );
759 QProgressDialog *progressDialog =
static_cast<QProgressDialog *
>( pData );
760 if ( pData && progressDialog->wasCanceled() )
767 progressDialog->setRange( 0, 100 );
768 progressDialog->setValue( dfComplete * 100 );
774 void QgsRasterFileWriter::createVRT(
int xSize,
int ySize,
const QgsCoordinateReferenceSystem &crs,
double *geoTransform,
Qgis::DataType type,
const QList<bool> &destHasNoDataValueList,
const QList<double> &destNoDataValueList )
776 mVRTDocument.clear();
777 QDomElement VRTDatasetElem = mVRTDocument.createElement( QStringLiteral(
"VRTDataset" ) );
780 VRTDatasetElem.setAttribute( QStringLiteral(
"rasterXSize" ), xSize );
781 VRTDatasetElem.setAttribute( QStringLiteral(
"rasterYSize" ), ySize );
782 mVRTDocument.appendChild( VRTDatasetElem );
785 QDomElement SRSElem = mVRTDocument.createElement( QStringLiteral(
"SRS" ) );
786 QDomText crsText = mVRTDocument.createTextNode( crs.
toWkt() );
787 SRSElem.appendChild( crsText );
788 VRTDatasetElem.appendChild( SRSElem );
793 QDomElement geoTransformElem = mVRTDocument.createElement( QStringLiteral(
"GeoTransform" ) );
794 QString geoTransformString = QString::number( geoTransform[0],
'f', 6 ) +
", " + QString::number( geoTransform[1] ) +
", " + QString::number( geoTransform[2] ) +
795 ", " + QString::number( geoTransform[3],
'f', 6 ) +
", " + QString::number( geoTransform[4] ) +
", " + QString::number( geoTransform[5] );
796 QDomText geoTransformText = mVRTDocument.createTextNode( geoTransformString );
797 geoTransformElem.appendChild( geoTransformText );
798 VRTDatasetElem.appendChild( geoTransformElem );
811 QStringList colorInterp;
812 colorInterp << QStringLiteral(
"Red" ) << QStringLiteral(
"Green" ) << QStringLiteral(
"Blue" ) << QStringLiteral(
"Alpha" );
814 QMap<Qgis::DataType, QString> dataTypes;
815 dataTypes.insert(
Qgis::Byte, QStringLiteral(
"Byte" ) );
816 dataTypes.insert(
Qgis::UInt16, QStringLiteral(
"UInt16" ) );
817 dataTypes.insert(
Qgis::Int16, QStringLiteral(
"Int16" ) );
818 dataTypes.insert(
Qgis::UInt32, QStringLiteral(
"Int32" ) );
819 dataTypes.insert(
Qgis::Float32, QStringLiteral(
"Float32" ) );
820 dataTypes.insert(
Qgis::Float64, QStringLiteral(
"Float64" ) );
821 dataTypes.insert(
Qgis::CInt16, QStringLiteral(
"CInt16" ) );
822 dataTypes.insert(
Qgis::CInt32, QStringLiteral(
"CInt32" ) );
826 for (
int i = 1; i <= nBands; i++ )
828 QDomElement VRTBand = mVRTDocument.createElement( QStringLiteral(
"VRTRasterBand" ) );
830 VRTBand.setAttribute( QStringLiteral(
"band" ), QString::number( i ) );
831 QString dataType = dataTypes.value( type );
832 VRTBand.setAttribute( QStringLiteral(
"dataType" ), dataType );
834 if ( mMode ==
Image )
836 VRTBand.setAttribute( QStringLiteral(
"dataType" ), QStringLiteral(
"Byte" ) );
837 QDomElement colorInterpElement = mVRTDocument.createElement( QStringLiteral(
"ColorInterp" ) );
838 QDomText interpText = mVRTDocument.createTextNode( colorInterp.value( i - 1 ) );
839 colorInterpElement.appendChild( interpText );
840 VRTBand.appendChild( colorInterpElement );
843 if ( !destHasNoDataValueList.isEmpty() && destHasNoDataValueList.value( i - 1 ) )
845 VRTBand.setAttribute( QStringLiteral(
"NoDataValue" ), QString::number( destNoDataValueList.value( i - 1 ) ) );
848 mVRTBands.append( VRTBand );
849 VRTDatasetElem.appendChild( VRTBand );
853 bool QgsRasterFileWriter::writeVRT(
const QString &file )
855 QFile outputFile( file );
856 if ( ! outputFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
861 QTextStream outStream( &outputFile );
862 mVRTDocument.save( outStream, 2 );
867 int iterRows,
int iterLeft,
int iterTop,
const QString &
outputUrl,
int fileIndex,
int nBands,
Qgis::DataType type,
870 double mup = extent.
width() / nCols;
871 double mapLeft = extent.
xMinimum() + iterLeft * mup;
872 double mapRight = mapLeft + mup * iterCols;
873 double mapTop = extent.
yMaximum() - iterTop * mup;
874 double mapBottom = mapTop - iterRows * mup;
875 QgsRectangle mapRect( mapLeft, mapBottom, mapRight, mapTop );
877 QString outputFile =
outputUrl +
'/' + partFileName( fileIndex );
880 double geoTransform[6];
881 geoTransform[0] = mapRect.
xMinimum();
882 geoTransform[1] = mup;
883 geoTransform[2] = 0.0;
884 geoTransform[3] = mapRect.
yMaximum();
885 geoTransform[4] = 0.0;
886 geoTransform[5] = -mup;
898 const QList<bool> &destHasNoDataValueList,
const QList<double> &destNoDataValueList )
902 createVRT( nCols, nRows, crs, geoTransform, type, destHasNoDataValueList, destNoDataValueList );
910 if ( mBuildPyramidsFlag == -4 && mOutputProviderKey ==
"gdal" && mOutputFormat.compare( QLatin1String(
"gtiff" ), Qt::CaseInsensitive ) == 0 )
911 mCreateOptions <<
"COPY_SRC_OVERVIEWS=YES";
918 QgsDebugMsg( QStringLiteral(
"No provider created" ) );
925 void QgsRasterFileWriter::globalOutputParameters(
const QgsRectangle &extent,
int nCols,
int &nRows,
926 double *geoTransform,
double &pixelSize )
928 pixelSize = extent.
width() / nCols;
933 nRows =
static_cast< double >( nCols ) / extent.
width() * extent.
height() + 0.5;
935 geoTransform[0] = extent.
xMinimum();
936 geoTransform[1] = pixelSize;
937 geoTransform[2] = 0.0;
938 geoTransform[3] = extent.
yMaximum();
939 geoTransform[4] = 0.0;
940 geoTransform[5] = -( extent.
height() / nRows );
943 QString QgsRasterFileWriter::partFileName(
int fileIndex )
946 QFileInfo outputInfo( mOutputUrl );
947 return QStringLiteral(
"%1.%2.tif" ).arg( outputInfo.fileName() ).arg( fileIndex );
950 QString QgsRasterFileWriter::vrtFileName()
952 QFileInfo outputInfo( mOutputUrl );
953 return QStringLiteral(
"%1.vrt" ).arg( outputInfo.fileName() );
958 QString ext = extension.trimmed();
962 if ( ext.startsWith(
'.' ) )
966 int const drvCount = GDALGetDriverCount();
968 for (
int i = 0; i < drvCount; ++i )
970 GDALDriverH drv = GDALGetDriver( i );
973 char **driverMetadata = GDALGetMetadata( drv,
nullptr );
974 if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_RASTER,
false ) )
976 QString drvName = GDALGetDriverShortName( drv );
977 QStringList driverExtensions = QString( GDALGetMetadataItem( drv, GDAL_DMD_EXTENSIONS,
nullptr ) ).split(
' ' );
979 const auto constDriverExtensions = driverExtensions;
980 for (
const QString &driver : constDriverExtensions )
982 if ( driver.compare( ext, Qt::CaseInsensitive ) == 0 )
993 GDALDriverH drv = GDALGetDriverByName( format.toLocal8Bit().data() );
996 char **driverMetadata = GDALGetMetadata( drv,
nullptr );
997 if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_RASTER,
false ) )
999 return QString( GDALGetMetadataItem( drv, GDAL_DMD_EXTENSIONS,
nullptr ) ).split(
' ' );
1002 return QStringList();
1007 GDALDriverH drv = GDALGetDriverByName( driverName.toLocal8Bit().data() );
1010 QString drvName = GDALGetDriverLongName( drv );
1011 QString extensionsString = QString( GDALGetMetadataItem( drv, GDAL_DMD_EXTENSIONS,
nullptr ) );
1012 if ( extensionsString.isEmpty() )
1016 QStringList extensions = extensionsString.split(
' ' );
1017 QString filter = drvName +
" (";
1018 for (
const QString &ext : extensions )
1020 filter.append( QStringLiteral(
"*.%1 *.%2 " ).arg( ext.toLower(), ext.toUpper() ) );
1022 filter = filter.trimmed().append( QStringLiteral(
")" ) );
1031 QList< FilterFormatDetails > results;
1034 int const drvCount = GDALGetDriverCount();
1038 for (
int i = 0; i < drvCount; ++i )
1040 GDALDriverH drv = GDALGetDriver( i );
1045 QString drvName = GDALGetDriverShortName( drv );
1047 if ( filterString.isEmpty() )
1056 if ( drvName == QLatin1String(
"GTiff" ) )
1058 tifFormat = details;
1077 results.insert( 0, tifFormat );
1087 QStringList extensions;
1089 QRegularExpression rx( QStringLiteral(
"\\*\\.([a-zA-Z0-9]*)" ) );
1093 QString ext = format.filterString;
1094 QRegularExpressionMatch match = rx.match( ext );
1095 if ( !match.hasMatch() )
1098 QString matched = match.captured( 1 );
1099 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)
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)
Q_DECL_DEPRECATED 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...
Contains information about the context in which a coordinate transform is executed.
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...
QgsCoordinateTransformContext transformContext() const
Returns data provider coordinate transform context.
virtual QgsRasterBandStats bandStatistics(int bandNo, int stats=QgsRasterBandStats::All, const QgsRectangle &extent=QgsRectangle(), int sampleSize=0, QgsRasterBlockFeedback *feedback=nullptr)
Returns the band statistics.
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.
QgsRasterDataProvider * provider() const
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.