Quantum GIS API Documentation
1.7.4
|
00001 /*************************************************************************** 00002 qgsrasterlayer.h - description 00003 ------------------- 00004 begin : Fri Jun 28 2002 00005 copyright : (C) 2004 by T.Sutton, Gary E.Sherman, Steve Halasz 00006 email : tim@linfiniti.com 00007 ***************************************************************************/ 00008 /* 00009 * Peter J. Ersts - contributed to the refactoring and maintenance of this class 00010 * B. Morley - added functions to convert this class to a data provider interface 00011 * Frank Warmerdam - contributed bug fixes and migrated class to use all GDAL_C_API calls 00012 */ 00013 /*************************************************************************** 00014 * * 00015 * This program is free software; you can redistribute it and/or modify * 00016 * it under the terms of the GNU General Public License as published by * 00017 * the Free Software Foundation; either version 2 of the License, or * 00018 * (at your option) any later version. * 00019 * * 00020 ***************************************************************************/ 00021 /* $Id$ */ 00022 #ifndef QGSRASTERLAYER_H 00023 #define QGSRASTERLAYER_H 00024 00025 // 00026 // Includes 00027 // 00028 00029 #include <QColor> 00030 #include <QDateTime> 00031 #include <QVector> 00032 #include <QList> 00033 #include <QMap> 00034 00035 #include "qgis.h" 00036 #include "qgspoint.h" 00037 #include "qgsmaplayer.h" 00038 #include "qgsrasterviewport.h" 00039 #include "qgscontrastenhancement.h" 00040 #include "qgsrastertransparency.h" 00041 #include "qgsrastershader.h" 00042 #include "qgscolorrampshader.h" 00043 #include "qgsrastershaderfunction.h" 00044 #include "qgsrasterdataprovider.h" 00045 00046 // 00047 // Forward declarations 00048 // 00049 class QgsMapToPixel; 00050 class QgsRectangle; 00051 class QgsRasterBandStats; 00052 class QgsRasterPyramid; 00053 class QImage; 00054 class QPixmap; 00055 class QSlider; 00056 class QLibrary; 00057 00169 class CORE_EXPORT QgsRasterLayer : public QgsMapLayer 00170 { 00171 Q_OBJECT 00172 public: 00189 QgsRasterLayer( const QString & path = QString::null, 00190 const QString & baseName = QString::null, 00191 bool loadDefaultStyleFlag = true ); 00192 00194 QgsRasterLayer( int dummy, 00195 const QString & baseName = QString(), 00196 const QString & path = QString(), 00197 const QString & providerLib = QString(), 00198 const QStringList & layers = QStringList(), 00199 const QStringList & styles = QStringList(), 00200 const QString & format = QString(), 00201 const QString & crs = QString() ); 00202 00203 00205 ~QgsRasterLayer(); 00206 00207 00208 // 00209 // Enums, structs and typedefs 00210 // 00212 enum ColorShadingAlgorithm 00213 { 00214 UndefinedShader, 00215 PseudoColorShader, 00216 FreakOutShader, 00217 ColorRampShader, 00218 UserDefinedShader 00219 }; 00220 00222 enum DrawingStyle 00223 { 00224 UndefinedDrawingStyle, 00225 SingleBandGray, // a single band image drawn as a range of gray colors 00226 SingleBandPseudoColor, // a single band image drawn using a pseudocolor algorithm 00227 PalettedColor, //a "Palette" image drawn using color table 00228 PalettedSingleBandGray, // a "Palette" layer drawn in gray scale 00229 PalettedSingleBandPseudoColor, // a "Palette" layerdrawn using a pseudocolor algorithm 00230 PalettedMultiBandColor, // currently not supported 00231 MultiBandSingleGandGray, // a layer containing 2 or more bands, but a single band drawn as a range of gray colors 00232 //added in 1.6 to fix naming glitch 00233 MultiBandSingleBandGray = MultiBandSingleGandGray, // a layer containing 2 or more bands, but a single band drawn as a range of gray colors 00234 MultiBandSingleBandPseudoColor, //a layer containing 2 or more bands, but a single band drawn using a pseudocolor algorithm 00235 MultiBandColor, //a layer containing 2 or more bands, mapped to RGB color space. In the case of a multiband with only two bands, one band will be mapped to more than one color. 00236 SingleBandColorDataStyle // ARGB values rendered directly 00237 }; 00238 00240 enum LayerType 00241 { 00242 GrayOrUndefined, 00243 Palette, 00244 Multiband, 00245 ColorLayer 00246 } ; 00247 00249 typedef QList<QgsContrastEnhancement> ContrastEnhancementList; 00250 00258 typedef QList<QgsRasterPyramid> RasterPyramidList; 00259 00263 typedef QList<QgsRasterBandStats> RasterStatsList; 00264 00265 // 00266 // Static methods: 00267 // 00268 static void buildSupportedRasterFileFilter( QString & fileFilters ); 00269 00275 static bool isValidRasterFileName( const QString & theFileNameQString, QString &retError ); 00276 static bool isValidRasterFileName( const QString & theFileNameQString ); 00277 //static QStringList subLayers( GDALDatasetH dataset ); 00278 00279 00281 static QDateTime lastModified( const QString & name ); 00282 00283 // Keep this for now, it is used by Python interface!!! 00285 static void registerGdalDrivers(); 00286 00287 // 00288 // Non Static inline methods 00289 // 00290 00292 void init(); 00293 00294 // For backward compatibility (Python) get rid of it once python is updated 00295 void setDataProvider( const QString & provider, 00296 const QStringList & layers, 00297 const QStringList & styles, 00298 const QString & format, 00299 const QString & crs ); 00301 void setDataProvider( const QString & provider, 00302 const QStringList & layers, 00303 const QStringList & styles, 00304 const QString & format, 00305 const QString & crs, 00306 bool loadDefaultStyleFlag ); 00307 00308 static QLibrary* loadProviderLibrary( QString theProviderKey ); 00309 static QgsRasterDataProvider* loadProvider( QString theProviderKey, QString theDataSource = 0 ); 00310 00311 00313 QString blueBandName() const { return mBlueBandName; } 00314 00316 QgsRasterLayer::ColorShadingAlgorithm colorShadingAlgorithm() const { return mColorShadingAlgorithm; } 00317 00319 QgsContrastEnhancement::ContrastEnhancementAlgorithm contrastEnhancementAlgorithm() { return mContrastEnhancementAlgorithm; } 00320 00322 QString contrastEnhancementAlgorithmAsString() const; 00323 00325 DrawingStyle drawingStyle() { return mDrawingStyle; } 00326 00328 QString grayBandName() const { return mGrayBandName; } 00329 00331 QString greenBandName() const { return mGreenBandName; } 00332 00334 bool hasPyramids() { return mHasPyramids; } 00335 00337 bool hasUserDefinedGrayMinimumMaximum() const { return mUserDefinedGrayMinimumMaximum; } 00338 00340 bool hasUserDefinedRGBMinimumMaximum() const { return mUserDefinedRGBMinimumMaximum; } 00341 00343 int height() { return mHeight; } 00344 00346 bool invertHistogram() const { return mInvertColor; } 00347 00349 bool isNoDataValueValid() const { return mValidNoDataValue; } 00350 00352 bool isGrayMinimumMaximumEstimated() const { return mGrayMinimumMaximumEstimated; } 00353 00355 bool isRGBMinimumMaximumEstimated() const { return mRGBMinimumMaximumEstimated; } 00356 00358 double noDataValue( bool* isValid = 0 ) { if ( isValid ) { *isValid = mValidNoDataValue;} return mNoDataValue; } 00359 00361 QgsRasterTransparency* rasterTransparency() { return &mRasterTransparency; } 00362 00364 QgsRasterShader* rasterShader() { return mRasterShader; } 00365 00367 LayerType rasterType() { return mRasterType; } 00368 00370 QString redBandName() const { return mRedBandName; } 00371 00372 00374 void setDrawingStyle( const DrawingStyle & theDrawingStyle ) { mDrawingStyle = theDrawingStyle; } 00375 00377 void setGrayMinimumMaximumEstimated( bool theBool ) { mGrayMinimumMaximumEstimated = theBool; } 00378 00380 void setInvertHistogram( bool theFlag ) { mInvertColor = theFlag; } 00381 00383 void setRGBMinimumMaximumEstimated( bool theBool ) { mRGBMinimumMaximumEstimated = theBool; } 00384 00386 void setStandardDeviations( double theStandardDeviations ) { mStandardDeviations = theStandardDeviations; } 00387 00389 void setUserDefinedGrayMinimumMaximum( bool theBool ) { mUserDefinedGrayMinimumMaximum = theBool; } 00390 00392 void setUserDefinedRGBMinimumMaximum( bool theBool ) { mUserDefinedRGBMinimumMaximum = theBool; } 00393 00395 double standardDeviations() const { return mStandardDeviations; } 00396 00398 QString transparentBandName() const { return mTransparencyBandName; } 00399 00401 bool usesProvider(); 00402 00404 int width() { return mWidth; } 00405 00406 // 00407 // Non Static methods 00408 // 00410 unsigned int bandCount(); 00411 00413 const QString bandName( int theBandNoInt ); 00414 00418 int bandNumber( const QString & theBandName ); 00419 00421 const QgsRasterBandStats bandStatistics( int ); 00422 00424 const QgsRasterBandStats bandStatistics( const QString & ); 00425 00431 RasterPyramidList buildPyramidList(); 00432 00434 QString colorShadingAlgorithmAsString() const; 00435 00437 void computeMinimumMaximumEstimates( int theBand, double* theMinMax ); 00438 00440 void computeMinimumMaximumEstimates( QString theBand, double* theMinMax ); 00441 00444 void computeMinimumMaximumEstimates( int theBand, double& theMin, double& theMax ); 00445 00447 void computeMinimumMaximumFromLastExtent( int theBand, double* theMinMax ); 00448 00450 void computeMinimumMaximumFromLastExtent( QString theBand, double* theMinMax ); 00451 00454 void computeMinimumMaximumFromLastExtent( int theBand, double& theMin, double& theMax ); 00455 00457 QgsContrastEnhancement* contrastEnhancement( unsigned int theBand ); 00458 00460 bool copySymbologySettings( const QgsMapLayer& theOther ); 00461 00463 QList<QgsColorRampShader::ColorRampItem>* colorTable( int theBandNoInt ); 00464 00466 QgsRasterDataProvider* dataProvider(); 00467 00469 const QgsRasterDataProvider* dataProvider() const; 00470 00473 virtual void reload(); 00474 00476 bool draw( QgsRenderContext& rendererContext ); 00477 00479 void draw( QPainter * theQPainter, 00480 QgsRasterViewPort * myRasterViewPort, 00481 const QgsMapToPixel* theQgsMapToPixel = 0 ); 00482 00488 QString drawingStyleAsString() const; 00489 00491 bool hasCompatibleSymbology( const QgsMapLayer& theOther ) const; 00492 00494 bool hasStatistics( int theBandNoInt ); 00495 00497 bool identify( const QgsPoint & point, QMap<QString, QString>& results ); 00498 00500 QString identifyAsText( const QgsPoint & point ); 00501 00505 QString identifyAsHtml( const QgsPoint & point ); 00506 00508 bool isEditable() const; 00509 00511 QString lastError(); 00512 00514 QString lastErrorTitle(); 00515 00517 QPixmap legendAsPixmap(); 00518 00520 QPixmap legendAsPixmap( bool ); 00521 00523 QPixmap legendAsPixmap( int theLabelCount ); 00524 00526 double maximumValue( unsigned int theBand ); 00527 00529 double maximumValue( QString theBand ); 00530 00532 QString metadata(); 00533 00535 double minimumValue( unsigned int theBand ); 00536 00538 double minimumValue( QString theBand ); 00539 00541 QPixmap paletteAsPixmap( int theBand = 1 ); 00542 00544 QString providerKey() const; 00545 00547 double rasterUnitsPerPixel(); 00548 00550 // Keep this for QgsRasterLayerProperties 00551 bool readColorTable( int theBandNumber, QList<QgsColorRampShader::ColorRampItem>* theList ); 00552 00554 void resetNoDataValue(); 00555 00557 void setBlueBandName( const QString & theBandName ); 00558 00560 void setColorShadingAlgorithm( QgsRasterLayer::ColorShadingAlgorithm theShaderAlgorithm ); 00561 00563 void setColorShadingAlgorithm( QString theShaderAlgorithm ); 00564 00566 void setContrastEnhancementAlgorithm( QgsContrastEnhancement::ContrastEnhancementAlgorithm theAlgorithm, 00567 bool theGenerateLookupTableFlag = true ); 00568 00570 void setContrastEnhancementAlgorithm( QString theAlgorithm, bool theGenerateLookupTableFlag = true ); 00571 00573 void setContrastEnhancementFunction( QgsContrastEnhancementFunction* theFunction ); 00574 00576 void setDrawingStyle( const QString & theDrawingStyleQString ); 00577 00579 void setGrayBandName( const QString & theBandName ); 00580 00582 void setGreenBandName( const QString & theBandName ); 00583 00585 void setMaximumValue( unsigned int theBand, double theValue, bool theGenerateLookupTableFlag = true ); 00586 00588 void setMaximumValue( QString theBand, double theValue, bool theGenerateLookupTableFlag = true ); 00589 00593 void setMinimumMaximumUsingLastExtent(); 00594 00597 void setMinimumMaximumUsingDataset(); 00598 00600 void setMinimumValue( unsigned int theBand, double theValue, bool theGenerateLookupTableFlag = true ); 00601 00603 void setMinimumValue( QString theBand, double theValue, bool theGenerateLookupTableFlag = true ); 00604 00606 void setNoDataValue( double theNoData ); 00607 00610 void setRasterShaderFunction( QgsRasterShaderFunction* theFunction ); 00611 00613 void setRedBandName( const QString & theBandName ); 00614 00616 void setTransparentBandName( const QString & theBandName ); 00617 00619 void showProgress( int theValue ); 00620 00622 QStringList subLayers() const; 00623 00625 void thumbnailAsPixmap( QPixmap * theQPixmap ); 00629 void thumbnailAsImage( QImage * thepImage ); 00630 00632 void triggerRepaint(); 00633 00634 // 00635 // Virtural methods 00636 // 00643 virtual void setLayerOrder( const QStringList & layers ); 00644 00648 virtual void setSubLayerVisibility( const QString & name, bool vis ); 00649 00651 virtual QDateTime timestamp() const { return mDataProvider->timestamp() ; } 00652 00653 public slots: 00655 QString buildPyramids( const RasterPyramidList &, 00656 const QString & theResamplingMethod = "NEAREST", 00657 bool theTryInternalFlag = false ); 00658 00661 void populateHistogram( int theBandNoInt, 00662 int theBinCountInt = 256, 00663 bool theIgnoreOutOfRangeFlag = true, 00664 bool theThoroughBandScanFlag = false ); 00665 00666 void showStatusMessage( const QString & theMessage ); 00667 00669 void updateProgress( int, int ); 00670 00672 void onProgress( int, double, QString ); 00673 00674 signals: 00676 void progressUpdate( int theValue ); 00677 00682 void dataChanged(); 00683 00684 protected: 00685 00687 bool readSymbology( const QDomNode& node, QString& errorMessage ); 00688 00690 bool readXml( QDomNode & layer_node ); 00691 00693 bool writeSymbology( QDomNode&, QDomDocument& doc, QString& errorMessage ) const; 00694 00696 bool writeXml( QDomNode & layer_node, QDomDocument & doc ); 00697 00698 private: 00699 // 00700 // Private methods 00701 // 00703 void drawSingleBandColorData( QPainter * theQPainter, 00704 QgsRasterViewPort * theRasterViewPort, 00705 const QgsMapToPixel* theQgsMapToPixel, 00706 int theBandNoInt ); 00707 00709 void drawMultiBandColor( QPainter * theQPainter, 00710 QgsRasterViewPort * theRasterViewPort, 00711 const QgsMapToPixel* theQgsMapToPixel ); 00712 00714 void drawMultiBandSingleBandGray( QPainter * theQPainter, 00715 QgsRasterViewPort * theRasterViewPort, 00716 const QgsMapToPixel* theQgsMapToPixel, 00717 int theBandNoInt ); 00718 00720 void drawMultiBandSingleBandPseudoColor( QPainter * theQPainter, 00721 QgsRasterViewPort * theRasterViewPort, 00722 const QgsMapToPixel* theQgsMapToPixel, 00723 int theBandNoInt ); 00724 00726 void drawPalettedSingleBandColor( QPainter * theQPainter, 00727 QgsRasterViewPort * theRasterViewPort, 00728 const QgsMapToPixel* theQgsMapToPixel, 00729 int theBandNoInt ); 00730 00732 void drawPalettedSingleBandGray( QPainter * theQPainter, 00733 QgsRasterViewPort * theRasterViewPort, 00734 const QgsMapToPixel* theQgsMapToPixel, 00735 int theBandNoInt ); 00736 00738 void drawPalettedSingleBandPseudoColor( QPainter * theQPainter, 00739 QgsRasterViewPort * theRasterViewPort, 00740 const QgsMapToPixel* theQgsMapToPixel, 00741 int theBandNoInt ); 00742 00744 void drawPalettedMultiBandColor( QPainter * theQPainter, 00745 QgsRasterViewPort * theRasterViewPort, 00746 const QgsMapToPixel* theQgsMapToPixel, 00747 int theBandNoInt ); 00748 00750 void drawSingleBandGray( QPainter * theQPainter, 00751 QgsRasterViewPort * theRasterViewPort, 00752 const QgsMapToPixel* theQgsMapToPixel, 00753 int theBandNoInt ); 00754 00756 void drawSingleBandPseudoColor( QPainter * theQPainter, 00757 QgsRasterViewPort * theRasterViewPort, 00758 const QgsMapToPixel* theQgsMapToPixel, 00759 int theBandNoInt ); 00760 00762 void closeDataProvider(); 00763 00765 QString generateBandName( int ); 00766 00768 bool hasBand( const QString & theBandName ); 00769 00771 QString projectionWkt(); 00772 00774 //void* readData( GDALRasterBandH gdalBand, QgsRasterViewPort *viewPort ); 00775 void* readData( int bandNo, QgsRasterViewPort *viewPort ); 00776 00778 bool readFile( const QString & fileName ); 00779 00781 //inline double readValue( void *data, GDALDataType type, int index ); 00782 inline double readValue( void *data, int type, int index ); 00783 00785 bool update(); 00786 00788 QString validateBandName( const QString & theBandName ); 00789 00790 // 00791 // Private member vars 00792 // 00794 const QString QSTRING_NOT_SET; 00795 const QString TRSTRING_NOT_SET; 00796 00798 int mBandCount; 00799 00801 QString mBlueBandName; 00802 00804 ColorShadingAlgorithm mColorShadingAlgorithm; 00805 00807 QgsContrastEnhancement::ContrastEnhancementAlgorithm mContrastEnhancementAlgorithm; 00808 00810 ContrastEnhancementList mContrastEnhancementList; 00811 00813 double mStandardDeviations; 00814 00816 QgsRasterDataProvider* mDataProvider; 00817 00818 DrawingStyle mDrawingStyle; 00819 00821 bool mEditable; 00822 00824 QString mError; 00825 00827 QString mErrorCaption; 00828 00830 //GDALDatasetH mGdalBaseDataset; 00831 00833 //GDALDatasetH mGdalDataset; 00834 00836 double mGeoTransform[6]; 00837 00839 QString mGrayBandName; 00840 00842 bool mGrayMinimumMaximumEstimated; 00843 00845 QString mGreenBandName; 00846 00848 bool mHasPyramids; 00849 00851 int mWidth; 00852 00854 int mHeight; 00855 00857 bool mInvertColor; 00858 00860 QDateTime mLastModified; 00861 00862 QgsRasterViewPort mLastViewPort; 00863 00865 //QLibrary* mLib; 00866 00868 bool mModified; 00869 00871 double mNoDataValue; 00872 00874 QString mProviderKey; 00875 00877 RasterPyramidList mPyramidList; 00878 00880 QgsRasterShader* mRasterShader; 00881 00883 RasterStatsList mRasterStatsList; 00884 00886 QgsRasterTransparency mRasterTransparency; 00887 00888 LayerType mRasterType; 00889 00891 QString mRedBandName; 00892 00894 bool mRGBMinimumMaximumEstimated; 00895 00897 QString mTransparencyBandName; 00898 00900 bool mUserDefinedGrayMinimumMaximum; 00901 00903 bool mUserDefinedRGBMinimumMaximum; 00904 00906 bool mValidNoDataValue; 00907 00909 /* TODO: put everything to URI */ 00910 QStringList mLayers; 00911 QStringList mStyles; 00912 QString mFormat; 00913 QString mCrs; 00914 }; 00915 00916 /*#include <QColor> 00917 00918 typedef void* GDALRasterBandH; 00919 class QgsMapToPixel; 00920 struct QgsRasterViewPort; 00921 class QImage; 00922 class QPainter;*/ 00923 00927 class CORE_EXPORT QgsRasterImageBuffer 00928 { 00929 public: 00930 QgsRasterImageBuffer( QgsRasterDataProvider *dataProvider, int bandNo, QPainter* p, 00931 QgsRasterViewPort* viewPort, const QgsMapToPixel* mapToPixel, double* mGeoTransform ); 00932 ~QgsRasterImageBuffer(); 00933 void reset( int maxPixelsInVirtualMemory = 5000000 ); 00935 bool nextScanLine( QRgb** imageScanLine, void** rasterScanLine ); 00936 00937 void setWritingEnabled( bool enabled ) { mWritingEnabled = enabled; } 00938 00939 private: 00940 QgsRasterImageBuffer(); //forbidden 00942 bool createNextPartImage(); 00943 00945 void drawPixelRectangle(); 00946 00947 QgsRasterDataProvider* mDataProvider; 00948 int mBandNo; 00949 QPainter* mPainter; 00950 QgsRasterViewPort* mViewPort; 00951 const QgsMapToPixel* mMapToPixel; 00952 double* mGeoTransform; 00953 00954 bool mValid; 00956 bool mWritingEnabled; 00958 bool mDrawPixelRect; 00959 int mCurrentRow; 00960 int mNumPartImages; //number of part images 00961 int mNumRasterRowsPerPart; //number of (raster source) rows per part 00962 int mCurrentPartRasterMin; //minimum (raster source) row of current image 00963 int mCurrentPartRasterMax; //maximum (raster source) row of current image 00964 int mCurrentPartImageRow; //current image row 00965 int mNumCurrentImageRows; //number of image rows for the current part 00966 00967 int mCurrentPart; 00968 00969 //current memory image and gdal scan data 00970 QImage* mCurrentImage; 00971 void* mCurrentGDALData; 00972 }; 00973 00974 #endif