diff --git a/python/plugins/db_manager/db_plugins/postgis/plugins/qgis_topoview/__init__.py b/python/plugins/db_manager/db_plugins/postgis/plugins/qgis_topoview/__init__.py index d834ac25fa3..66846256ad4 100644 --- a/python/plugins/db_manager/db_plugins/postgis/plugins/qgis_topoview/__init__.py +++ b/python/plugins/db_manager/db_plugins/postgis/plugins/qgis_topoview/__init__.py @@ -121,11 +121,12 @@ def run(item, action, mainwindow): face_extent = layerFaceMbr.extent() # face geometry - sql = u'SELECT face_id, topology.ST_GetFaceGeometry(%s,' \ + sql = u'SELECT face_id, mbr, topology.ST_GetFaceGeometry(%s,' \ 'face_id)::geometry(polygon, %s) as geom ' \ 'FROM %s.face WHERE face_id > 0' % \ (quoteStr(toponame), toposrid, quoteId(toponame)) uri.setDataSource('', u'(%s\n)' % sql, 'geom', '', 'face_id') + uri.setParam('bbox', 'mbr') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Polygon) layerFaceGeom = QgsVectorLayer(uri.uri(False), u'%s.face' % toponame, provider) @@ -133,12 +134,13 @@ def run(item, action, mainwindow): layerFaceGeom.loadNamedStyle(os.path.join(template_dir, 'face.qml')) # face_seed - sql = u'SELECT face_id, ST_PointOnSurface(' \ + sql = u'SELECT face_id, mbr, ST_PointOnSurface(' \ 'topology.ST_GetFaceGeometry(%s,' \ 'face_id))::geometry(point, %s) as geom ' \ 'FROM %s.face WHERE face_id > 0' % \ (quoteStr(toponame), toposrid, quoteId(toponame)) uri.setDataSource('', u'(%s)' % sql, 'geom', '', 'face_id') + uri.setParam('bbox', 'mbr') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Point) layerFaceSeed = QgsVectorLayer(uri.uri(False), u'%s.face_seed' % toponame, provider) @@ -151,6 +153,7 @@ def run(item, action, mainwindow): # node uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') + uri.removeParam('bbox') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Point) layerNode = QgsVectorLayer(uri.uri(False), u'%s.node' % toponame, provider) @@ -161,6 +164,7 @@ def run(item, action, mainwindow): uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Point) + uri.removeParam('bbox') layerNodeLabel = QgsVectorLayer(uri.uri(False), u'%s.node_id' % toponame, provider) layerNodeLabel.setExtent(node_extent) layerNodeLabel.loadNamedStyle(os.path.join(template_dir, 'node_label.qml')) @@ -171,6 +175,7 @@ def run(item, action, mainwindow): uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) + uri.removeParam('bbox') layerEdge = QgsVectorLayer(uri.uri(False), u'%s.edge' % toponame, provider) edge_extent = layerEdge.extent() @@ -178,6 +183,7 @@ def run(item, action, mainwindow): uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) + uri.removeParam('bbox') layerDirectedEdge = QgsVectorLayer(uri.uri(False), u'%s.directed_edge' % toponame, provider) layerDirectedEdge.setExtent(edge_extent) layerDirectedEdge.loadNamedStyle(os.path.join(template_dir, 'edge.qml')) @@ -186,6 +192,7 @@ def run(item, action, mainwindow): uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) + uri.removeParam('bbox') layerEdgeLabel = QgsVectorLayer(uri.uri(False), u'%s.edge_id' % toponame, provider) layerEdgeLabel.setExtent(edge_extent) layerEdgeLabel.loadNamedStyle(os.path.join(template_dir, 'edge_label.qml')) @@ -194,6 +201,7 @@ def run(item, action, mainwindow): uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) + uri.removeParam('bbox') layerFaceLeft = QgsVectorLayer(uri.uri(False), u'%s.face_left' % toponame, provider) layerFaceLeft.setExtent(edge_extent) layerFaceLeft.loadNamedStyle(os.path.join(template_dir, 'face_left.qml')) @@ -202,6 +210,7 @@ def run(item, action, mainwindow): uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) + uri.removeParam('bbox') layerFaceRight = QgsVectorLayer(uri.uri(False), u'%s.face_right' % toponame, provider) layerFaceRight.setExtent(edge_extent) layerFaceRight.loadNamedStyle(os.path.join(template_dir, 'face_right.qml')) @@ -210,6 +219,7 @@ def run(item, action, mainwindow): uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) + uri.removeParam('bbox') layerNextLeft = QgsVectorLayer(uri.uri(False), u'%s.next_left' % toponame, provider) layerNextLeft.setExtent(edge_extent) layerNextLeft.loadNamedStyle(os.path.join(template_dir, 'next_left.qml')) @@ -218,6 +228,7 @@ def run(item, action, mainwindow): uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) + uri.removeParam('bbox') layerNextRight = QgsVectorLayer(uri.uri(False), u'%s.next_right' % toponame, provider) layerNextRight.setExtent(edge_extent) layerNextRight.loadNamedStyle(os.path.join(template_dir, 'next_right.qml')) diff --git a/src/providers/postgres/qgspostgresfeatureiterator.cpp b/src/providers/postgres/qgspostgresfeatureiterator.cpp index 0c19a5d2393..e9d81b8aa0d 100644 --- a/src/providers/postgres/qgspostgresfeatureiterator.cpp +++ b/src/providers/postgres/qgspostgresfeatureiterator.cpp @@ -457,7 +457,7 @@ QString QgsPostgresFeatureIterator::whereClauseRect() mSource->mSpatialColType == SctPcPatch; QString whereClause = QStringLiteral( "%1%2 && %3" ) - .arg( QgsPostgresConn::quotedIdentifier( mSource->mGeometryColumn ), + .arg( QgsPostgresConn::quotedIdentifier( mSource->mBoundingBoxColumn ), castToGeometry ? "::geometry" : "", qBox ); @@ -857,6 +857,7 @@ void QgsPostgresFeatureIterator::getFeatureAttribute( int idx, QgsPostgresResult QgsPostgresFeatureSource::QgsPostgresFeatureSource( const QgsPostgresProvider *p ) : mConnInfo( p->mUri.connectionInfo( false ) ) , mGeometryColumn( p->mGeometryColumn ) + , mBoundingBoxColumn( p->mBoundingBoxColumn ) , mSqlWhereClause( p->filterWhereClause() ) , mFields( p->mAttributeFields ) , mSpatialColType( p->mSpatialColType ) diff --git a/src/providers/postgres/qgspostgresfeatureiterator.h b/src/providers/postgres/qgspostgresfeatureiterator.h index baa4b6bb3a8..7d96b1681f9 100644 --- a/src/providers/postgres/qgspostgresfeatureiterator.h +++ b/src/providers/postgres/qgspostgresfeatureiterator.h @@ -39,6 +39,7 @@ class QgsPostgresFeatureSource : public QgsAbstractFeatureSource QString mConnInfo; QString mGeometryColumn; + QString mBoundingBoxColumn; QString mSqlWhereClause; QgsFields mFields; QgsPostgresGeometryColumnType mSpatialColType; diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp index fa7a5011991..56143719b8c 100644 --- a/src/providers/postgres/qgspostgresprovider.cpp +++ b/src/providers/postgres/qgspostgresprovider.cpp @@ -105,6 +105,11 @@ QgsPostgresProvider::QgsPostgresProvider( QString const &uri, const ProviderOpti mSchemaName = mUri.schema(); mTableName = mUri.table(); mGeometryColumn = mUri.geometryColumn(); + mBoundingBoxColumn = mUri.param( "bbox" ); + if ( mBoundingBoxColumn.isEmpty() ) + { + mBoundingBoxColumn = mGeometryColumn; + } mSqlWhereClause = mUri.sql(); mRequestedSrid = mUri.srid(); mRequestedGeomType = mUri.wkbType(); diff --git a/src/providers/postgres/qgspostgresprovider.h b/src/providers/postgres/qgspostgresprovider.h index 159d5ab491e..a2658a29187 100644 --- a/src/providers/postgres/qgspostgresprovider.h +++ b/src/providers/postgres/qgspostgresprovider.h @@ -381,6 +381,7 @@ class QgsPostgresProvider : public QgsVectorDataProvider QString mPrimaryKeyDefault; QString mGeometryColumn; //!< Name of the geometry column + QString mBoundingBoxColumn; //!< Name of the bounding box column mutable QgsRectangle mLayerExtent; //!< Rectangle that contains the extent (bounding box) of the layer QgsWkbTypes::Type mDetectedGeomType = QgsWkbTypes::Unknown ; //!< Geometry type detected in the database