31 #define ERR(message) QgsError(message, "Raster provider") 47 QgsDebugMsgLevel(
QString(
"theBandNo = %1 theWidth = %2 theHeight = %3" ).arg( theBandNo ).arg( theWidth ).arg( theHeight ), 4 );
76 double xRes = theExtent.
width() / theWidth;
77 double yRes = theExtent.
height() / theHeight;
78 double tmpXRes, tmpYRes;
79 double providerXRes = 0;
80 double providerYRes = 0;
85 tmpXRes = qMax( providerXRes, xRes );
86 tmpYRes = qMax( providerYRes, yRes );
96 if ( tmpExtent != theExtent ||
97 tmpXRes > xRes || tmpYRes > yRes )
101 if ( !
extent().contains( theExtent ) )
108 int fromRow = qRound(( theExtent.
yMaximum() - tmpExtent.
yMaximum() ) / yRes );
109 int toRow = qRound(( theExtent.
yMaximum() - tmpExtent.
yMinimum() ) / yRes ) - 1;
110 int fromCol = qRound(( tmpExtent.
xMinimum() - theExtent.
xMinimum() ) / xRes );
111 int toCol = qRound(( tmpExtent.
xMaximum() - theExtent.
xMinimum() ) / xRes ) - 1;
113 QgsDebugMsgLevel(
QString(
"fromRow = %1 toRow = %2 fromCol = %3 toCol = %4" ).arg( fromRow ).arg( toRow ).arg( fromCol ).arg( toCol ), 4 );
115 if ( fromRow < 0 || fromRow >= theHeight || toRow < 0 || toRow >= theHeight ||
116 fromCol < 0 || fromCol >= theWidth || toCol < 0 || toCol >= theWidth )
119 QgsDebugMsg(
"Row or column limits out of range" );
125 if ( tmpXRes > xRes )
132 if ( tmpYRes > yRes )
134 int row = floor((
extent().yMaximum() - tmpExtent.
yMaximum() ) / providerYRes );
136 row = ceil((
extent().yMaximum() - tmpExtent.
yMinimum() ) / providerYRes );
139 int tmpWidth = qRound( tmpExtent.
width() / tmpXRes );
140 int tmpHeight = qRound( tmpExtent.
height() / tmpYRes );
141 tmpXRes = tmpExtent.
width() / tmpWidth;
142 tmpYRes = tmpExtent.
height() / tmpHeight;
144 QgsDebugMsgLevel(
QString(
"Reading smaller block tmpWidth = %1 theHeight = %2" ).arg( tmpWidth ).arg( tmpHeight ), 4 );
157 readBlock( theBandNo, tmpExtent, tmpWidth, tmpHeight, tmpBlock->
bits() );
163 double tmpXMin = tmpExtent.
xMinimum();
164 double tmpYMax = tmpExtent.
yMaximum();
166 for (
int row = fromRow; row <= toRow; row++ )
168 double y = yMax - ( row + 0.5 ) * yRes;
169 int tmpRow = floor(( tmpYMax - y ) / tmpYRes );
171 for (
int col = fromCol; col <= toCol; col++ )
173 double x = xMin + ( col + 0.5 ) * xRes;
174 int tmpCol = floor(( x - tmpXMin ) / tmpXRes );
176 if ( tmpRow < 0 || tmpRow >= tmpHeight || tmpCol < 0 || tmpCol >= tmpWidth )
178 QgsDebugMsg(
"Source row or column limits out of range" );
184 qgssize tmpIndex =
static_cast< qgssize >( tmpRow ) * static_cast< qgssize >( tmpWidth ) + tmpCol;
187 char *tmpBits = tmpBlock->
bits( tmpIndex );
188 char *bits = block->
bits( index );
191 QgsDebugMsg(
QString(
"Cannot get input block data tmpRow = %1 tmpCol = %2 tmpIndex = %3." ).arg( tmpRow ).arg( tmpCol ).arg( tmpIndex ) );
199 memcpy( bits, tmpBits, pixelSize );
207 readBlock( theBandNo, theExtent, theWidth, theHeight, block->
bits() );
241 for (
qgssize i = 0; stringList[i]; ++i )
243 strings.
append( stringList[i] );
252 return "<p>\n" + value +
"</p>\n";
290 if ( !
extent().contains( thePoint ) )
293 for (
int bandNo = 1; bandNo <=
bandCount(); bandNo++ )
307 if ( theHeight == 0 )
313 double xres = ( myExtent.
width() ) / theWidth;
314 double yres = ( myExtent.
height() ) / theHeight;
316 int col =
static_cast< int >( floor(( thePoint.
x() - myExtent.
xMinimum() ) / xres ) );
317 int row =
static_cast< int >( floor(( myExtent.
yMaximum() - thePoint.
y() ) / yres ) );
319 double xMin = myExtent.
xMinimum() + col * xres;
320 double xMax = xMin + xres;
321 double yMax = myExtent.
yMaximum() - row * yres;
322 double yMin = yMax - yres;
331 double value = myBlock->
value( 0 );
333 results.
insert( i, value );
353 if ( pPyramidResamplingMethods )
358 QgsDebugMsg(
"provider pyramidResamplingMethods returned no methods" );
367 QgsDebugMsg(
"Could not resolve pyramidResamplingMethods provider library" );
380 for ( myRasterPyramidIterator = myPyramidList.
begin();
381 myRasterPyramidIterator != myPyramidList.
end();
382 ++myRasterPyramidIterator )
384 if ( myRasterPyramidIterator->exists )
432 const QString& format,
int nBands,
434 int width,
int height,
double* geoTransform,
441 QgsDebugMsg(
"Cannot resolve 'create' function in " + providerKey +
" provider" );
446 return createFn( uri, format, nBands, type, width, height, geoTransform, crs, createOptions );
471 return tr(
"Value" );
477 return tr(
"Feature" );
bool hasPyramids()
Returns true if raster has at least one populated histogram.
virtual int bandCount() const =0
Get number of bands.
virtual void readBlock(int bandNo, int xBlock, int yBlock, void *data)
Read block of data.
static QgsProviderRegistry * instance(const QString &pluginPath=QString::null)
Means of accessing canonical single instance.
A rectangle specified with double values.
bool isEmpty() const
test if rectangle is empty.
void copyBaseSettings(const QgsRasterDataProvider &other)
Copy member variables from other raster data provider.
static QgsRasterDataProvider * create(const QString &providerKey, const QString &uri, const QString &format, int nBands, QGis::DataType type, int width, int height, double *geoTransform, const QgsCoordinateReferenceSystem &crs, const QStringList &createOptions=QStringList())
Creates a new dataset with mDataSourceURI.
static bool contains(double value, const QgsRasterRangeList &rangeList)
Test if value is within the list of ranges.
void setXMaximum(double x)
Set the maximum x value.
double yMaximum() const
Get the y maximum value (top side of rectangle)
virtual QgsCoordinateReferenceSystem crs()=0
Get the QgsCoordinateReferenceSystem for this layer.
void applyNoDataValues(const QgsRasterRangeList &rangeList)
virtual double bandOffset(int bandNo) const
Read band offset for raster value.
virtual void setUseSrcNoDataValue(int bandNo, bool use)
Set source nodata value usage.
virtual double srcNoDataValue(int bandNo) const
Value representing no data value.
static QString makeTableCell(const QString &value)
Capability
If you add to this, please also add to capabilitiesString()
static Capability identifyFormatToCapability(QgsRaster::IdentifyFormat format)
virtual QgsRasterRangeList userNoDataValues(int bandNo) const
Get list of user no data value ranges.
Abstract base class for spatial data provider implementations.
QString tr(const char *sourceText, const char *disambiguation, int n)
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
double x() const
Get the x value of the point.
virtual int ySize() const
static QString identifyFormatName(QgsRaster::IdentifyFormat format)
bool setIsNoData(int row, int column)
Set no data on pixel.
virtual bool useSrcNoDataValue(int bandNo) const
Get source nodata value usage.
virtual QString lastErrorFormat()
Returns the format of the error text for the last error in this provider.
Raster identify results container.
virtual QgsRasterIdentifyResult identify(const QgsPoint &thePoint, QgsRaster::IdentifyFormat theFormat, const QgsRectangle &theExtent=QgsRectangle(), int theWidth=0, int theHeight=0)
Identify raster value(s) found on the point position.
void append(const T &value)
double yMinimum() const
Get the y minimum value (bottom side of rectangle)
double xMaximum() const
Get the x maximum value (right side of rectangle)
#define QgsDebugMsgLevel(str, level)
virtual QList< QgsRasterPyramid > buildPyramidList(QList< int > overviewList=QList< int >())
Accessor for ths raster layers pyramid list.
static QgsRaster::IdentifyFormat identifyFormatFromName(const QString &formatName)
double value(int row, int column) const
Read a single value if type of block is numeric.
void setYMinimum(double y)
Set the minimum y value.
QList< QgsRasterHistogram > mHistograms
List of cached histograms, all bands mixed.
QList< bool > mSrcHasNoDataValue
Source no data value exists.
bool setIsNoDataExcept(QRect theExceptRect)
Set the whole block to no data except specified rectangle.
virtual QgsRasterBlock * block(int theBandNo, const QgsRectangle &theExtent, int theWidth, int theHeight) override
Read block of data using given extent and size.
Base class for processing filters like renderers, reprojector, resampler etc.
A class to represent a point.
QgsRasterDataProvider * createFunction_t(const QString &, const QString &, int, QGis::DataType, int, int, double *, const QgsCoordinateReferenceSystem &, QStringList)
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
bool userNoDataValuesContains(int bandNo, double value) const
Returns true if user no data contains value.
QList< double > mSrcNoDataValue
Source no data value is available and is set to be used or internal no data is available.
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
virtual double bandScale(int bandNo) const
Read band scale for raster value.
static QList< QPair< QString, QString > > pyramidResamplingMethods(const QString &providerKey)
Returns a list of pyramid resampling method name and label pairs for given provider.
QList< QPair< QString, QString > > * pyramidResamplingMethods_t()
virtual QgsRectangle extent() override=0
Get the extent of the data source.
virtual QGis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
char * bits(int row, int column)
Get pointer to data.
QList< QgsRasterRange > QgsRasterRangeList
virtual int xSize() const
Get raster size.
void applyScaleOffset(double scale, double offset)
Apply band scale and offset to raster block values @note added in 2.3.
void setYMaximum(double y)
Set the maximum y value.
virtual QString metadata()=0
Get metadata in a format suitable for feeding directly into a subset of the GUI raster properties "Me...
QgsRectangle intersect(const QgsRectangle *rect) const
return the intersection with the given rectangle
static QString makeTableCells(const QStringList &values)
Class for storing a coordinate reference system (CRS)
DataType
Raster data types.
int dataTypeSize(int bandNo)
double y() const
Get the y value of the point.
static QStringList cStringList2Q_(char **stringList)
iterator insert(const Key &key, const T &value)
void(*)() cast_to_fptr(void *p)
virtual bool srcHasNoDataValue(int bandNo) const
Return true if source band has no data value.
QList< QgsRasterBandStats > mStatistics
List of cached statistics, all bands mixed.
static QRect subRect(const QgsRectangle &theExtent, int theWidth, int theHeight, const QgsRectangle &theSubExtent)
For theExtent and theWidht, theHeight find rectangle covered by subextent.
double width() const
Width of the rectangle.
virtual void setUserNoDataValue(int bandNo, const QgsRasterRangeList &noData)
QString toString(bool automaticPrecision=false) const
returns string representation of form xmin,ymin xmax,ymax
double xMinimum() const
Get the x minimum value (left side of rectangle)
static QString identifyFormatLabel(QgsRaster::IdentifyFormat format)
void setXMinimum(double x)
Set the minimum x value.
double height() const
Height of the rectangle.
bool isEmpty() const
Returns true if block is empty, i.e.
Base class for raster data providers.
QList< QgsRasterRangeList > mUserNoDataValue
List of lists of user defined additional no data values for each band, indexed from 0...
QList< bool > mUseSrcNoDataValue
Use source nodata value.