00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef QGSRASTERLAYER_H
00022 #define QGSRASTERLAYER_H
00023
00024
00025
00026
00027
00028 #include <QColor>
00029 #include <QDateTime>
00030 #include <QVector>
00031 #include <QList>
00032 #include <QMap>
00033 #include <QPair>
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
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
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,
00226 SingleBandPseudoColor,
00227 PalettedColor,
00228 PalettedSingleBandGray,
00229 PalettedSingleBandPseudoColor,
00230 PalettedMultiBandColor,
00231 MultiBandSingleGandGray,
00232
00233 MultiBandSingleBandGray = MultiBandSingleGandGray,
00234 MultiBandSingleBandPseudoColor,
00235 MultiBandColor,
00236 SingleBandColorDataStyle
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
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
00278
00279
00281 static QDateTime lastModified( const QString & name );
00282
00283
00285 static void registerGdalDrivers();
00286
00287
00288
00289
00290
00292 void init();
00293
00294
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
00403 Q_DECL_DEPRECATED bool usesProvider();
00404
00406 int width() { return mWidth; }
00407
00408
00409
00410
00412 unsigned int bandCount() const;
00413
00415 const QString bandName( int theBandNoInt );
00416
00420 int bandNumber( const QString & theBandName ) const;
00421
00423 const QgsRasterBandStats bandStatistics( int );
00424
00426 const QgsRasterBandStats bandStatistics( const QString & );
00427
00433 RasterPyramidList buildPyramidList();
00434
00436 QString colorShadingAlgorithmAsString() const;
00437
00439 void computeMinimumMaximumEstimates( int theBand, double* theMinMax );
00440
00442 void computeMinimumMaximumEstimates( QString theBand, double* theMinMax );
00443
00446 void computeMinimumMaximumEstimates( int theBand, double& theMin, double& theMax );
00447
00449 void computeMinimumMaximumFromLastExtent( int theBand, double* theMinMax );
00450
00452 void computeMinimumMaximumFromLastExtent( QString theBand, double* theMinMax );
00453
00456 void computeMinimumMaximumFromLastExtent( int theBand, double& theMin, double& theMax );
00457
00459 QgsContrastEnhancement* contrastEnhancement( unsigned int theBand );
00460
00461 const QgsContrastEnhancement* constContrastEnhancement( unsigned int theBand ) const;
00462
00464 bool copySymbologySettings( const QgsMapLayer& theOther );
00465
00467 QList<QgsColorRampShader::ColorRampItem>* colorTable( int theBandNoInt );
00468
00470 QgsRasterDataProvider* dataProvider();
00471
00473 const QgsRasterDataProvider* dataProvider() const;
00474
00477 virtual void reload();
00478
00480 bool draw( QgsRenderContext& rendererContext );
00481
00483 void draw( QPainter * theQPainter,
00484 QgsRasterViewPort * myRasterViewPort,
00485 const QgsMapToPixel* theQgsMapToPixel = 0 );
00486
00492 QString drawingStyleAsString() const;
00493
00495 bool hasCompatibleSymbology( const QgsMapLayer& theOther ) const;
00496
00498 bool hasStatistics( int theBandNoInt );
00499
00501 bool identify( const QgsPoint & point, QMap<QString, QString>& results );
00502
00504 QString identifyAsText( const QgsPoint & point );
00505
00509 QString identifyAsHtml( const QgsPoint & point );
00510
00512 bool isEditable() const;
00513
00515 QString lastError();
00516
00518 QString lastErrorTitle();
00519
00522 QList< QPair< QString, QColor > > legendSymbologyItems() const;
00523
00525 QPixmap legendAsPixmap();
00526
00528 QPixmap legendAsPixmap( bool );
00529
00531 QPixmap legendAsPixmap( int theLabelCount );
00532
00534 double maximumValue( unsigned int theBand );
00535
00537 double maximumValue( QString theBand );
00538
00540 QString metadata();
00541
00543 double minimumValue( unsigned int theBand );
00544
00546 double minimumValue( QString theBand );
00547
00549 QPixmap paletteAsPixmap( int theBandNumber = 1 );
00550
00554 QString providerType() const;
00555
00559 Q_DECL_DEPRECATED QString providerKey() const { return providerType(); }
00560
00562 double rasterUnitsPerPixel();
00563
00565
00566 bool readColorTable( int theBandNumber, QList<QgsColorRampShader::ColorRampItem>* theList );
00567
00569 void resetNoDataValue();
00570
00572 void setBlueBandName( const QString & theBandName );
00573
00575 void setColorShadingAlgorithm( QgsRasterLayer::ColorShadingAlgorithm theShaderAlgorithm );
00576
00578 void setColorShadingAlgorithm( QString theShaderAlgorithm );
00579
00581 void setContrastEnhancementAlgorithm( QgsContrastEnhancement::ContrastEnhancementAlgorithm theAlgorithm,
00582 bool theGenerateLookupTableFlag = true );
00583
00585 void setContrastEnhancementAlgorithm( QString theAlgorithm, bool theGenerateLookupTableFlag = true );
00586
00588 void setContrastEnhancementFunction( QgsContrastEnhancementFunction* theFunction );
00589
00591 void setDrawingStyle( const QString & theDrawingStyleQString );
00592
00594 void setGrayBandName( const QString & theBandName );
00595
00597 void setGreenBandName( const QString & theBandName );
00598
00600 void setMaximumValue( unsigned int theBand, double theValue, bool theGenerateLookupTableFlag = true );
00601
00603 void setMaximumValue( QString theBand, double theValue, bool theGenerateLookupTableFlag = true );
00604
00608 void setMinimumMaximumUsingLastExtent();
00609
00612 void setMinimumMaximumUsingDataset();
00613
00615 void setMinimumValue( unsigned int theBand, double theValue, bool theGenerateLookupTableFlag = true );
00616
00618 void setMinimumValue( QString theBand, double theValue, bool theGenerateLookupTableFlag = true );
00619
00621 void setNoDataValue( double theNoData );
00622
00625 void setRasterShaderFunction( QgsRasterShaderFunction* theFunction );
00626
00628 void setRedBandName( const QString & theBandName );
00629
00631 void setTransparentBandName( const QString & theBandName );
00632
00634 void showProgress( int theValue );
00635
00637 virtual QStringList subLayers() const;
00638
00640 void thumbnailAsPixmap( QPixmap * theQPixmap );
00644 void thumbnailAsImage( QImage * thepImage );
00645
00647 void triggerRepaint();
00648
00649
00650
00651
00658 virtual void setLayerOrder( const QStringList &layers );
00659
00663 virtual void setSubLayerVisibility( QString name, bool vis );
00664
00666 virtual QDateTime timestamp() const { return mDataProvider->timestamp() ; }
00667
00668 public slots:
00670 QString buildPyramids( const RasterPyramidList &,
00671 const QString & theResamplingMethod = "NEAREST",
00672 bool theTryInternalFlag = false );
00673
00676 void populateHistogram( int theBandNoInt,
00677 int theBinCountInt = 256,
00678 bool theIgnoreOutOfRangeFlag = true,
00679 bool theThoroughBandScanFlag = false );
00680
00681 void showStatusMessage( const QString & theMessage );
00682
00684 void updateProgress( int, int );
00685
00687 void onProgress( int, double, QString );
00688
00689 signals:
00691 void progressUpdate( int theValue );
00692
00697 void dataChanged();
00698
00699 protected:
00700
00702 bool readSymbology( const QDomNode& node, QString& errorMessage );
00703
00705 bool readXml( const QDomNode& layer_node );
00706
00708 bool writeSymbology( QDomNode&, QDomDocument& doc, QString& errorMessage ) const;
00709
00711 bool writeXml( QDomNode & layer_node, QDomDocument & doc );
00712
00713 private:
00714
00715
00716
00718 void drawSingleBandColorData( QPainter * theQPainter,
00719 QgsRasterViewPort * theRasterViewPort,
00720 const QgsMapToPixel* theQgsMapToPixel,
00721 int theBandNoInt );
00722
00724 void drawMultiBandColor( QPainter * theQPainter,
00725 QgsRasterViewPort * theRasterViewPort,
00726 const QgsMapToPixel* theQgsMapToPixel );
00727
00729 void drawMultiBandSingleBandGray( QPainter * theQPainter,
00730 QgsRasterViewPort * theRasterViewPort,
00731 const QgsMapToPixel* theQgsMapToPixel,
00732 int theBandNoInt );
00733
00735 void drawMultiBandSingleBandPseudoColor( QPainter * theQPainter,
00736 QgsRasterViewPort * theRasterViewPort,
00737 const QgsMapToPixel* theQgsMapToPixel,
00738 int theBandNoInt );
00739
00741 void drawPalettedSingleBandColor( QPainter * theQPainter,
00742 QgsRasterViewPort * theRasterViewPort,
00743 const QgsMapToPixel* theQgsMapToPixel,
00744 int theBandNoInt );
00745
00747 void drawPalettedSingleBandGray( QPainter * theQPainter,
00748 QgsRasterViewPort * theRasterViewPort,
00749 const QgsMapToPixel* theQgsMapToPixel,
00750 int theBandNoInt );
00751
00753 void drawPalettedSingleBandPseudoColor( QPainter * theQPainter,
00754 QgsRasterViewPort * theRasterViewPort,
00755 const QgsMapToPixel* theQgsMapToPixel,
00756 int theBandNoInt );
00757
00759 void drawPalettedMultiBandColor( QPainter * theQPainter,
00760 QgsRasterViewPort * theRasterViewPort,
00761 const QgsMapToPixel* theQgsMapToPixel,
00762 int theBandNoInt );
00763
00765 void drawSingleBandGray( QPainter * theQPainter,
00766 QgsRasterViewPort * theRasterViewPort,
00767 const QgsMapToPixel* theQgsMapToPixel,
00768 int theBandNoInt );
00769
00771 void drawSingleBandPseudoColor( QPainter * theQPainter,
00772 QgsRasterViewPort * theRasterViewPort,
00773 const QgsMapToPixel* theQgsMapToPixel,
00774 int theBandNoInt );
00775
00777 void closeDataProvider();
00778
00780 QString generateBandName( int );
00781
00783 bool hasBand( const QString & theBandName );
00784
00786 QString projectionWkt();
00787
00789
00790 void* readData( int bandNo, QgsRasterViewPort *viewPort );
00791
00793 bool readFile( const QString & fileName );
00794
00796
00797 inline double readValue( void *data, int type, int index );
00798
00800 bool update();
00801
00803 QString validateBandName( const QString & theBandName );
00804
00805
00806
00807
00809 const QString QSTRING_NOT_SET;
00810 const QString TRSTRING_NOT_SET;
00811
00813 int mBandCount;
00814
00816 QString mBlueBandName;
00817
00819 ColorShadingAlgorithm mColorShadingAlgorithm;
00820
00822 QgsContrastEnhancement::ContrastEnhancementAlgorithm mContrastEnhancementAlgorithm;
00823
00825 ContrastEnhancementList mContrastEnhancementList;
00826
00828 double mStandardDeviations;
00829
00831 QgsRasterDataProvider* mDataProvider;
00832
00833 DrawingStyle mDrawingStyle;
00834
00836 bool mEditable;
00837
00839 QString mError;
00840
00842 QString mErrorCaption;
00843
00845
00846
00848
00849
00851 double mGeoTransform[6];
00852
00854 QString mGrayBandName;
00855
00857 bool mGrayMinimumMaximumEstimated;
00858
00860 QString mGreenBandName;
00861
00863 bool mHasPyramids;
00864
00866 int mWidth;
00867
00869 int mHeight;
00870
00872 bool mInvertColor;
00873
00875 QDateTime mLastModified;
00876
00877 QgsRasterViewPort mLastViewPort;
00878
00880
00881
00883 bool mModified;
00884
00886 double mNoDataValue;
00887
00889 QString mProviderKey;
00890
00892 RasterPyramidList mPyramidList;
00893
00895 QgsRasterShader* mRasterShader;
00896
00898 RasterStatsList mRasterStatsList;
00899
00901 QgsRasterTransparency mRasterTransparency;
00902
00903 LayerType mRasterType;
00904
00906 QString mRedBandName;
00907
00909 bool mRGBMinimumMaximumEstimated;
00910
00912 QString mTransparencyBandName;
00913
00915 bool mUserDefinedGrayMinimumMaximum;
00916
00918 bool mUserDefinedRGBMinimumMaximum;
00919
00921 bool mValidNoDataValue;
00922
00924
00925 QStringList mLayers;
00926 QStringList mStyles;
00927 QString mFormat;
00928 QString mCrs;
00929 };
00930
00931
00932
00933
00934
00935
00936
00937
00938
00942 class CORE_EXPORT QgsRasterImageBuffer
00943 {
00944 public:
00945 QgsRasterImageBuffer( QgsRasterDataProvider *dataProvider, int bandNo, QPainter* p,
00946 QgsRasterViewPort* viewPort, const QgsMapToPixel* mapToPixel, double* mGeoTransform );
00947 ~QgsRasterImageBuffer();
00948 void reset( int maxPixelsInVirtualMemory = 5000000 );
00950 bool nextScanLine( QRgb** imageScanLine, void** rasterScanLine );
00951
00952 void setWritingEnabled( bool enabled ) { mWritingEnabled = enabled; }
00953
00954 private:
00955 QgsRasterImageBuffer();
00957 bool createNextPartImage();
00958
00960 void drawPixelRectangle();
00961
00962 QgsRasterDataProvider* mDataProvider;
00963 int mBandNo;
00964 QPainter* mPainter;
00965 QgsRasterViewPort* mViewPort;
00966 const QgsMapToPixel* mMapToPixel;
00967 double* mGeoTransform;
00968
00969 bool mValid;
00971 bool mWritingEnabled;
00973 bool mDrawPixelRect;
00974 int mCurrentRow;
00975 int mNumPartImages;
00976 int mNumRasterRowsPerPart;
00977 int mCurrentPartRasterMin;
00978 int mCurrentPartRasterMax;
00979 int mCurrentPartImageRow;
00980 int mNumCurrentImageRows;
00981
00982 int mCurrentPart;
00983
00984
00985 QImage* mCurrentImage;
00986 void* mCurrentGDALData;
00987 };
00988
00989 #endif