Skip to content

Commit

Permalink
PG raster: faster band data lookup
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso committed Jan 15, 2020
1 parent e9b58cc commit 39cc6ba
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 10 deletions.
4 changes: 2 additions & 2 deletions src/providers/postgres/raster/qgspostgresrasterprovider.cpp
Expand Up @@ -434,8 +434,8 @@ bool QgsPostgresRasterProvider::readBlock( int bandNo, const QgsRectangle &viewE
const QgsRectangle &tilesExtent { tileResponse.extent };

// Prepare tmp output raster
const int tmpWidth = static_cast<int>( std::round( tilesExtent.width() / tileResponse.tiles.first().scaleX ) );
const int tmpHeight = static_cast<int>( std::round( tilesExtent.height() / std::fabs( tileResponse.tiles.first().scaleY ) ) );
const int tmpWidth = static_cast<int>( tilesExtent.width() / tileResponse.tiles.first().scaleX );
const int tmpHeight = static_cast<int>( tilesExtent.height() / std::fabs( tileResponse.tiles.first().scaleY ) );

GDALDataType gdalDataType { static_cast<GDALDataType>( sourceDataType( bandNo ) ) };

Expand Down
25 changes: 19 additions & 6 deletions src/providers/postgres/raster/qgspostgresrastershareddata.cpp
Expand Up @@ -17,6 +17,9 @@
#include <QDebug>
#include <QObject>

#include "cpl_string.h"
#include "gdal.h"

#include "qgspostgresrastershareddata.h"
#include "qgspostgresrasterutils.h"
#include "qgspostgresconn.h"
Expand Down Expand Up @@ -73,7 +76,7 @@ QgsPostgresRasterSharedData::TilesResponse QgsPostgresRasterSharedData::tiles( c
// Get intersecting tiles from the index
mSpatialIndexes[ request.overviewFactor ]->intersects( request.extent, [ & ]( Tile * tilePtr ) -> bool
{
if ( tilePtr->data.isEmpty() )
if ( tilePtr->data.size() == 0 )
{
missingTileIds.push_back( QStringLiteral( "'%1'" ).arg( tilePtr->tileId ) );
}
Expand Down Expand Up @@ -129,7 +132,10 @@ QgsPostgresRasterSharedData::TilesResponse QgsPostgresRasterSharedData::tiles( c
.arg( sql ), QObject::tr( "PostGIS" ), Qgis::Critical );
}

Tile const *tilePtr { setTileData( request.overviewFactor, tileId, QByteArray::fromHex( dataResult.PQgetvalue( row, 1 ).toAscii() ) ) };
int dataRead;
GByte *binaryData { CPLHexToBinary( dataResult.PQgetvalue( row, 1 ).toAscii().constData(), &dataRead ) };
Tile const *tilePtr { setTileData( request.overviewFactor, tileId, QByteArray::fromRawData( reinterpret_cast<char *>( binaryData ), dataRead ) ) };
CPLFree( binaryData );

if ( ! tilePtr )
{
Expand Down Expand Up @@ -174,8 +180,14 @@ QgsPostgresRasterSharedData::Tile const *QgsPostgresRasterSharedData::setTileDat
{
return nullptr;
}
mTiles[ overviewFactor ][ tileId ]->data = data;
return mTiles[ overviewFactor ][ tileId ].get();

Tile *const tile { mTiles[ overviewFactor ][ tileId ].get() };
const QVariantMap parsedData { QgsPostgresRasterUtils::parseWkb( data ) };
for ( int bandCnt = 1; bandCnt <= tile->numBands; ++bandCnt )
{
tile->data.emplace_back( parsedData[ QStringLiteral( "band%1" ).arg( bandCnt ) ].toByteArray() );
}
return tile;
}

bool QgsPostgresRasterSharedData::fetchTilesIndex( const QgsGeometry &requestPolygon, const TilesRequest &request )
Expand Down Expand Up @@ -259,7 +271,8 @@ QgsPostgresRasterSharedData::Tile::Tile( const QgsPostgresRasterSharedData::Tile

}

QByteArray QgsPostgresRasterSharedData::Tile::bandData( int bandNo ) const
const QByteArray QgsPostgresRasterSharedData::Tile::bandData( int bandNo ) const
{
return QgsPostgresRasterUtils::parseWkb( data, bandNo )[ QStringLiteral( "band%1" ).arg( bandNo )].toByteArray();
Q_ASSERT( 0 < bandNo && bandNo <= static_cast<int>( data.size() ) );
return data.at( static_cast<unsigned int>( bandNo ) - 1 );
}
4 changes: 2 additions & 2 deletions src/providers/postgres/raster/qgspostgresrastershareddata.h
Expand Up @@ -125,11 +125,11 @@ class QgsPostgresRasterSharedData
/**
* Returns data for specified \a bandNo
*/
QByteArray bandData( int bandNo ) const;
const QByteArray bandData( int bandNo ) const;

private:

QByteArray data;
std::vector<QByteArray> data;

friend class QgsPostgresRasterSharedData;

Expand Down

0 comments on commit 39cc6ba

Please sign in to comment.