[GRASS] raster import: create link by r.external if crs are the same; link icon

This commit is contained in:
Radim Blazek 2015-05-21 18:04:12 +02:00
parent bb7943f38b
commit 8abe726c74
6 changed files with 157 additions and 32 deletions

View File

@ -56,6 +56,11 @@ extern "C"
#endif
}
#if GRASS_VERSION_MAJOR >= 7
#define G_get_gdal_link Rast_get_gdal_link
#define G_close_gdal_link Rast_close_gdal_link
#endif
#if !defined(GRASS_VERSION_MAJOR) || \
!defined(GRASS_VERSION_MINOR) || \
GRASS_VERSION_MAJOR<6 || \
@ -139,7 +144,7 @@ QString QgsGrassObject::elementName() const
return elementName( mType );
}
QString QgsGrassObject::elementName( Type type )
QString GRASS_LIB_EXPORT QgsGrassObject::elementName( Type type )
{
if ( type == Raster )
return "raster";
@ -156,7 +161,7 @@ QString QgsGrassObject::dirName() const
return dirName( mType );
}
QString QgsGrassObject::dirName( Type type )
QString GRASS_LIB_EXPORT QgsGrassObject::dirName( Type type )
{
if ( type == Raster )
return "cellhd";
@ -187,7 +192,7 @@ bool QgsGrassObject::mapsetIdentical( const QgsGrassObject &other ) const
return fi == otherFi;
}
QRegExp QgsGrassObject::newNameRegExp( Type type )
QRegExp GRASS_LIB_EXPORT QgsGrassObject::newNameRegExp( Type type )
{
QRegExp rx;
if ( type == QgsGrassObject::Vector )
@ -1852,7 +1857,7 @@ QMap<QString, QString> GRASS_LIB_EXPORT QgsGrass::query( QString gisdbase, QStri
return result;
}
void QgsGrass::renameObject( const QgsGrassObject & object, const QString& newName )
void GRASS_LIB_EXPORT QgsGrass::renameObject( const QgsGrassObject & object, const QString& newName )
{
QgsDebugMsg( "entered" );
QString cmd = "g.rename";
@ -1865,7 +1870,7 @@ void QgsGrass::renameObject( const QgsGrassObject & object, const QString& newNa
QgsGrass::runModule( object.gisdbase(), object.location(), object.mapset(), cmd, arguments, timeout, false );
}
void QgsGrass::copyObject( const QgsGrassObject & srcObject, const QgsGrassObject & destObject )
void GRASS_LIB_EXPORT QgsGrass::copyObject( const QgsGrassObject & srcObject, const QgsGrassObject & destObject )
{
QgsDebugMsg( "srcObject = " + srcObject.toString() );
QgsDebugMsg( "destObject = " + destObject.toString() );
@ -1886,7 +1891,7 @@ void QgsGrass::copyObject( const QgsGrassObject & srcObject, const QgsGrassObjec
QgsGrass::runModule( destObject.gisdbase(), destObject.location(), destObject.mapset(), cmd, arguments, timeout, false );
}
bool QgsGrass::deleteObject( const QgsGrassObject & object )
bool GRASS_LIB_EXPORT QgsGrass::deleteObject( const QgsGrassObject & object )
{
QgsDebugMsg( "entered" );
@ -1921,7 +1926,7 @@ bool QgsGrass::deleteObject( const QgsGrassObject & object )
return true;
}
bool QgsGrass::deleteObjectDialog( const QgsGrassObject & object )
bool GRASS_LIB_EXPORT QgsGrass::deleteObjectDialog( const QgsGrassObject & object )
{
QgsDebugMsg( "entered" );
@ -1930,7 +1935,7 @@ bool QgsGrass::deleteObjectDialog( const QgsGrassObject & object )
QMessageBox::Yes | QMessageBox::No ) == QMessageBox::Yes;
}
void QgsGrass::createTable( dbDriver *driver, const QString tableName, const QgsFields &fields )
void GRASS_LIB_EXPORT QgsGrass::createTable( dbDriver *driver, const QString tableName, const QgsFields &fields )
{
if ( !driver ) // should not happen
{
@ -1989,8 +1994,8 @@ void QgsGrass::createTable( dbDriver *driver, const QString tableName, const Qgs
}
}
void QgsGrass::insertRow( dbDriver *driver, const QString tableName,
const QgsAttributes& attributes )
void GRASS_LIB_EXPORT QgsGrass::insertRow( dbDriver *driver, const QString tableName,
const QgsAttributes& attributes )
{
if ( !driver ) // should not happen
{
@ -2052,6 +2057,24 @@ void QgsGrass::insertRow( dbDriver *driver, const QString tableName,
}
}
bool GRASS_LIB_EXPORT QgsGrass::isExternal( const QgsGrassObject & object )
{
if ( object.type() != QgsGrassObject::Raster )
{
return false;
}
bool isExternal = false;
QgsGrass::setLocation( object.gisdbase(), object.location() );
struct GDAL_link *gdal;
gdal = G_get_gdal_link( object.name().toUtf8().data(), object.mapset().toUtf8().data() );
if ( gdal )
{
isExternal = true;
G_close_gdal_link( gdal );
}
return isExternal;
}
// GRASS version constants have been changed on 26.4.2007
// http://freegis.org/cgi-bin/viewcvs.cgi/grass6/include/version.h.in.diff?r1=1.4&r2=1.5
// The following lines workaround this change

View File

@ -384,6 +384,9 @@ class QgsGrass
static GRASS_LIB_EXPORT void insertRow( dbDriver *driver, const QString tableName,
const QgsAttributes& attributes );
/** Returns true if object is link to external data (created by r.external) */
static GRASS_LIB_EXPORT bool isExternal( const QgsGrassObject & object );
//! Library version
static GRASS_LIB_EXPORT int versionMajor();
static GRASS_LIB_EXPORT int versionMinor();

View File

@ -495,3 +495,52 @@ QString QgsGrassCopy::srcDescription() const
{
return mSrcObject.toString();
}
//------------------------------ QgsGrassExternal ------------------------------------
QgsGrassExternal::QgsGrassExternal( const QString& gdalSource, const QgsGrassObject& destObject )
: QgsGrassImport( destObject )
, mSource( gdalSource )
{
}
QgsGrassExternal::~QgsGrassExternal()
{
}
bool QgsGrassExternal::import()
{
QgsDebugMsg( "entered" );
try
{
QString cmd = "r.external";
QStringList arguments;
if ( QFileInfo( mSource ).exists() )
{
arguments << "input=" + mSource;
}
else
{
arguments << "source=" + mSource;
}
arguments << "output=" + mGrassObject.name();
// TODO: best timeout
int timeout = -1;
// throws QgsGrass::Exception
QgsGrass::runModule( mGrassObject.gisdbase(), mGrassObject.location(), mGrassObject.mapset(), cmd, arguments, timeout, false );
}
catch ( QgsGrass::Exception &e )
{
setError( e.what() );
return false;
}
return true;
}
QString QgsGrassExternal::srcDescription() const
{
return mSource;
}

View File

@ -113,4 +113,20 @@ class GRASS_LIB_EXPORT QgsGrassCopy : public QgsGrassImport
};
// Creates link to GDAL data source with r.external
class GRASS_LIB_EXPORT QgsGrassExternal : public QgsGrassImport
{
Q_OBJECT
public:
// takes provider ownership
QgsGrassExternal( const QString& gdalSource, const QgsGrassObject& destObject );
~QgsGrassExternal();
bool import() override;
QString srcDescription() const override;
private:
QString mSource;
};
#endif // QGSGRASSIMPORT_H

View File

@ -159,7 +159,14 @@ QVector<QgsDataItem*> QgsGrassMapsetItem::createChildren()
QgsDebugMsg( "uri = " + uri );
QgsGrassObject rasterObject( mGisdbase, mLocation, mName, name, QgsGrassObject::Raster );
QgsGrassRasterItem *layer = new QgsGrassRasterItem( this, rasterObject, path, uri );
bool isExternal = false;
if ( QgsGrass::isExternal( rasterObject ) )
{
isExternal = true;
//rasterObject.setName( rasterObject.name() + " external" );
}
QgsGrassRasterItem *layer = new QgsGrassRasterItem( this, rasterObject, path, uri, QgsGrass::isExternal( rasterObject ) );
items.append( layer );
}
@ -348,24 +355,34 @@ bool QgsGrassMapsetItem::handleDrop( const QMimeData * data, Qt::DropAction )
QgsCoordinateReferenceSystem providerCrs = rasterProvider->crs();
QgsDebugMsg( "providerCrs = " + providerCrs.toWkt() );
QgsDebugMsg( "mapsetCrs = " + mapsetCrs.toWkt() );
if ( providerCrs.isValid() && mapsetCrs.isValid() && providerCrs != mapsetCrs )
{
QgsRasterProjector * projector = new QgsRasterProjector;
projector->setCRS( providerCrs, mapsetCrs );
if ( useSrcRegion )
{
projector->destExtentSize( rasterProvider->extent(), rasterProvider->xSize(), rasterProvider->ySize(),
newExtent, newXSize, newYSize );
}
pipe->set( projector );
}
QgsDebugMsg( "newExtent = " + newExtent.toString() );
QgsDebugMsg( QString( "newXSize = %1 newYSize = %2" ).arg( newXSize ).arg( newYSize ) );
QString path = mPath + "/" + "raster" + "/" + u.name;
QgsGrassObject rasterObject( mGisdbase, mLocation, mName, destName, QgsGrassObject::Raster );
import = new QgsGrassRasterImport( pipe, rasterObject, newExtent, newXSize, newYSize ); // takes pipe ownership
if ( providerCrs.isValid() && mapsetCrs.isValid() && providerCrs == mapsetCrs
&& rasterProvider->name() == "gdal" )
{
import = new QgsGrassExternal( rasterProvider->dataSourceUri(), rasterObject );
delete rasterProvider;
}
else
{
if ( providerCrs.isValid() && mapsetCrs.isValid() && providerCrs != mapsetCrs )
{
QgsRasterProjector * projector = new QgsRasterProjector;
projector->setCRS( providerCrs, mapsetCrs );
if ( useSrcRegion )
{
projector->destExtentSize( rasterProvider->extent(), rasterProvider->xSize(), rasterProvider->ySize(),
newExtent, newXSize, newYSize );
}
pipe->set( projector );
}
QgsDebugMsg( "newExtent = " + newExtent.toString() );
QgsDebugMsg( QString( "newXSize = %1 newYSize = %2" ).arg( newXSize ).arg( newYSize ) );
//QString path = mPath + "/" + "raster" + "/" + u.name;
import = new QgsGrassRasterImport( pipe, rasterObject, newExtent, newXSize, newYSize ); // takes pipe ownership
}
}
else if ( u.layerType == "vector" )
{
@ -610,11 +627,27 @@ QString QgsGrassVectorLayerItem::layerName() const
//----------------------- QgsGrassRasterItem ------------------------------
QgsGrassRasterItem::QgsGrassRasterItem( QgsDataItem* parent, QgsGrassObject grassObject,
QString path, QString uri )
QString path, QString uri, bool isExternal )
: QgsGrassObjectItem( parent, grassObject, grassObject.name(), path, uri, QgsLayerItem::Raster, "grassraster" )
, mExternal( isExternal )
{
}
QIcon QgsGrassRasterItem::icon()
{
static QIcon linkIcon;
if ( mExternal )
{
if ( linkIcon.isNull() )
{
linkIcon = QgsApplication::getThemeIcon( "/mIconRasterLink.svg" );
}
return linkIcon;
}
return QgsDataItem::icon();
}
//----------------------- QgsGrassImportItem ------------------------------
QgsGrassImportItem::QgsGrassImportItem( QgsDataItem* parent, const QString& name, const QString& path, QgsGrassImport* import )

View File

@ -130,12 +130,13 @@ class QgsGrassRasterItem : public QgsGrassObjectItem
Q_OBJECT
public:
QgsGrassRasterItem( QgsDataItem* parent, QgsGrassObject grassObject,
QString path, QString uri );
QString path, QString uri, bool isExternal );
//virtual QList<QAction*> actions() override;
virtual QIcon icon() override;
public slots:
//void deleteMap();
private:
// is external created by r.external
bool mExternal;
};
// item representing a layer being imported