Skip to content

Commit 9430a90

Browse files
committed
Added raster support to browser geopackage data items
1 parent 030b234 commit 9430a90

File tree

3 files changed

+83
-22
lines changed

3 files changed

+83
-22
lines changed

src/providers/ogr/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ QT5_WRAP_CPP(OGR_MOC_SRCS ${OGR_MOC_HDRS})
2626

2727
INCLUDE_DIRECTORIES(
2828
${CMAKE_SOURCE_DIR}/src/core
29+
${CMAKE_SOURCE_DIR}/src/core/raster
2930
${CMAKE_SOURCE_DIR}/src/core/geometry
3031
${CMAKE_SOURCE_DIR}/src/core/metadata
3132
${CMAKE_SOURCE_DIR}/src/core/symbology

src/providers/ogr/qgsgeopackagedataitems.cpp

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
#include "qgsgeopackageconnection.h"
1818
#include "qgslogger.h"
1919
#include "qgssettings.h"
20+
#include "qgsproject.h"
2021
#include "qgsvectorlayer.h"
22+
#include "qgsrasterlayer.h"
23+
#include "qgsnewgeopackagelayerdialog.h"
2124

2225
#include <QAction>
2326
#include <QMessageBox>
@@ -117,7 +120,9 @@ void QgsGeoPackageRootItem::newConnection()
117120

118121
void QgsGeoPackageRootItem::createDatabase()
119122
{
120-
// TODO
123+
QgsNewGeoPackageLayerDialog dialog( nullptr );
124+
dialog.setCrs( QgsProject::instance()->defaultCrsForNewLayers() );
125+
dialog.exec();
121126
}
122127

123128

@@ -132,10 +137,11 @@ QVector<QgsDataItem *> QgsGeoPackageConnectionItem::createChildren()
132137
{
133138
QVector<QgsDataItem *> children;
134139

140+
// Vector layers
135141
QgsVectorLayer layer( mPath, QStringLiteral( "ogr_tmp" ), QStringLiteral( "ogr" ) );
136142
if ( ! layer.isValid( ) )
137143
{
138-
children.append( new QgsErrorItem( this, tr( "Layer is not a valid GeoPackage layer" ), mPath + "/error" ) );
144+
QgsDebugMsgLevel( tr( "Layer is not a valid GeoPackage Vector layer %1" ).arg( mPath ), 3 );
139145
}
140146
else
141147
{
@@ -146,23 +152,34 @@ QVector<QgsDataItem *> QgsGeoPackageConnectionItem::createChildren()
146152
QString name = pieces[1];
147153
QString featuresCount = pieces[2];
148154
QString geometryType = pieces[3];
149-
QgsGeoPackageLayerItem::LayerType layerType;
155+
QgsLayerItem::LayerType layerType;
150156
layerType = layerTypeFromDb( geometryType );
151-
if ( layerType != QgsGeoPackageLayerItem::LayerType::NoType )
157+
if ( layerType != QgsLayerItem::LayerType::NoType )
152158
{
153-
// URI: '/path/gdal_sample_v1.2_no_extensions.gpkg|layerid=7|geometrytype=Point'
154-
QString uri = QStringLiteral( "%1|layerid=%2|geometrytype=%3" ).arg( mPath, layerId, QgsGeoPackageLayerItem::layerTypeAsString( layerTypeFromDb( geometryType ) ) );
155-
QgsGeoPackageLayerItem *item = new QgsGeoPackageLayerItem( this, name, mPath, uri, layerType );
156-
QgsDebugMsg( QStringLiteral( "Adding GPKG item %1 %2 %3" ).arg( name, uri, geometryType ) );
159+
// example URI: '/path/gdal_sample_v1.2_no_extensions.gpkg|layerid=7'
160+
QString uri = QStringLiteral( "%1|layerid=%2" ).arg( mPath, layerId );
161+
QgsGeoPackageVectorLayerItem *item = new QgsGeoPackageVectorLayerItem( this, name, mPath, uri, layerType );
162+
QgsDebugMsg( QStringLiteral( "Adding GPKG Vector item %1 %2 %3" ).arg( name, uri, geometryType ) );
157163
children.append( item );
158164
}
159165
else
160166
{
161-
children.append( new QgsErrorItem( this, tr( "Layer is not a supported GeoPackage layer geometry type: %1" ).arg( geometryType ), mPath + "/error" ) );
167+
QgsDebugMsgLevel( QStringLiteral( "Layer type is not a supported GeoPackage Vector layer %1" ).arg( mPath ), 3 );
162168
}
163169

164170
}
165171
}
172+
// Raster layers
173+
QgsRasterLayer rlayer( mPath, QStringLiteral( "gdal_tmp" ), QStringLiteral( "gdal" ), false );
174+
Q_FOREACH ( const QString &uri, rlayer.dataProvider()->subLayers( ) )
175+
{
176+
QStringList pieces = uri.split( ':' );
177+
QString name = pieces.value( pieces.length() - 1 );
178+
QgsDebugMsg( QStringLiteral( "Adding GPKG Raster item %1 %2 %3" ).arg( name, uri ) );
179+
QgsGeoPackageRasterLayerItem *item = new QgsGeoPackageRasterLayerItem( this, name, mPath, uri );
180+
children.append( item );
181+
182+
}
166183
return children;
167184

168185
}
@@ -184,38 +201,47 @@ QList<QAction *> QgsGeoPackageConnectionItem::actions()
184201
{
185202
QList<QAction *> lst;
186203

187-
QAction *actionRemoveConnection = new QAction( tr( "Remove connection" ), this );
188204
// TODO: implement layer deletion
205+
206+
//QAction *actionRemoveConnection = new QAction( tr( "Remove connection" ), this );
189207
// connect( actionDeleteLayer, &QAction::triggered, this, &QgsGeoPackageLayerItem::deleteLayer );
190-
lst.append( actionRemoveConnection );
208+
//lst.append( actionRemoveConnection );
191209
return lst;
192210
}
193211
#endif
194212

