Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsgeopackagerasterwriter.cpp - QgsGeoPackageRasterWriter 3 : : 4 : : --------------------- 5 : : begin : 23.8.2017 6 : : copyright : (C) 2017 by Alessandro Pasotti 7 : : email : apasotti at boundlessgeo dot com 8 : : *************************************************************************** 9 : : * * 10 : : * This program is free software; you can redistribute it and/or modify * 11 : : * it under the terms of the GNU General Public License as published by * 12 : : * the Free Software Foundation; either version 2 of the License, or * 13 : : * (at your option) any later version. * 14 : : * * 15 : : ***************************************************************************/ 16 : : 17 : : ///@cond PRIVATE 18 : : 19 : : #include "gdal.h" 20 : : #include "gdal_utils.h" 21 : : #include "qgsogrutils.h" 22 : : 23 : : #include "qgsgeopackagerasterwriter.h" 24 : : #include "qgscplerrorhandler.h" 25 : : 26 : : #include <QMessageBox> 27 : : 28 : 0 : QgsGeoPackageRasterWriter::QgsGeoPackageRasterWriter( const QgsMimeDataUtils::Uri &sourceUri, const QString &outputUrl ): 29 : 0 : mSourceUri( sourceUri ), 30 : 0 : mOutputUrl( outputUrl ) 31 : : { 32 : : 33 : 0 : } 34 : : 35 : 0 : QgsGeoPackageRasterWriter::WriterError QgsGeoPackageRasterWriter::writeRaster( QgsFeedback *feedback, QString *errorMessage ) 36 : : { 37 : 0 : const char *args[] = { "-of", "gpkg", "-co", QStringLiteral( "RASTER_TABLE=%1" ).arg( mSourceUri.name ).toUtf8().constData(), "-co", "APPEND_SUBDATASET=YES", nullptr }; 38 : : // This sends OGR/GDAL errors to the message log 39 : 0 : QgsCPLErrorHandler handler; 40 : 0 : GDALTranslateOptions *psOptions = GDALTranslateOptionsNew( ( char ** )args, nullptr ); 41 : : 42 : 0 : GDALTranslateOptionsSetProgress( psOptions, [ ]( double dfComplete, const char *pszMessage, void *pProgressData ) -> int 43 : : { 44 : : Q_UNUSED( pszMessage ) 45 : 0 : QgsFeedback *feedback = static_cast< QgsFeedback * >( pProgressData ); 46 : 0 : feedback->setProgress( dfComplete * 100 ); 47 : 0 : return ! feedback->isCanceled(); 48 : 0 : }, feedback ); 49 : : 50 : 0 : gdal::dataset_unique_ptr hSrcDS( GDALOpen( mSourceUri.uri.toUtf8().constData(), GA_ReadOnly ) ); 51 : 0 : if ( ! hSrcDS ) 52 : : { 53 : 0 : *errorMessage = QObject::tr( "Failed to open source layer %1! See the OGR panel in the message logs for details.\n\n" ).arg( mSourceUri.name ); 54 : 0 : mHasError = true; 55 : 0 : } 56 : : else 57 : : { 58 : 0 : CPLErrorReset(); 59 : 0 : gdal::dataset_unique_ptr hOutDS( GDALTranslate( mOutputUrl.toUtf8().constData(), hSrcDS.get(), psOptions, nullptr ) ); 60 : 0 : if ( ! hOutDS ) 61 : : { 62 : 0 : *errorMessage = QObject::tr( "Failed to import layer %1! See the OGR panel in the message logs for details.\n\n" ).arg( mSourceUri.name ); 63 : 0 : mHasError = true; 64 : 0 : } 65 : 0 : } 66 : 0 : GDALTranslateOptionsFree( psOptions ); 67 : 0 : return ( feedback && feedback->isCanceled() ) ? ErrUserCanceled : ( mHasError ? WriteError : NoError ); 68 : 0 : } 69 : : 70 : : ///@endcond