[QGIS Commit] r14559 - in branches/raster-providers/src: core
core/raster providers providers/gdal providers/grass
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Fri Nov 12 11:34:45 EST 2010
Author: rblazek
Date: 2010-11-12 08:34:45 -0800 (Fri, 12 Nov 2010)
New Revision: 14559
Added:
branches/raster-providers/src/providers/gdal/
branches/raster-providers/src/providers/gdal/CMakeLists.txt
branches/raster-providers/src/providers/gdal/qgsgdalprovider.cpp
branches/raster-providers/src/providers/gdal/qgsgdalprovider.h
Modified:
branches/raster-providers/src/core/qgsrasterdataprovider.cpp
branches/raster-providers/src/core/qgsrasterdataprovider.h
branches/raster-providers/src/core/raster/qgsrasterlayer.cpp
branches/raster-providers/src/core/raster/qgsrasterlayer.h
branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.cpp
branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.h
Log:
initial gdal driver implementation
Modified: branches/raster-providers/src/core/qgsrasterdataprovider.cpp
===================================================================
--- branches/raster-providers/src/core/qgsrasterdataprovider.cpp 2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/core/qgsrasterdataprovider.cpp 2010-11-12 16:34:45 UTC (rev 14559)
@@ -31,6 +31,58 @@
{
}
+//
+//Random Static convenience function
+//
+/////////////////////////////////////////////////////////
+//TODO: Change these to private function or make seprate class
+// convenience function for building metadata() HTML table cells
+// convenience function for creating a string list from a C style string list
+QStringList QgsRasterDataProvider::cStringList2Q_( char ** stringList )
+{
+ QStringList strings;
+
+ // presume null terminated string list
+ for ( size_t i = 0; stringList[i]; ++i )
+ {
+ strings.append( stringList[i] );
+ }
+
+ return strings;
+
+} // cStringList2Q_
+
+
+QString QgsRasterDataProvider::makeTableCell( QString const & value )
+{
+ return "<p>\n" + value + "</p>\n";
+} // makeTableCell_
+
+
+
+// convenience function for building metadata() HTML table cells
+QString QgsRasterDataProvider::makeTableCells( QStringList const & values )
+{
+ QString s( "<tr>" );
+
+ for ( QStringList::const_iterator i = values.begin();
+ i != values.end();
+ ++i )
+ {
+ s += QgsRasterDataProvider::makeTableCell( *i );
+ }
+
+ s += "</tr>";
+
+ return s;
+} // makeTableCell_
+
+QString QgsRasterDataProvider::metadata()
+{
+ QString s;
+ return s;
+}
+
QString QgsRasterDataProvider::capabilitiesString() const
{
QStringList abilitiesList;
Modified: branches/raster-providers/src/core/qgsrasterdataprovider.h
===================================================================
--- branches/raster-providers/src/core/qgsrasterdataprovider.h 2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/core/qgsrasterdataprovider.h 2010-11-12 16:34:45 UTC (rev 14559)
@@ -22,6 +22,7 @@
#define QGSRASTERDATAPROVIDER_H
#include "qgslogger.h"
+#include "qgsrectangle.h"
#include "qgsdataprovider.h"
#include "qgscolorrampshader.h"
@@ -306,13 +307,31 @@
@note: this method was added in version 1.2*/
void setDpi( int dpi ) {mDpi = dpi;}
+ /** \brief Is the NoDataValue Valid */
+ bool isNoDataValueValid() const { return mValidNoDataValue; }
+ static QStringList cStringList2Q_( char ** stringList );
+
+ static QString makeTableCell( QString const & value );
+ static QString makeTableCells( QStringList const & values );
+
+
protected:
/**Dots per intch. Extended WMS (e.g. QGIS mapserver) support DPI dependent output and therefore
are suited for printing. A value of -1 means it has not been set
@note: this member has been added in version 1.2*/
int mDpi;
+ /** \brief Cell value representing no data. e.g. -9999 */
+ double mNoDataValue;
+
+ /** \brief Flag indicating if the nodatavalue is valid*/
+ bool mValidNoDataValue;
+
+
+ QgsRectangle mExtent;
+
+
};
#endif
Modified: branches/raster-providers/src/core/raster/qgsrasterlayer.cpp
===================================================================
--- branches/raster-providers/src/core/raster/qgsrasterlayer.cpp 2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/core/raster/qgsrasterlayer.cpp 2010-11-12 16:34:45 UTC (rev 14559)
@@ -89,7 +89,13 @@
, mHeight( std::numeric_limits<int>::max() )
, mInvertColor( false )
{
+ QgsDebugMsg("Entered");
+ // TODO, call constructor with provider key for now
+ setDataProvider( "gdal", QStringList(), QStringList(), QString(), QString() );
+ return;
+
+ // TODO: add this somewhere - in another constructor
mRasterType = QgsRasterLayer::GrayOrUndefined;
mRedBandName = TRSTRING_NOT_SET;
@@ -192,22 +198,9 @@
layers.join( ", " ) + " and style list of " + styles.join( ", " ) + " and format of " +
format + " and CRS of " + crs );
- mBandCount = 0;
- mRasterShader = new QgsRasterShader();
- // Initialise the affine transform matrix
- mGeoTransform[0] = 0;
- mGeoTransform[1] = 1;
- mGeoTransform[2] = 0;
- mGeoTransform[3] = 0;
- mGeoTransform[4] = 0;
- mGeoTransform[5] = -1;
-
// if we're given a provider type, try to create and bind one to this layer
- if ( ! providerKey.isEmpty() )
- {
- setDataProvider( providerKey, layers, styles, format, crs );
- }
+ setDataProvider( providerKey, layers, styles, format, crs );
// Default for the popup menu
// TODO: popMenu = 0;
@@ -275,7 +268,7 @@
void QgsRasterLayer::buildSupportedRasterFileFilter( QString & theFileFiltersString )
{
// first get the GDAL driver manager
- registerGdalDrivers();
+ //registerGdalDrivers();
// then iterate through all of the supported drivers, adding the
// corresponding file filter
@@ -447,8 +440,11 @@
bool QgsRasterLayer::isValidRasterFileName( QString const & theFileNameQString, QString & retErrMsg )
{
GDALDatasetH myDataset;
- registerGdalDrivers();
+ //registerGdalDrivers();
+ // TODO
+ return true;
+
CPLErrorReset();
//open the file using gdal making sure we have handled locale properly
@@ -503,64 +499,6 @@
-void QgsRasterLayer::registerGdalDrivers()
-{
- if ( GDALGetDriverCount() == 0 )
- GDALAllRegister();
-}
-
-
-
-
-//////////////////////////////////////////////////////////
-//
-//Random Static convenience function
-//
-/////////////////////////////////////////////////////////
-//TODO: Change these to private function or make seprate class
-// convenience function for building metadata() HTML table cells
-static QString makeTableCell_( QString const & value )
-{
- return "<p>\n" + value + "</p>\n";
-} // makeTableCell_
-
-
-
-// convenience function for building metadata() HTML table cells
-static QString makeTableCells_( QStringList const & values )
-{
- QString s( "<tr>" );
-
- for ( QStringList::const_iterator i = values.begin();
- i != values.end();
- ++i )
- {
- s += makeTableCell_( *i );
- }
-
- s += "</tr>";
-
- return s;
-} // makeTableCell_
-
-
-
-// convenience function for creating a string list from a C style string list
-static QStringList cStringList2Q_( char ** stringList )
-{
- QStringList strings;
-
- // presume null terminated string list
- for ( size_t i = 0; stringList[i]; ++i )
- {
- strings.append( stringList[i] );
- }
-
- return strings;
-
-} // cStringList2Q_
-
-
// typedef for the QgsDataProvider class factory
typedef QgsDataProvider * classFactoryFunction_t( const QString * );
@@ -2609,173 +2547,80 @@
QString myMetadata ;
myMetadata += "<p class=\"glossy\">" + tr( "Driver:" ) + "</p>\n";
myMetadata += "<p>";
- if ( mProviderKey.isEmpty() )
+ myMetadata += mDataProvider->description();
+ myMetadata += "</p>\n";
+
+ // Insert provider-specific (e.g. WMS-specific) metadata
+ // crashing
+ //QString s = mDataProvider->metadata();
+ //QgsDebugMsg( s );
+ myMetadata += mDataProvider->metadata();
+
+ myMetadata += "<p class=\"glossy\">";
+ myMetadata += tr( "No Data Value" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>";
+ if ( mValidNoDataValue )
{
- myMetadata += QString( GDALGetDescription( GDALGetDatasetDriver( mGdalDataset ) ) );
- myMetadata += "<br>";
- myMetadata += QString( GDALGetMetadataItem( GDALGetDatasetDriver( mGdalDataset ), GDAL_DMD_LONGNAME, NULL ) );
+ myMetadata += QString::number( mNoDataValue );
}
else
{
- myMetadata += mDataProvider->description();
+ myMetadata += "*" + tr( "NoDataValue not set" ) + "*";
}
myMetadata += "</p>\n";
- if ( !mProviderKey.isEmpty() )
+ myMetadata += "</p>\n";
+ myMetadata += "<p class=\"glossy\">";
+ myMetadata += tr( "Data Type:" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>";
+ //just use the first band
+ switch ( mDataProvider->dataType( 1 ) )
{
- // Insert provider-specific (e.g. WMS-specific) metadata
- myMetadata += mDataProvider->metadata();
+ case GDT_Byte:
+ myMetadata += tr( "GDT_Byte - Eight bit unsigned integer" );
+ break;
+ case GDT_UInt16:
+ myMetadata += tr( "GDT_UInt16 - Sixteen bit unsigned integer " );
+ break;
+ case GDT_Int16:
+ myMetadata += tr( "GDT_Int16 - Sixteen bit signed integer " );
+ break;
+ case GDT_UInt32:
+ myMetadata += tr( "GDT_UInt32 - Thirty two bit unsigned integer " );
+ break;
+ case GDT_Int32:
+ myMetadata += tr( "GDT_Int32 - Thirty two bit signed integer " );
+ break;
+ case GDT_Float32:
+ myMetadata += tr( "GDT_Float32 - Thirty two bit floating point " );
+ break;
+ case GDT_Float64:
+ myMetadata += tr( "GDT_Float64 - Sixty four bit floating point " );
+ break;
+ case GDT_CInt16:
+ myMetadata += tr( "GDT_CInt16 - Complex Int16 " );
+ break;
+ case GDT_CInt32:
+ myMetadata += tr( "GDT_CInt32 - Complex Int32 " );
+ break;
+ case GDT_CFloat32:
+ myMetadata += tr( "GDT_CFloat32 - Complex Float32 " );
+ break;
+ case GDT_CFloat64:
+ myMetadata += tr( "GDT_CFloat64 - Complex Float64 " );
+ break;
+ default:
+ myMetadata += tr( "Could not determine raster data type." );
}
- else
- {
+ myMetadata += "</p>\n";
- // my added code (MColetti)
+ myMetadata += "<p class=\"glossy\">";
+ myMetadata += tr( "Pyramid overviews:" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>";
- myMetadata += "<p class=\"glossy\">";
- myMetadata += tr( "Dataset Description" );
- myMetadata += "</p>\n";
- myMetadata += "<p>";
- myMetadata += QFile::decodeName( GDALGetDescription( mGdalDataset ) );
- myMetadata += "</p>\n";
-
-
- char ** GDALmetadata = GDALGetMetadata( mGdalDataset, NULL );
-
- if ( GDALmetadata )
- {
- QStringList metadata = cStringList2Q_( GDALmetadata );
- myMetadata += makeTableCells_( metadata );
- }
- else
- {
- QgsDebugMsg( "dataset has no metadata" );
- }
-
- for ( int i = 1; i <= GDALGetRasterCount( mGdalDataset ); ++i )
- {
- myMetadata += "<p class=\"glossy\">" + tr( "Band %1" ).arg( i ) + "</p>\n";
- GDALRasterBandH gdalBand = GDALGetRasterBand( mGdalDataset, i );
- GDALmetadata = GDALGetMetadata( gdalBand, NULL );
-
- if ( GDALmetadata )
- {
- QStringList metadata = cStringList2Q_( GDALmetadata );
- myMetadata += makeTableCells_( metadata );
- }
- else
- {
- QgsDebugMsg( "band " + QString::number( i ) + " has no metadata" );
- }
-
- char ** GDALcategories = GDALGetRasterCategoryNames( gdalBand );
-
- if ( GDALcategories )
- {
- QStringList categories = cStringList2Q_( GDALcategories );
- myMetadata += makeTableCells_( categories );
- }
- else
- {
- QgsDebugMsg( "band " + QString::number( i ) + " has no categories" );
- }
-
- }
-
- // end my added code
-
- myMetadata += "<p class=\"glossy\">";
- myMetadata += tr( "Dimensions:" );
- myMetadata += "</p>\n";
- myMetadata += "<p>";
- myMetadata += tr( "X: %1 Y: %2 Bands: %3" )
- .arg( GDALGetRasterXSize( mGdalDataset ) )
- .arg( GDALGetRasterYSize( mGdalDataset ) )
- .arg( GDALGetRasterCount( mGdalDataset ) );
- myMetadata += "</p>\n";
-
- //just use the first band
- GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, 1 );
-
- myMetadata += "<p class=\"glossy\">";
- myMetadata += tr( "No Data Value" );
- myMetadata += "</p>\n";
- myMetadata += "<p>";
- if ( mValidNoDataValue )
- {
- myMetadata += QString::number( mNoDataValue );
- }
- else
- {
- myMetadata += "*" + tr( "NoDataValue not set" ) + "*";
- }
- myMetadata += "</p>\n";
-
- myMetadata += "</p>\n";
- myMetadata += "<p class=\"glossy\">";
- myMetadata += tr( "Data Type:" );
- myMetadata += "</p>\n";
- myMetadata += "<p>";
- switch ( GDALGetRasterDataType( myGdalBand ) )
- {
- case GDT_Byte:
- myMetadata += tr( "GDT_Byte - Eight bit unsigned integer" );
- break;
- case GDT_UInt16:
- myMetadata += tr( "GDT_UInt16 - Sixteen bit unsigned integer " );
- break;
- case GDT_Int16:
- myMetadata += tr( "GDT_Int16 - Sixteen bit signed integer " );
- break;
- case GDT_UInt32:
- myMetadata += tr( "GDT_UInt32 - Thirty two bit unsigned integer " );
- break;
- case GDT_Int32:
- myMetadata += tr( "GDT_Int32 - Thirty two bit signed integer " );
- break;
- case GDT_Float32:
- myMetadata += tr( "GDT_Float32 - Thirty two bit floating point " );
- break;
- case GDT_Float64:
- myMetadata += tr( "GDT_Float64 - Sixty four bit floating point " );
- break;
- case GDT_CInt16:
- myMetadata += tr( "GDT_CInt16 - Complex Int16 " );
- break;
- case GDT_CInt32:
- myMetadata += tr( "GDT_CInt32 - Complex Int32 " );
- break;
- case GDT_CFloat32:
- myMetadata += tr( "GDT_CFloat32 - Complex Float32 " );
- break;
- case GDT_CFloat64:
- myMetadata += tr( "GDT_CFloat64 - Complex Float64 " );
- break;
- default:
- myMetadata += tr( "Could not determine raster data type." );
- }
- myMetadata += "</p>\n";
-
- myMetadata += "<p class=\"glossy\">";
- myMetadata += tr( "Pyramid overviews:" );
- myMetadata += "</p>\n";
- myMetadata += "<p>";
-
- if ( GDALGetOverviewCount( myGdalBand ) > 0 )
- {
- int myOverviewInt;
- for ( myOverviewInt = 0;
- myOverviewInt < GDALGetOverviewCount( myGdalBand );
- myOverviewInt++ )
- {
- GDALRasterBandH myOverview;
- myOverview = GDALGetOverview( myGdalBand, myOverviewInt );
- myMetadata += "<p>X : " + QString::number( GDALGetRasterBandXSize( myOverview ) );
- myMetadata += ",Y " + QString::number( GDALGetRasterBandYSize( myOverview ) ) + "</p>";
- }
- }
- myMetadata += "</p>\n";
- } // if (mProviderKey.isEmpty())
-
myMetadata += "<p class=\"glossy\">";
myMetadata += tr( "Layer Spatial Reference System: " );
myMetadata += "</p>\n";
@@ -2794,140 +2639,110 @@
myMetadata += "</p>\n";
#endif
- if ( mProviderKey.isEmpty() )
+ //
+ // Add the stats for each band to the output table
+ //
+ int myBandCountInt = bandCount();
+ for ( int myIteratorInt = 1; myIteratorInt <= myBandCountInt; ++myIteratorInt )
{
- if ( GDALGetGeoTransform( mGdalDataset, mGeoTransform ) != CE_None )
+ QgsDebugMsg( "Raster properties : checking if band " + QString::number( myIteratorInt ) + " has stats? " );
+ //band name
+ myMetadata += "<p class=\"glossy\">\n";
+ myMetadata += tr( "Band" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>";
+ myMetadata += bandName( myIteratorInt );
+ myMetadata += "</p>\n";
+ //band number
+ myMetadata += "<p>";
+ myMetadata += tr( "Band No" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>\n";
+ myMetadata += QString::number( myIteratorInt );
+ myMetadata += "</p>\n";
+
+ //check if full stats for this layer have already been collected
+ if ( !hasStatistics( myIteratorInt ) ) //not collected
{
- // if the raster does not have a valid transform we need to use
- // a pixel size of (1,-1), but GDAL returns (1,1)
- mGeoTransform[5] = -1;
+ QgsDebugMsg( ".....no" );
+
+ myMetadata += "<p>";
+ myMetadata += tr( "No Stats" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>\n";
+ myMetadata += tr( "No stats collected yet" );
+ myMetadata += "</p>\n";
}
- else
+ else // collected - show full detail
{
- myMetadata += "<p class=\"glossy\">";
- myMetadata += tr( "Origin:" );
+ QgsDebugMsg( ".....yes" );
+
+ QgsRasterBandStats myRasterBandStats = bandStatistics( myIteratorInt );
+ //Min Val
+ myMetadata += "<p>";
+ myMetadata += tr( "Min Val" );
myMetadata += "</p>\n";
+ myMetadata += "<p>\n";
+ myMetadata += QString::number( myRasterBandStats.minimumValue, 'f', 10 );
+ myMetadata += "</p>\n";
+
+ // Max Val
myMetadata += "<p>";
- myMetadata += QString::number( mGeoTransform[0] );
- myMetadata += ",";
- myMetadata += QString::number( mGeoTransform[3] );
+ myMetadata += tr( "Max Val" );
myMetadata += "</p>\n";
+ myMetadata += "<p>\n";
+ myMetadata += QString::number( myRasterBandStats.maximumValue, 'f', 10 );
+ myMetadata += "</p>\n";
- myMetadata += "<p class=\"glossy\">";
- myMetadata += tr( "Pixel Size:" );
+ // Range
+ myMetadata += "<p>";
+ myMetadata += tr( "Range" );
myMetadata += "</p>\n";
+ myMetadata += "<p>\n";
+ myMetadata += QString::number( myRasterBandStats.range, 'f', 10 );
+ myMetadata += "</p>\n";
+
+ // Mean
myMetadata += "<p>";
- myMetadata += QString::number( mGeoTransform[1] );
- myMetadata += ",";
- myMetadata += QString::number( mGeoTransform[5] );
+ myMetadata += tr( "Mean" );
myMetadata += "</p>\n";
- }
+ myMetadata += "<p>\n";
+ myMetadata += QString::number( myRasterBandStats.mean, 'f', 10 );
+ myMetadata += "</p>\n";
- //
- // Add the stats for each band to the output table
- //
- int myBandCountInt = bandCount();
- for ( int myIteratorInt = 1; myIteratorInt <= myBandCountInt; ++myIteratorInt )
- {
- QgsDebugMsg( "Raster properties : checking if band " + QString::number( myIteratorInt ) + " has stats? " );
- //band name
- myMetadata += "<p class=\"glossy\">\n";
- myMetadata += tr( "Band" );
+ //sum of squares
+ myMetadata += "<p>";
+ myMetadata += tr( "Sum of squares" );
myMetadata += "</p>\n";
+ myMetadata += "<p>\n";
+ myMetadata += QString::number( myRasterBandStats.sumOfSquares, 'f', 10 );
+ myMetadata += "</p>\n";
+
+ //standard deviation
myMetadata += "<p>";
- myMetadata += bandName( myIteratorInt );
+ myMetadata += tr( "Standard Deviation" );
myMetadata += "</p>\n";
- //band number
+ myMetadata += "<p>\n";
+ myMetadata += QString::number( myRasterBandStats.stdDev, 'f', 10 );
+ myMetadata += "</p>\n";
+
+ //sum of all cells
myMetadata += "<p>";
- myMetadata += tr( "Band No" );
+ myMetadata += tr( "Sum of all cells" );
myMetadata += "</p>\n";
myMetadata += "<p>\n";
- myMetadata += QString::number( myIteratorInt );
+ myMetadata += QString::number( myRasterBandStats.sum, 'f', 10 );
myMetadata += "</p>\n";
- //check if full stats for this layer have already been collected
- if ( !hasStatistics( myIteratorInt ) ) //not collected
- {
- QgsDebugMsg( ".....no" );
-
- myMetadata += "<p>";
- myMetadata += tr( "No Stats" );
- myMetadata += "</p>\n";
- myMetadata += "<p>\n";
- myMetadata += tr( "No stats collected yet" );
- myMetadata += "</p>\n";
- }
- else // collected - show full detail
- {
- QgsDebugMsg( ".....yes" );
-
- QgsRasterBandStats myRasterBandStats = bandStatistics( myIteratorInt );
- //Min Val
- myMetadata += "<p>";
- myMetadata += tr( "Min Val" );
- myMetadata += "</p>\n";
- myMetadata += "<p>\n";
- myMetadata += QString::number( myRasterBandStats.minimumValue, 'f', 10 );
- myMetadata += "</p>\n";
-
- // Max Val
- myMetadata += "<p>";
- myMetadata += tr( "Max Val" );
- myMetadata += "</p>\n";
- myMetadata += "<p>\n";
- myMetadata += QString::number( myRasterBandStats.maximumValue, 'f', 10 );
- myMetadata += "</p>\n";
-
- // Range
- myMetadata += "<p>";
- myMetadata += tr( "Range" );
- myMetadata += "</p>\n";
- myMetadata += "<p>\n";
- myMetadata += QString::number( myRasterBandStats.range, 'f', 10 );
- myMetadata += "</p>\n";
-
- // Mean
- myMetadata += "<p>";
- myMetadata += tr( "Mean" );
- myMetadata += "</p>\n";
- myMetadata += "<p>\n";
- myMetadata += QString::number( myRasterBandStats.mean, 'f', 10 );
- myMetadata += "</p>\n";
-
- //sum of squares
- myMetadata += "<p>";
- myMetadata += tr( "Sum of squares" );
- myMetadata += "</p>\n";
- myMetadata += "<p>\n";
- myMetadata += QString::number( myRasterBandStats.sumOfSquares, 'f', 10 );
- myMetadata += "</p>\n";
-
- //standard deviation
- myMetadata += "<p>";
- myMetadata += tr( "Standard Deviation" );
- myMetadata += "</p>\n";
- myMetadata += "<p>\n";
- myMetadata += QString::number( myRasterBandStats.stdDev, 'f', 10 );
- myMetadata += "</p>\n";
-
- //sum of all cells
- myMetadata += "<p>";
- myMetadata += tr( "Sum of all cells" );
- myMetadata += "</p>\n";
- myMetadata += "<p>\n";
- myMetadata += QString::number( myRasterBandStats.sum, 'f', 10 );
- myMetadata += "</p>\n";
-
- //number of cells
- myMetadata += "<p>";
- myMetadata += tr( "Cell Count" );
- myMetadata += "</p>\n";
- myMetadata += "<p>\n";
- myMetadata += QString::number( myRasterBandStats.elementCount );
- myMetadata += "</p>\n";
- }
+ //number of cells
+ myMetadata += "<p>";
+ myMetadata += tr( "Cell Count" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>\n";
+ myMetadata += QString::number( myRasterBandStats.elementCount );
+ myMetadata += "</p>\n";
}
- } // if (mProviderKey.isEmpty())
+ }
QgsDebugMsg( myMetadata );
return myMetadata;
@@ -3234,6 +3049,17 @@
mProviderKey = provider; // XXX is this necessary? Usually already set
// XXX when execution gets here.
+ mBandCount = 0;
+ mRasterShader = new QgsRasterShader();
+
+ // Initialise the affine transform matrix
+ mGeoTransform[0] = 0;
+ mGeoTransform[1] = 1;
+ mGeoTransform[2] = 0;
+ mGeoTransform[3] = 0;
+ mGeoTransform[4] = 0;
+ mGeoTransform[5] = -1;
+
// load the plugin
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
QString ogrlib = pReg->library( provider );
@@ -3336,6 +3162,17 @@
{
*mCRS = QgsCoordinateReferenceSystem( mDataProvider->crs() );
}
+ //get the project projection, defaulting to this layer's projection
+ //if none exists....
+ if ( !mCRS->isValid() )
+ {
+ mCRS->setValidationHint( tr( "Specify CRS for layer %1" ).arg( name() ) );
+ mCRS->validate();
+ }
+ QString mySourceWkt = mCRS->toWkt();
+
+ QgsDebugMsg( "using wkt:\n" + mySourceWkt );
+
//mBandCount = GDALGetRasterCount( mGdalDataset );
mBandCount = mDataProvider->bandCount( );
for ( int i = 1; i <= mBandCount; i++ )
@@ -3360,6 +3197,9 @@
mContrastEnhancementList.append( myContrastEnhancement );
}
+ //defaults - Needs to be set after the Contrast list has been build
+ //Try to read the default contrast enhancement from the config file
+
QSettings myQSettings;
setContrastEnhancementAlgorithm( myQSettings.value( "/Raster/defaultContrastEnhancementAlgorithm", "StretchToMinimumMaximum" ).toString() );
@@ -3452,6 +3292,17 @@
mGrayBandName = bandName( 1 );
}
+ // Store timestamp
+ // TODO move to provider
+ mLastModified = lastModified( mDataSource );
+
+ mValidNoDataValue = mDataProvider->isNoDataValueValid();
+ if ( mValidNoDataValue )
+ {
+ mRasterTransparency.initializeTransparentPixelList( mNoDataValue, mNoDataValue, mNoDataValue );
+ mRasterTransparency.initializeTransparentPixelList( mNoDataValue );
+ }
+
//mark the layer as valid
mValid = true;
QgsDebugMsg( "exiting." );
@@ -5395,27 +5246,8 @@
QString QgsRasterLayer::projectionWkt()
{
- QString myWktString;
- QgsCoordinateReferenceSystem myCRS;
- myWktString = QString( GDALGetProjectionRef( mGdalDataset ) );
- myCRS.createFromWkt( myWktString );
- if ( !myCRS.isValid() )
- {
- //try to get the gcp srs from the raster layer if available
- myWktString = QString( GDALGetGCPProjection( mGdalDataset ) );
-
-// What is the purpose of this piece of code?
-// Sideeffects from validate()?
-// myCRS.createFromWkt(myWktString);
-// if (!myCRS.isValid())
-// {
-// // use force and make CRS valid!
-// myCRS.validate();
-// }
-
- }
-
- return myWktString;
+ // TODO: where is it used? It would be better to use crs.
+ return mDataProvider->crs().toWkt();
}
/*
@@ -5472,254 +5304,8 @@
*/
bool QgsRasterLayer::readFile( QString const &theFilename )
{
- registerGdalDrivers();
-
- mGdalDataset = NULL;
-
- //open the dataset making sure we handle char encoding of locale properly
- mGdalBaseDataset = GDALOpen( QFile::encodeName( theFilename ).constData(), GA_ReadOnly );
-
- if ( mGdalBaseDataset == NULL )
- {
- mValid = false;
- return false;
- }
-
- // Store timestamp
- mLastModified = lastModified( theFilename );
-
- // Check if we need a warped VRT for this file.
- if (( GDALGetGeoTransform( mGdalBaseDataset, mGeoTransform ) == CE_None
- && ( mGeoTransform[1] < 0.0
- || mGeoTransform[2] != 0.0
- || mGeoTransform[4] != 0.0
- || mGeoTransform[5] > 0.0 ) )
- || GDALGetGCPCount( mGdalBaseDataset ) > 0 )
- {
- QgsLogger::warning( "Creating Warped VRT." );
-
- mGdalDataset =
- GDALAutoCreateWarpedVRT( mGdalBaseDataset, NULL, NULL,
- GRA_NearestNeighbour, 0.2, NULL );
- if ( mGdalDataset == NULL )
- {
- QgsLogger::warning( "Warped VRT Creation failed." );
- mGdalDataset = mGdalBaseDataset;
- GDALReferenceDataset( mGdalDataset );
- }
- }
- else
- {
- mGdalDataset = mGdalBaseDataset;
- GDALReferenceDataset( mGdalDataset );
- }
-
- if ( subLayers().size() > 0 )
- {
- // just to get the sublayers
- mValid = false;
- return true;
- }
-
- //check f this file has pyramids
- GDALRasterBandH myGDALBand = GDALGetRasterBand( mGdalDataset, 1 ); //just use the first band
- if ( myGDALBand == NULL )
- {
- GDALDereferenceDataset( mGdalBaseDataset );
- mGdalBaseDataset = NULL;
-
- GDALClose( mGdalDataset );
- mGdalDataset = NULL;
- mValid = false;
- return false;
- }
-
- mHasPyramids = GDALGetOverviewCount( myGDALBand ) > 0;
-
- //populate the list of what pyramids exist
- buildPyramidList();
-
- // Get the layer's projection info and set up the
- // QgsCoordinateTransform for this layer
- // NOTE: we must do this before metadata is called
-
- QString mySourceWkt = projectionWkt();
-
- QgsDebugMsg( "--------------------------------------------------------------------------------------" );
- QgsDebugMsg( "using wkt:\n" + mySourceWkt );
- QgsDebugMsg( "--------------------------------------------------------------------------------------" );
-
- mCRS->createFromWkt( mySourceWkt );
- //get the project projection, defaulting to this layer's projection
- //if none exists....
- if ( !mCRS->isValid() )
- {
- mCRS->setValidationHint( tr( "Specify CRS for layer %1" ).arg( name() ) );
- mCRS->validate();
- }
-
- //set up the coordinat transform - in the case of raster this is mainly used to convert
- //the inverese projection of the map extents of the canvas when zzooming in etc. so
- //that they match the coordinate system of this layer
- QgsDebugMsg( "Layer registry has " + QString::number( QgsMapLayerRegistry::instance()->count() ) + "layers" );
-
- metadata();
-
- // Use the affine transform to get geo coordinates for
- // the corners of the raster
- double myXMax = mGeoTransform[0] +
- GDALGetRasterXSize( mGdalDataset ) * mGeoTransform[1] +
- GDALGetRasterYSize( mGdalDataset ) * mGeoTransform[2];
- double myYMin = mGeoTransform[3] +
- GDALGetRasterXSize( mGdalDataset ) * mGeoTransform[4] +
- GDALGetRasterYSize( mGdalDataset ) * mGeoTransform[5];
-
- mLayerExtent.setXMaximum( myXMax );
- // The affine transform reduces to these values at the
- // top-left corner of the raster
- mLayerExtent.setXMinimum( mGeoTransform[0] );
- mLayerExtent.setYMaximum( mGeoTransform[3] );
- mLayerExtent.setYMinimum( myYMin );
-
- //
- // Set up the x and y dimensions of this raster layer
- //
- mWidth = GDALGetRasterXSize( mGdalDataset );
- mHeight = GDALGetRasterYSize( mGdalDataset );
-
- //
- // Determine the nodata value
- //
- mNoDataValue = -9999.0; //Standard default?
- mValidNoDataValue = false;
- int isValid = false;
- double myNoDataValue = GDALGetRasterNoDataValue( GDALGetRasterBand( mGdalDataset, 1 ), &isValid );
- if ( isValid )
- {
- mNoDataValue = myNoDataValue;
- mValidNoDataValue = true;
- }
-
- if ( mValidNoDataValue )
- {
- mRasterTransparency.initializeTransparentPixelList( mNoDataValue, mNoDataValue, mNoDataValue );
- mRasterTransparency.initializeTransparentPixelList( mNoDataValue );
- }
-
- // Moved to setDataProvider, later maybe to constructor
- //mBandCount = GDALGetRasterCount( mGdalDataset );
- //for ( int i = 1; i <= mBandCount; i++ )
- //{
- //GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, i );
- //QgsRasterBandStats myRasterBandStats;
- //myRasterBandStats.bandName = generateBandName( i );
- //myRasterBandStats.bandNumber = i;
- //myRasterBandStats.statsGathered = false;
- //myRasterBandStats.histogramVector = new QgsRasterBandStats::HistogramVector();
- ////Store the default color table
- //readColorTable( i, &myRasterBandStats.colorTable );
-
- //mRasterStatsList.push_back( myRasterBandStats );
-
- ////Build a new contrast enhancement for the band and store in list
- //QgsContrastEnhancement myContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )GDALGetRasterDataType( myGdalBand ) );
- //mContrastEnhancementList.append( myContrastEnhancement );
- //}
-
- //defaults - Needs to be set after the Contrast list has been build
- //Try to read the default contrast enhancement from the config file
- //QSettings myQSettings;
- //setContrastEnhancementAlgorithm( myQSettings.value( "/Raster/defaultContrastEnhancementAlgorithm", "StretchToMinimumMaximum" ).toString() );
-
- ////decide what type of layer this is...
- ////TODO Change this to look at the color interp and palette interp to decide which type of layer it is
- //if (( GDALGetRasterCount( mGdalDataset ) > 1 ) )
- //{
- //mRasterType = Multiband;
- //}
- ////TODO hasBand is really obsolete and only used in the Palette instance, change to new function hasPalette(int)
- //else if ( hasBand( "Palette" ) ) //don't tr() this its a gdal word!
- //{
- //mRasterType = Palette;
- //}
- //else
- //{
- //mRasterType = GrayOrUndefined;
- //}
-
- //if ( mRasterType == Palette )
- //{
- //mRedBandName = TRSTRING_NOT_SET; // sensible default
- //mGreenBandName = TRSTRING_NOT_SET; // sensible default
- //mBlueBandName = TRSTRING_NOT_SET;// sensible default
- //mTransparencyBandName = TRSTRING_NOT_SET; // sensible default
- //mGrayBandName = bandName( 1 ); //sensible default
- //QgsDebugMsg( mGrayBandName );
-
- //mDrawingStyle = PalettedColor; //sensible default
-
- ////Set up a new color ramp shader
- //setColorShadingAlgorithm( ColorRampShader );
- //QgsColorRampShader* myColorRampShader = ( QgsColorRampShader* ) mRasterShader->rasterShaderFunction();
- ////TODO: Make sure the set algorithm and cast was successful,
- ////e.g., if ( 0 != myColorRampShader && myColorRampShader->shaderTypeAsString == "ColorRampShader" )
- //myColorRampShader->setColorRampType( QgsColorRampShader::INTERPOLATED );
- //myColorRampShader->setColorRampItemList( *colorTable( 1 ) );
- //}
- //else if ( mRasterType == Multiband )
- //{
- ////we know we have at least 2 layers...
- //mRedBandName = bandName( myQSettings.value( "/Raster/defaultRedBand", 1 ).toInt() ); // sensible default
- //mGreenBandName = bandName( myQSettings.value( "/Raster/defaultGreenBand", 2 ).toInt() ); // sensible default
-
- ////Check to make sure preferred bands combinations are valid
- //if ( mRedBandName.isEmpty() )
- //{
- //mRedBandName = bandName( 1 );
- //}
-
- //if ( mGreenBandName.isEmpty() )
- //{
- //mGreenBandName = bandName( 2 );
- //}
-
- ////for the third layer we cant be sure so..
- //if ( GDALGetRasterCount( mGdalDataset ) > 2 )
- //{
- //mBlueBandName = bandName( myQSettings.value( "/Raster/defaultBlueBand", 3 ).toInt() ); // sensible default
- //if ( mBlueBandName.isEmpty() )
- //{
- //mBlueBandName = bandName( 3 );
- //}
- //}
- //else
- //{
- //mBlueBandName = bandName( myQSettings.value( "/Raster/defaultBlueBand", 2 ).toInt() ); // sensible default
- //if ( mBlueBandName.isEmpty() )
- //{
- //mBlueBandName = bandName( 2 );
- //}
- //}
-
-
- //mTransparencyBandName = TRSTRING_NOT_SET;
- //mGrayBandName = TRSTRING_NOT_SET; //sensible default
- //mDrawingStyle = MultiBandColor; //sensible default
- //}
- //else //GrayOrUndefined
- //{
- //mRedBandName = TRSTRING_NOT_SET; //sensible default
- //mGreenBandName = TRSTRING_NOT_SET; //sensible default
- //mBlueBandName = TRSTRING_NOT_SET; //sensible default
- //mTransparencyBandName = TRSTRING_NOT_SET; //sensible default
- //mDrawingStyle = SingleBandGray; //sensible default
- //mGrayBandName = bandName( 1 );
- //}
-
- ////mark the layer as valid
- //mValid = true;
+ mValid = false;
return true;
-
} // QgsRasterLayer::readFile
/*
@@ -6043,6 +5629,12 @@
mNumCurrentImageRows = ySize;
QgsDebugMsg( "alloc " + QString::number( size * xSize * ySize) );
mCurrentGDALData = VSIMalloc( size * xSize * ySize );
+ double *p = (double *)mCurrentGDALData;
+ for ( int i = 0; i < xSize * ySize; i++ )
+ {
+ *p = mDataProvider->noDataValue();
+ p++;
+ }
//CPLErr myErr = GDALRasterIO( mRasterBand, GF_Read, mViewPort->rectXOffset,
// mViewPort->rectYOffset + mCurrentRow, mViewPort->clippedWidth, rasterYSize,
// mCurrentGDALData, xSize, ySize, type, 0, 0 );
@@ -6200,3 +5792,11 @@
}
}
}
+
+// Keep this for now, it is used by Python interface!!!
+void QgsRasterLayer::registerGdalDrivers()
+{
+ if ( GDALGetDriverCount() == 0 )
+ GDALAllRegister();
+}
+
Modified: branches/raster-providers/src/core/raster/qgsrasterlayer.h
===================================================================
--- branches/raster-providers/src/core/raster/qgsrasterlayer.h 2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/core/raster/qgsrasterlayer.h 2010-11-12 16:34:45 UTC (rev 14559)
@@ -292,6 +292,7 @@
/** Return time stamp for given file name */
static QDateTime lastModified( const QString & name );
+ // Keep this for now, it is used by Python interface!!!
/** \brief ensures that GDAL drivers are registered, but only once */
static void registerGdalDrivers();
@@ -648,9 +649,6 @@
virtual void setSubLayerVisibility( const QString & name, bool vis );
-
-
-
public slots:
/** \brief Create GDAL pyramid overviews */
QString buildPyramids( const RasterPyramidList &,
Added: branches/raster-providers/src/providers/gdal/CMakeLists.txt
===================================================================
--- branches/raster-providers/src/providers/gdal/CMakeLists.txt (rev 0)
+++ branches/raster-providers/src/providers/gdal/CMakeLists.txt 2010-11-12 16:34:45 UTC (rev 14559)
@@ -0,0 +1,24 @@
+
+SET(GDAL_SRCS qgsgdalprovider.cpp)
+SET (GDAL_MOC_HDRS qgsgdalprovider.h)
+
+INCLUDE_DIRECTORIES (
+ ../../core
+ ../../core/raster
+ ${GDAL_INCLUDE_DIR}
+# ${PROJ_INCLUDE_DIR}
+# ${GEOS_INCLUDE_DIR}
+)
+
+#QT4_WRAP_CPP(GDAL_MOC_SRCS ${GDAL_MOC_HDRS})
+#ADD_LIBRARY (gdalprovider MODULE ${GDAL_SRCS} ${GDAL_MOC_SRCS})
+ADD_LIBRARY (gdalprovider MODULE ${GDAL_SRCS} )
+
+TARGET_LINK_LIBRARIES (gdalprovider
+ qgis_core
+)
+
+INSTALL(TARGETS gdalprovider
+ RUNTIME DESTINATION ${QGIS_PLUGIN_DIR}
+ LIBRARY DESTINATION ${QGIS_PLUGIN_DIR})
+
Added: branches/raster-providers/src/providers/gdal/qgsgdalprovider.cpp
===================================================================
--- branches/raster-providers/src/providers/gdal/qgsgdalprovider.cpp (rev 0)
+++ branches/raster-providers/src/providers/gdal/qgsgdalprovider.cpp 2010-11-12 16:34:45 UTC (rev 14559)
@@ -0,0 +1,666 @@
+/***************************************************************************
+ qgsgdalprovider.cpp - QGIS Data provider for
+ GDAL rasters
+ -------------------
+ begin : November, 2010
+ copyright : (C) 2010 by Radim Blazek
+ email : radim dot blazek at gmail dot com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+/* $Id: qgsgdalprovider.cpp 11522 2009-08-28 14:49:22Z jef $ */
+
+#include "qgslogger.h"
+#include "qgsgdalprovider.h"
+#include "qgsconfig.h"
+
+#include <math.h>
+
+#include "qgsapplication.h"
+#include "qgscoordinatetransform.h"
+#include "qgsrectangle.h"
+#include "qgscoordinatereferencesystem.h"
+
+#include <QImage>
+#include <QSettings>
+#include <QColor>
+#include <QProcess>
+#include <QMessageBox>
+#include <QDir>
+#include <QFileInfo>
+#include <QFile>
+#include <QHash>
+
+#include "gdalwarper.h"
+#include "ogr_spatialref.h"
+#include "cpl_conv.h"
+
+static QString PROVIDER_KEY = "gdal";
+static QString PROVIDER_DESCRIPTION = "GDAL provider";
+
+QgsGdalProvider::QgsGdalProvider( QString const & uri )
+ : QgsRasterDataProvider( uri ), mValid( true )
+{
+ QgsDebugMsg( "QgsGdalProvider: constructing with uri '" + uri + "'." );
+
+ mValid = false;
+
+ // Initialise the affine transform matrix
+ mGeoTransform[0] = 0;
+ mGeoTransform[1] = 1;
+ mGeoTransform[2] = 0;
+ mGeoTransform[3] = 0;
+ mGeoTransform[4] = 0;
+ mGeoTransform[5] = -1;
+
+
+ registerGdalDrivers();
+ mGdalDataset = NULL;
+
+ mGdalBaseDataset = GDALOpen( QFile::encodeName( uri ).constData(), GA_ReadOnly );
+
+ CPLErrorReset();
+ if ( mGdalBaseDataset == NULL )
+ {
+ QMessageBox::warning( 0, QObject::tr( "Warning" ),
+ QObject::tr( "Cannot open GDAL dataset ") + uri + " : "
+ + QString::fromUtf8( CPLGetLastErrorMsg() ) );
+ return;
+ }
+
+ QgsDebugMsg ("GdalDataset opened" );
+
+ // Check if we need a warped VRT for this file.
+ if (( GDALGetGeoTransform( mGdalBaseDataset, mGeoTransform ) == CE_None
+ && ( mGeoTransform[1] < 0.0
+ || mGeoTransform[2] != 0.0
+ || mGeoTransform[4] != 0.0
+ || mGeoTransform[5] > 0.0 ) )
+ || GDALGetGCPCount( mGdalBaseDataset ) > 0 )
+ {
+ QgsLogger::warning( "Creating Warped VRT." );
+
+ mGdalDataset =
+ GDALAutoCreateWarpedVRT( mGdalBaseDataset, NULL, NULL,
+ GRA_NearestNeighbour, 0.2, NULL );
+ if ( mGdalDataset == NULL )
+ {
+ QgsLogger::warning( "Warped VRT Creation failed." );
+ mGdalDataset = mGdalBaseDataset;
+ GDALReferenceDataset( mGdalDataset );
+ }
+ }
+ else
+ {
+ mGdalDataset = mGdalBaseDataset;
+ GDALReferenceDataset( mGdalDataset );
+ }
+
+ //check if this file has pyramids
+ CPLErrorReset();
+ GDALRasterBandH myGDALBand = GDALGetRasterBand( mGdalDataset, 1 ); //just use the first band
+ if ( myGDALBand == NULL )
+ {
+ QMessageBox::warning( 0, QObject::tr( "Warning" ),
+ QObject::tr( "Cannot get GDAL raster band : " )
+ + QString::fromUtf8( CPLGetLastErrorMsg() ) ) ;
+
+ GDALDereferenceDataset( mGdalBaseDataset );
+ mGdalBaseDataset = NULL;
+
+ GDALClose( mGdalDataset );
+ mGdalDataset = NULL;
+ return;
+ }
+
+ mHasPyramids = GDALGetOverviewCount( myGDALBand ) > 0;
+
+ //populate the list of what pyramids exist
+ // TODO
+ //buildPyramidList();
+
+ // Get the layer's projection info and set up the
+ // QgsCoordinateTransform for this layer
+ // NOTE: we must do this before metadata is called
+
+ QString myWktString;
+ myWktString = QString( GDALGetProjectionRef( mGdalDataset ) );
+ mCrs.createFromWkt( myWktString );
+ if ( !mCrs.isValid() )
+ {
+ //try to get the gcp srs from the raster layer if available
+ myWktString = QString( GDALGetGCPProjection( mGdalDataset ) );
+// What is the purpose of this piece of code?
+// Sideeffects from validate()?
+// myCRS.createFromWkt(myWktString);
+// if (!myCRS.isValid())
+// {
+// // use force and make CRS valid!
+// myCRS.validate();
+// }
+
+ }
+
+ //set up the coordinat transform - in the case of raster this is mainly used to convert
+ //the inverese projection of the map extents of the canvas when zooming in etc. so
+ //that they match the coordinate system of this layer
+ //QgsDebugMsg( "Layer registry has " + QString::number( QgsMapLayerRegistry::instance()->count() ) + "layers" );
+
+ //metadata();
+
+ // Use the affine transform to get geo coordinates for
+ // the corners of the raster
+ double myXMax = mGeoTransform[0] +
+ GDALGetRasterXSize( mGdalDataset ) * mGeoTransform[1] +
+ GDALGetRasterYSize( mGdalDataset ) * mGeoTransform[2];
+ double myYMin = mGeoTransform[3] +
+ GDALGetRasterXSize( mGdalDataset ) * mGeoTransform[4] +
+ GDALGetRasterYSize( mGdalDataset ) * mGeoTransform[5];
+
+ mExtent.setXMaximum( myXMax );
+ // The affine transform reduces to these values at the
+ // top-left corner of the raster
+ mExtent.setXMinimum( mGeoTransform[0] );
+ mExtent.setYMaximum( mGeoTransform[3] );
+ mExtent.setYMinimum( myYMin );
+
+ //
+ // Set up the x and y dimensions of this raster layer
+ //
+ mWidth = GDALGetRasterXSize( mGdalDataset );
+ mHeight = GDALGetRasterYSize( mGdalDataset );
+
+
+ GDALGetBlockSize( GDALGetRasterBand( mGdalDataset, 1 ), &mXBlockSize, &mYBlockSize );
+ //
+ // Determine the nodata value
+ //
+ mNoDataValue = -9999.0; //Standard default?
+ mValidNoDataValue = false;
+ int isValid = false;
+ double myNoDataValue = GDALGetRasterNoDataValue( GDALGetRasterBand( mGdalDataset, 1 ), &isValid );
+ if ( isValid )
+ {
+ mNoDataValue = myNoDataValue;
+ mValidNoDataValue = true;
+ }
+
+ mValid = true;
+ QgsDebugMsg( "end" );
+}
+
+QgsGdalProvider::~QgsGdalProvider()
+{
+ QgsDebugMsg( "QgsGdalProvider: deconstructing." );
+}
+
+
+
+QString QgsGdalProvider::metadata()
+{
+ QString myMetadata ;
+ myMetadata += QString( GDALGetDescription( GDALGetDatasetDriver( mGdalDataset ) ) );
+ myMetadata += "<br>";
+ myMetadata += QString( GDALGetMetadataItem( GDALGetDatasetDriver( mGdalDataset ), GDAL_DMD_LONGNAME, NULL ) );
+
+ // my added code (MColetti)
+
+ myMetadata += "<p class=\"glossy\">";
+ myMetadata += tr( "Dataset Description" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>";
+ myMetadata += QFile::decodeName( GDALGetDescription( mGdalDataset ) );
+ myMetadata += "</p>\n";
+
+
+ char ** GDALmetadata = GDALGetMetadata( mGdalDataset, NULL );
+
+ if ( GDALmetadata )
+ {
+ QStringList metadata = cStringList2Q_( GDALmetadata );
+ myMetadata += QgsRasterDataProvider::makeTableCells( metadata );
+ }
+ else
+ {
+ QgsDebugMsg( "dataset has no metadata" );
+ }
+
+ for ( int i = 1; i <= GDALGetRasterCount( mGdalDataset ); ++i )
+ {
+ myMetadata += "<p class=\"glossy\">" + tr( "Band %1" ).arg( i ) + "</p>\n";
+ GDALRasterBandH gdalBand = GDALGetRasterBand( mGdalDataset, i );
+ GDALmetadata = GDALGetMetadata( gdalBand, NULL );
+
+ if ( GDALmetadata )
+ {
+ QStringList metadata = cStringList2Q_( GDALmetadata );
+ myMetadata += QgsRasterDataProvider::makeTableCells( metadata );
+ }
+ else
+ {
+ QgsDebugMsg( "band " + QString::number( i ) + " has no metadata" );
+ }
+
+ char ** GDALcategories = GDALGetRasterCategoryNames( gdalBand );
+
+ if ( GDALcategories )
+ {
+ QStringList categories = cStringList2Q_( GDALcategories );
+ myMetadata += QgsRasterDataProvider::makeTableCells( categories );
+ }
+ else
+ {
+ QgsDebugMsg( "band " + QString::number( i ) + " has no categories" );
+ }
+
+ }
+
+ // end my added code
+
+ myMetadata += "<p class=\"glossy\">";
+ myMetadata += tr( "Dimensions:" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>";
+ myMetadata += tr( "X: %1 Y: %2 Bands: %3" )
+ .arg( GDALGetRasterXSize( mGdalDataset ) )
+ .arg( GDALGetRasterYSize( mGdalDataset ) )
+ .arg( GDALGetRasterCount( mGdalDataset ) );
+ myMetadata += "</p>\n";
+
+ //just use the first band
+ GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, 1 );
+ if ( GDALGetOverviewCount( myGdalBand ) > 0 )
+ {
+ int myOverviewInt;
+ for ( myOverviewInt = 0;
+ myOverviewInt < GDALGetOverviewCount( myGdalBand );
+ myOverviewInt++ )
+ {
+ GDALRasterBandH myOverview;
+ myOverview = GDALGetOverview( myGdalBand, myOverviewInt );
+ myMetadata += "<p>X : " + QString::number( GDALGetRasterBandXSize( myOverview ) );
+ myMetadata += ",Y " + QString::number( GDALGetRasterBandYSize( myOverview ) ) + "</p>";
+ }
+ }
+ myMetadata += "</p>\n";
+
+ if ( GDALGetGeoTransform( mGdalDataset, mGeoTransform ) != CE_None )
+ {
+ // if the raster does not have a valid transform we need to use
+ // a pixel size of (1,-1), but GDAL returns (1,1)
+ mGeoTransform[5] = -1;
+ }
+ else
+ {
+ myMetadata += "<p class=\"glossy\">";
+ myMetadata += tr( "Origin:" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>";
+ myMetadata += QString::number( mGeoTransform[0] );
+ myMetadata += ",";
+ myMetadata += QString::number( mGeoTransform[3] );
+ myMetadata += "</p>\n";
+
+ myMetadata += "<p class=\"glossy\">";
+ myMetadata += tr( "Pixel Size:" );
+ myMetadata += "</p>\n";
+ myMetadata += "<p>";
+ myMetadata += QString::number( mGeoTransform[1] );
+ myMetadata += ",";
+ myMetadata += QString::number( mGeoTransform[5] );
+ myMetadata += "</p>\n";
+ }
+
+ return myMetadata;
+}
+
+
+// Not supported by GDAL
+QImage* QgsGdalProvider::draw( QgsRectangle const & viewExtent, int pixelWidth, int pixelHeight )
+{
+ QgsDebugMsg( "pixelWidth = " + QString::number( pixelWidth ) );
+ QgsDebugMsg( "pixelHeight = " + QString::number( pixelHeight ) );
+ QgsDebugMsg( "viewExtent: " + viewExtent.toString() );
+
+ QImage *image = new QImage( pixelWidth, pixelHeight, QImage::Format_ARGB32 );
+ image->fill( QColor( Qt::gray ).rgb() );
+
+ return image;
+}
+
+
+void QgsGdalProvider::readBlock( int theBandNo, int xBlock, int yBlock, void *block )
+{
+ QgsDebugMsg( "Entered" );
+
+ QgsDebugMsg( "yBlock = " + QString::number( yBlock ) );
+
+ GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, theBandNo );
+ GDALReadBlock( myGdalBand, xBlock, yBlock, block );
+}
+
+void QgsGdalProvider::readBlock( int theBandNo, QgsRectangle const & theExtent, int thePixelWidth, int thePixelHeight, void *theBlock )
+{
+ QgsDebugMsg( "thePixelWidth = " + QString::number( thePixelWidth ) );
+ QgsDebugMsg( "thePixelHeight = " + QString::number( thePixelHeight ) );
+ QgsDebugMsg( "theExtent: " + theExtent.toString() );
+
+
+ GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, theBandNo );
+ GDALDataType myGdalDataType = GDALGetRasterDataType( myGdalBand );
+
+ //QString myMemDsn = QString( "MEM:::DATAPOINTER=%1,PIXELS=%2,LINES=%3,BANDS=1,DATATYPE=%4,PIXELOFFSET=0,LINEOFFSET=0,BANDOFFSET=0")
+ //.arg ( (long) theBlock )
+ //.arg ( thePixelWidth )
+ //.arg ( thePixelHeight )
+ //.arg ( GDALGetDataTypeName( myGdalDataType ) );
+
+ QString myMemDsn;
+ myMemDsn.sprintf ( "DATAPOINTER = %p", theBlock );
+ QgsDebugMsg( myMemDsn );
+
+ myMemDsn.sprintf ( "MEM:::DATAPOINTER=%u,PIXELS=%d,LINES=%d,BANDS=1,DATATYPE=%s,PIXELOFFSET=0,LINEOFFSET=0,BANDOFFSET=0", (int)theBlock, thePixelWidth, thePixelHeight, GDALGetDataTypeName( myGdalDataType ) );
+
+ QgsDebugMsg( "Open GDAL MEM : " + myMemDsn );
+
+
+ CPLErrorReset();
+ GDALDatasetH myGdalMemDataset = GDALOpen( myMemDsn.toAscii().constData(),GA_Update);
+
+ if ( !myGdalMemDataset )
+ {
+ QMessageBox::warning( 0, QObject::tr( "Warning" ),
+ QObject::tr( "Cannot open GDAL MEM dataset ") + myMemDsn + " : "
+ + QString::fromUtf8( CPLGetLastErrorMsg() ) );
+ return;
+ }
+ // TODO add CRS to method params
+ //GDALSetProjection( myGdalMemDataset, crs().toWkt().toAscii().constData() );
+ GDALSetProjection( myGdalMemDataset, GDALGetProjectionRef( mGdalDataset ) );
+
+ double myMemGeoTransform[6];
+ myMemGeoTransform[0] = theExtent.xMinimum(); /* top left x */
+ myMemGeoTransform[1] = theExtent.width()/thePixelWidth; /* w-e pixel resolution */
+ myMemGeoTransform[2] = 0; /* rotation, 0 if image is "north up" */
+ myMemGeoTransform[3] = theExtent.yMaximum(); /* top left y */
+ myMemGeoTransform[4] = 0; /* rotation, 0 if image is "north up" */
+ myMemGeoTransform[5] = theExtent.height()/thePixelHeight; /* n-s pixel resolution */
+
+ double myGeoTransform[6];
+ GDALGetGeoTransform( mGdalDataset, myGeoTransform );
+ GDALSetGeoTransform( myGdalMemDataset, myGeoTransform );
+ GDALGetGeoTransform( myGdalMemDataset, myMemGeoTransform );
+
+ for ( int i = 0 ; i < 6; i++ )
+ {
+ QgsDebugMsg ( QString("transform : %1 %2").arg(myGeoTransform[i]).arg ( myMemGeoTransform[i] ) );
+ }
+
+ GDALWarpOptions *myWarpOptions = GDALCreateWarpOptions();
+
+ myWarpOptions->hSrcDS = mGdalDataset;
+ myWarpOptions->hDstDS = myGdalMemDataset;
+
+ myWarpOptions->nBandCount = 1;
+ myWarpOptions->panSrcBands =
+ (int *) CPLMalloc(sizeof(int) * myWarpOptions->nBandCount );
+ myWarpOptions->panSrcBands[0] = 1;
+ myWarpOptions->panDstBands =
+ (int *) CPLMalloc(sizeof(int) * myWarpOptions->nBandCount );
+ myWarpOptions->panDstBands[0] = 1;
+
+ // TODO move here progressCallback and use it
+ myWarpOptions->pfnProgress = GDALTermProgress;
+
+ QgsDebugMsg ( "src wkt: " + QString (GDALGetProjectionRef(mGdalDataset) ) );
+ QgsDebugMsg ( "dst wkt: " + QString ( GDALGetProjectionRef(myGdalMemDataset) ) );
+ myWarpOptions->pTransformerArg =
+ GDALCreateGenImgProjTransformer(
+ mGdalDataset,
+ GDALGetProjectionRef(mGdalDataset),
+ myGdalMemDataset,
+ GDALGetProjectionRef(myGdalMemDataset),
+ FALSE, 0.0, 1
+ );
+ myWarpOptions->pfnTransformer = GDALGenImgProjTransform;
+
+ GDALWarpOperation myOperation;
+
+ myOperation.Initialize( myWarpOptions );
+ CPLErrorReset();
+ CPLErr myErr = myOperation.ChunkAndWarpImage( 0, 0, thePixelWidth, thePixelHeight );
+ if ( myErr != CPLE_None )
+ {
+ QMessageBox::warning( 0, QObject::tr( "Warning" ),
+ QObject::tr( "Cannot ChunkAndWarpImage : " )
+ + QString::fromUtf8( CPLGetLastErrorMsg() ) );
+ return;
+ }
+
+ GDALDestroyGenImgProjTransformer( myWarpOptions->pTransformerArg );
+ GDALDestroyWarpOptions( myWarpOptions );
+
+ // this works
+ //myErr = GDALRasterIO( myGdalBand, GF_Read, 0, 0,
+ // xSize(), ySize(),
+ // theBlock, thePixelWidth, thePixelHeight,
+ // myGdalDataType, 0, 0 );
+
+ //GDALClose( myGdalMemDataset );
+
+}
+
+double QgsGdalProvider::noDataValue() const {
+ return mNoDataValue;
+}
+
+double QgsGdalProvider::minimumValue( int theBandNo ) const {
+ double GDALrange[2];
+ GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, theBandNo );
+ GDALComputeRasterMinMax( myGdalBand, 1, GDALrange ); //Approximate
+ return GDALrange[0];
+}
+double QgsGdalProvider::maximumValue( int theBandNo ) const {
+ double GDALrange[2];
+ GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, theBandNo );
+ GDALComputeRasterMinMax( myGdalBand, 1, GDALrange ); //Approximate
+ return GDALrange[1];
+}
+
+QList<QgsColorRampShader::ColorRampItem> QgsGdalProvider::colorTable(int bandNo)const {
+ // TODO
+ QList<QgsColorRampShader::ColorRampItem> ct;
+
+ //double v, r, g, b;
+ //for (i = colors.begin(); i != colors.end(); ++i)
+ //{
+ //QgsColorRampShader::ColorRampItem ctItem2;
+ //ctItem2.value = i->value2;
+ //ctItem2.color = QColor::fromRgb( i->red2, i->green2, i->blue2);
+ //ct.append(ctItem2);
+ //QgsDebugMsg( QString("color %1 %2 %3 %4").arg(i->value2).arg(i->red2).arg(i->green2).arg(i->blue2) );
+
+ //v = i->value2; r = i->red2; g = i->green2; b = i->blue2;
+ //}
+ return ct;
+}
+
+QgsCoordinateReferenceSystem QgsGdalProvider::crs()
+{
+ QgsDebugMsg( "Entered" );
+ return mCrs;
+}
+
+QgsRectangle QgsGdalProvider::extent()
+{
+ //TODO
+ //mExtent = QgsGdal::extent( mGisdbase, mLocation, mMapset, mMapName, QgsGdal::Raster );
+ return mExtent;
+}
+
+// this is only called once when statistics are calculated
+// TODO
+int QgsGdalProvider::xBlockSize() const {
+ return mXBlockSize;
+}
+int QgsGdalProvider::yBlockSize() const {
+ return mYBlockSize;
+}
+
+int QgsGdalProvider::xSize() const { return mWidth; }
+int QgsGdalProvider::ySize() const { return mHeight; }
+
+bool QgsGdalProvider::identify( const QgsPoint& thePoint, QMap<QString, QString>& theResults )
+{
+ QgsDebugMsg( "Entered" );
+ // TODO
+ theResults["Error"] = tr( "Not implemented" );
+ //theResults["Error"] = tr( "Out of extent" );
+ //theResults = QgsGdal::query( mGisdbase, mLocation, mMapset, mMapName, QgsGdal::Raster, thePoint.x(), thePoint.y() );
+ return true;
+}
+
+int QgsGdalProvider::capabilities() const
+{
+ int capability = QgsRasterDataProvider::Identify
+ | QgsRasterDataProvider::Data;
+ return capability;
+}
+
+int QgsGdalProvider::dataType( int bandNo ) const
+{
+ GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, bandNo );
+ GDALDataType myGdalDataType = GDALGetRasterDataType( myGdalBand );
+
+ switch ( myGdalDataType ) {
+ case GDT_Unknown:
+ return QgsRasterDataProvider::UnknownDataType;
+ break;
+ case GDT_Byte:
+ return QgsRasterDataProvider::Byte;
+ break;
+ case GDT_UInt16:
+ return QgsRasterDataProvider::UInt16;
+ break;
+ case GDT_Int16:
+ return QgsRasterDataProvider::Int16;
+ break;
+ case GDT_UInt32:
+ return QgsRasterDataProvider::UInt32;
+ break;
+ case GDT_Int32:
+ return QgsRasterDataProvider::Int32;
+ break;
+ case GDT_Float32:
+ return QgsRasterDataProvider::Float32;
+ break;
+ case GDT_Float64:
+ return QgsRasterDataProvider::Float64;
+ break;
+ case GDT_CInt16:
+ return QgsRasterDataProvider::CInt16;
+ break;
+ case GDT_CInt32:
+ return QgsRasterDataProvider::CInt32;
+ break;
+ case GDT_CFloat32:
+ return QgsRasterDataProvider::CFloat32;
+ break;
+ case GDT_CFloat64:
+ return QgsRasterDataProvider::CFloat64;
+ break;
+ }
+ return QgsRasterDataProvider::UnknownDataType;
+}
+
+int QgsGdalProvider::bandCount() const
+{
+ return GDALGetRasterCount( mGdalDataset);
+}
+
+int QgsGdalProvider::colorInterpretation ( int bandNo ) const {
+ // TODO
+ return QgsRasterDataProvider::GrayIndex;
+}
+
+void QgsGdalProvider::registerGdalDrivers()
+{
+ if ( GDALGetDriverCount() == 0 )
+ GDALAllRegister();
+}
+
+
+bool QgsGdalProvider::isValid()
+{
+ QgsDebugMsg ( QString("valid = %1").arg(mValid));
+ return mValid;
+}
+
+QString QgsGdalProvider::identifyAsText( const QgsPoint& point )
+{
+ return QString( "Not implemented" );
+}
+
+QString QgsGdalProvider::identifyAsHtml( const QgsPoint& point )
+{
+ return QString( "Not implemented" );
+}
+
+QString QgsGdalProvider::lastErrorTitle()
+{
+ return QString( "Not implemented" );
+}
+
+QString QgsGdalProvider::lastError()
+{
+ return QString( "Not implemented" );
+}
+
+QString QgsGdalProvider::name() const
+{
+ return PROVIDER_KEY;
+}
+
+QString QgsGdalProvider::description() const
+{
+ return PROVIDER_DESCRIPTION;
+}
+
+/**
+ * Class factory to return a pointer to a newly created
+ * QgsGdalProvider object
+ */
+QGISEXTERN QgsGdalProvider * classFactory( const QString *uri )
+{
+ return new QgsGdalProvider( *uri );
+}
+/** Required key function (used to map the plugin to a data store type)
+*/
+QGISEXTERN QString providerKey()
+{
+ return PROVIDER_KEY;
+}
+/**
+ * Required description function
+ */
+QGISEXTERN QString description()
+{
+ return PROVIDER_DESCRIPTION;
+}
+/**
+ * Required isProvider function. Used to determine if this shared library
+ * is a data provider plugin
+ */
+QGISEXTERN bool isProvider()
+{
+ return true;
+}
+
Added: branches/raster-providers/src/providers/gdal/qgsgdalprovider.h
===================================================================
--- branches/raster-providers/src/providers/gdal/qgsgdalprovider.h (rev 0)
+++ branches/raster-providers/src/providers/gdal/qgsgdalprovider.h 2010-11-12 16:34:45 UTC (rev 14559)
@@ -0,0 +1,265 @@
+/***************************************************************************
+ qgsgdalprovider.h - QGIS Data provider for
+ GDAL rasters
+ -------------------
+ begin : November, 2010
+ copyright : (C) 2010 by Radim Blazek
+ email : radim dot blazek at gmail dot com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+/* $Id: qgsgdalprovider.h 12528 2009-12-20 12:29:07Z jef $ */
+
+#ifndef QGSGDALPROVIDER_H
+#define QGSGDALPROVIDER_H
+
+
+#include "qgscoordinatereferencesystem.h"
+#include "qgsrasterdataprovider.h"
+#include "qgsrectangle.h"
+#include "qgscolorrampshader.h"
+
+#include <QString>
+#include <QStringList>
+#include <QDomElement>
+#include <QMap>
+#include <QVector>
+
+#define CPL_SUPRESS_CPLUSPLUS
+#include <gdal.h>
+
+/** \ingroup core
+ * A call back function for showing progress of gdal operations.
+ */
+int CPL_STDCALL progressCallback( double dfComplete,
+ const char *pszMessage,
+ void * pProgressArg );
+
+
+class QgsCoordinateTransform;
+
+/**
+
+ \brief Data provider for OGC WMS layers.
+
+ This provider implements the
+ interface defined in the QgsDataProvider class to provide access to spatial
+ data residing in a OGC Web Map Service.
+
+*/
+class QgsGdalProvider : public QgsRasterDataProvider
+{
+ //Q_OBJECT
+
+ public:
+ /**
+ * Constructor for the provider.
+ *
+ * \param uri HTTP URL of the Web Server. If needed a proxy will be used
+ * otherwise we contact the host directly.
+ *
+ */
+ QgsGdalProvider( QString const & uri = 0 );
+
+ //! Destructor
+ ~QgsGdalProvider();
+
+ /** \brief Renders the layer as an image
+ */
+ QImage* draw( QgsRectangle const & viewExtent, int pixelWidth, int pixelHeight );
+
+ /** return a provider name
+
+ Essentially just returns the provider key. Should be used to build file
+ dialogs so that providers can be shown with their supported types. Thus
+ if more than one provider supports a given format, the user is able to
+ select a specific provider to open that file.
+
+ @note
+
+ Instead of being pure virtual, might be better to generalize this
+ behavior and presume that none of the sub-classes are going to do
+ anything strange with regards to their name or description?
+
+ */
+ QString name() const;
+
+
+ /** return description
+
+ Return a terse string describing what the provider is.
+
+ @note
+
+ Instead of being pure virtual, might be better to generalize this
+ behavior and presume that none of the sub-classes are going to do
+ anything strange with regards to their name or description?
+
+ */
+ QString description() const;
+
+ /*! Get the QgsCoordinateReferenceSystem for this layer
+ * @note Must be reimplemented by each provider.
+ * If the provider isn't capable of returning
+ * its projection an empty srs will be return, ti will return 0
+ */
+ virtual QgsCoordinateReferenceSystem crs();
+
+ /** Return the extent for this data layer
+ */
+ virtual QgsRectangle extent();
+
+ /**Returns true if layer is valid
+ */
+ bool isValid();
+
+ /** \brief Identify raster value(s) found on the point position */
+ bool identify( const QgsPoint & point, QMap<QString, QString>& results );
+
+ /**
+ * \brief Identify details from a WMS Server from the last screen update
+ *
+ * \param point[in] The pixel coordinate (as it was displayed locally on screen)
+ *
+ * \return A text document containing the return from the WMS server
+ *
+ * \note WMS Servers prefer to receive coordinates in image space, therefore
+ * this function expects coordinates in that format.
+ *
+ * \note The arbitraryness of the returned document is enforced by WMS standards
+ * up to at least v1.3.0
+ */
+ QString identifyAsText( const QgsPoint& point );
+
+ /**
+ * \brief Identify details from a WMS Server from the last screen update
+ *
+ * \param point[in] The pixel coordinate (as it was displayed locally on screen)
+ *
+ * \return A text document containing the return from the WMS server
+ *
+ * \note WMS Servers prefer to receive coordinates in image space, therefore
+ * this function expects coordinates in that format.
+ *
+ * \note The arbitraryness of the returned document is enforced by WMS standards
+ * up to at least v1.3.0
+ *
+ * \note added in 1.5
+ */
+ QString identifyAsHtml( const QgsPoint& point );
+
+ /**
+ * \brief Returns the caption error text for the last error in this provider
+ *
+ * If an operation returns 0 (e.g. draw()), this function
+ * returns the text of the error associated with the failure.
+ * Interactive users of this provider can then, for example,
+ * call a QMessageBox to display the contents.
+ */
+ QString lastErrorTitle();
+
+ /**
+ * \brief Returns the verbose error text for the last error in this provider
+ *
+ * If an operation returns 0 (e.g. draw()), this function
+ * returns the text of the error associated with the failure.
+ * Interactive users of this provider can then, for example,
+ * call a QMessageBox to display the contents.
+ */
+
+ QString lastError();
+
+ /** Returns a bitmask containing the supported capabilities
+ Note, some capabilities may change depending on which
+ sublayers are visible on this provider, so it may
+ be prudent to check this value per intended operation.
+ */
+ int capabilities() const;
+
+ int dataType ( int bandNo ) const;
+
+ int bandCount() const;
+
+ int colorInterpretation ( int bandNo ) const;
+
+ int xBlockSize() const;
+ int yBlockSize() const;
+
+ int xSize() const;
+ int ySize() const;
+
+
+ void readBlock( int bandNo, int xBlock, int yBlock, void *data );
+ void readBlock( int bandNo, QgsRectangle const & viewExtent, int width, int height, void *data );
+
+ double noDataValue() const;
+ double minimumValue(int bandNo)const;
+ double maximumValue(int bandNo)const;
+
+ QList<QgsColorRampShader::ColorRampItem> colorTable(int bandNo)const;
+
+
+ /**
+ * Get metadata in a format suitable for feeding directly
+ * into a subset of the GUI raster properties "Metadata" tab.
+ */
+ QString metadata();
+
+ // Following methods specific for WMS are not used at all in this provider and should be removed IMO from qgsdataprovider.h
+ void addLayers( QStringList const & layers, QStringList const & styles = QStringList() ) {}
+ QStringList supportedImageEncodings() { return QStringList();}
+ QString imageEncoding() const { return QString(); }
+ void setImageEncoding( QString const & mimeType ) {}
+ void setImageCrs( QString const & crs ) {}
+
+ /** \brief ensures that GDAL drivers are registered, but only once */
+ static void registerGdalDrivers();
+
+ private:
+
+ /**
+ * Flag indicating if the layer data source is a valid WMS layer
+ */
+ bool mValid;
+
+ /** \brief Whether this raster has overviews / pyramids or not */
+ bool mHasPyramids;
+
+ QString mGisdbase; // map gisdabase
+ QString mLocation; // map location name (not path!)
+ QString mMapset; // map mapset
+ QString mMapName; // map name
+
+ QgsRectangle mExtent;
+ int mWidth;
+ int mHeight;
+ int mXBlockSize;
+ int mYBlockSize;
+
+ //GDALDataType mGdalDataType;
+
+ /** \brief Pointer to the gdaldataset */
+ GDALDatasetH mGdalBaseDataset;
+
+ /** \brief Pointer to the gdaldataset (possibly warped vrt) */
+ GDALDatasetH mGdalDataset;
+
+ /** \brief Values for mapping pixel to world coordinates. Contents of this array are the same as the GDAL adfGeoTransform */
+ double mGeoTransform[6];
+
+ //QHash<QString, QString> mInfo;
+
+ QgsCoordinateReferenceSystem mCrs;
+
+};
+
+#endif
+
Modified: branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.cpp
===================================================================
--- branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.cpp 2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.cpp 2010-11-12 16:34:45 UTC (rev 14559)
@@ -199,8 +199,8 @@
QgsDebugMsg( "pixelHeight = " + QString::number( pixelHeight ) );
QgsDebugMsg( "viewExtent: " + viewExtent.toString() );
- QImage *image = new QImage( pixelWidth, pixelHeight, QImage::Format_ARGB32 );
- image->fill( QColor( Qt::gray ).rgb() );
+ //QImage *image = new QImage( pixelWidth, pixelHeight, QImage::Format_ARGB32 );
+ //image->fill( QColor( Qt::gray ).rgb() );
QStringList arguments;
arguments.append( "map=" + mMapName + "@" + mMapset );
Modified: branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.h
===================================================================
--- branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.h 2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.h 2010-11-12 16:34:45 UTC (rev 14559)
@@ -204,7 +204,7 @@
* Get metadata in a format suitable for feeding directly
* into a subset of the GUI raster properties "Metadata" tab.
*/
- QString metadata() { return QString(); }
+ QString metadata();
// Following methods specific for WMS are not used at all in this provider and should be removed IMO from qgsdataprovider.h
void addLayers( QStringList const & layers, QStringList const & styles = QStringList() ) {}
@@ -227,7 +227,7 @@
RASTER_MAP_TYPE mGrassDataType; // CELL_TYPE, DCELL_TYPE, FCELL_TYPE
- QgsRectangle mExtent;
+ //QgsRectangle mExtent;
int mCols;
int mRows;
int mYBlockSize;
More information about the QGIS-commit
mailing list