195213
QgsLayerItem::LayerType QgsGeoPackageConnectionItem::layerTypeFromDb( const QString &geometryType )
196214
{
197-
if ( QString::compare( geometryType, QStringLiteral( "Point" ), Qt::CaseInsensitive ) == 0 || QString::compare( geometryType, QStringLiteral( "MultiPoint" ), Qt::CaseInsensitive ) == 0 )
215+
if ( geometryType.contains( QStringLiteral( "Point" ), Qt::CaseInsensitive ) )
198216
{
199217
return QgsLayerItem::LayerType::Point;
200218
}
201-
else if ( QString::compare( geometryType, QStringLiteral( "Polygon" ), Qt::CaseInsensitive ) == 0 || QString::compare( geometryType, QStringLiteral( "MultiPolygon" ), Qt::CaseInsensitive ) == 0 )
219+
else if ( geometryType.contains( QStringLiteral( "Polygon" ), Qt::CaseInsensitive ) )
202220
{
203221
return QgsLayerItem::LayerType::Polygon;
204222
}
205-
else if ( QString::compare( geometryType, QStringLiteral( "LineString" ), Qt::CaseInsensitive ) == 0 || QString::compare( geometryType, QStringLiteral( "MultiLineString" ), Qt::CaseInsensitive ) == 0 )
223+
else if ( geometryType.contains( QStringLiteral( "LineString" ), Qt::CaseInsensitive ) )
206224
{
207225
return QgsLayerItem::LayerType::Line;
208226
}
227+
else if ( geometryType.contains( QStringLiteral( "Collection" ), Qt::CaseInsensitive ) )
228+
{
229+
return QgsLayerItem::LayerType::Vector;
230+
}
231+
else if ( geometryType.contains( QStringLiteral( "Table" ), Qt::CaseInsensitive ) )
232+
{
233+
return QgsLayerItem::LayerType::Table;
234+
}
209235
// To be moved in a parent class that would also work for gdal and rasters
210-
else if ( QString::compare( geometryType, QStringLiteral( "Raster" ), Qt::CaseInsensitive ) == 0 )
236+
else if ( geometryType.contains( QStringLiteral( "Raster" ), Qt::CaseInsensitive ) )
211237
{
212238
return QgsLayerItem::LayerType::Raster;
213239
}
214240
return QgsLayerItem::LayerType::NoType;
215241
}
216242

217243
#ifdef HAVE_GUI
218-
QList<QAction *> QgsGeoPackageLayerItem::actions()
244+
QList<QAction *> QgsGeoPackageAbstractLayerItem::actions()
219245
{
220246
QList<QAction *> lst;
221247

@@ -227,8 +253,21 @@ QList<QAction *> QgsGeoPackageLayerItem::actions()
227253
}
228254
#endif
229255

230-
QgsGeoPackageLayerItem::QgsGeoPackageLayerItem( QgsDataItem *parent, QString name, QString path, QString uri, QgsLayerItem::LayerType layerType )
231-
: QgsLayerItem( parent, name, path, uri, layerType, QStringLiteral( "ogr" ) )
256+
QgsGeoPackageAbstractLayerItem::QgsGeoPackageAbstractLayerItem( QgsDataItem *parent, QString name, QString path, QString uri, QgsLayerItem::LayerType layerType, QString providerKey )
257+
: QgsLayerItem( parent, name, path, uri, layerType, providerKey )
232258
{
233259
setState( Populated ); // no children are expected
234260
}
261+
262+
263+
QgsGeoPackageVectorLayerItem::QgsGeoPackageVectorLayerItem( QgsDataItem *parent, QString name, QString path, QString uri, LayerType layerType )
264+
: QgsGeoPackageAbstractLayerItem( parent, name, path, uri, layerType, QStringLiteral( "ogr" ) )
265+
{
266+
267+
}
268+
269+
QgsGeoPackageRasterLayerItem::QgsGeoPackageRasterLayerItem( QgsDataItem *parent, QString name, QString path, QString uri )
270+
: QgsGeoPackageAbstractLayerItem( parent, name, path, uri, QgsLayerItem::LayerType::Raster, QStringLiteral( "gdal" ) )
271+
{
272+
273+
}

src/providers/ogr/qgsgeopackagedataitems.h

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@
1919
#include "qgsdataitemprovider.h"
2020
#include "qgsdataprovider.h"
2121

22-
class QgsGeoPackageLayerItem : public QgsLayerItem
22+
/**
23+
* \brief The QgsGeoPackageAbstractLayerItem class is the base class for GeoPackage raster and vector layers
24+
*/
25+
class QgsGeoPackageAbstractLayerItem : public QgsLayerItem
2326
{
2427
Q_OBJECT
25-
public:
26-
QgsGeoPackageLayerItem( QgsDataItem *parent, QString name, QString path, QString uri, LayerType layerType );
28+
29+
protected:
30+
QgsGeoPackageAbstractLayerItem( QgsDataItem *parent, QString name, QString path, QString uri, LayerType layerType, QString providerKey );
2731

2832
#ifdef HAVE_GUI
2933
QList<QAction *> actions() override;
@@ -35,6 +39,23 @@ class QgsGeoPackageLayerItem : public QgsLayerItem
3539
#endif
3640
};
3741

42+
43+
class QgsGeoPackageRasterLayerItem : public QgsGeoPackageAbstractLayerItem
44+
{
45+
Q_OBJECT
46+
public:
47+
QgsGeoPackageRasterLayerItem( QgsDataItem *parent, QString name, QString path, QString uri );
48+
};
49+
50+
51+
class QgsGeoPackageVectorLayerItem : public QgsGeoPackageAbstractLayerItem
52+
{
53+
Q_OBJECT
54+
public:
55+
QgsGeoPackageVectorLayerItem( QgsDataItem *parent, QString name, QString path, QString uri, LayerType layerType );
56+
};
57+
58+
3859
class QgsGeoPackageConnectionItem : public QgsDataCollectionItem
3960
{
4061
Q_OBJECT
@@ -90,7 +111,7 @@ class QgsGeoPackageRootItem : public QgsDataCollectionItem
90111
};
91112

92113

93-
//! Provider for geopackage root data item
114+
//! Provider for geopackage data item
94115
class QgsGeoPackageDataItemProvider : public QgsDataItemProvider
95116
{
96117
public:

0 commit comments

Comments
 (0)