Add support for "bbox" URI parameter in PostgreSQL provider

.. and use it from TopoViewer DBManager plugin

Closes #18107
This commit is contained in:
Sandro Santilli 2019-08-27 14:45:10 +02:00
parent 81146a639d
commit d921c20f58
5 changed files with 22 additions and 3 deletions

View File

@ -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'))

View File

@ -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 )

View File

@ -39,6 +39,7 @@ class QgsPostgresFeatureSource : public QgsAbstractFeatureSource
QString mConnInfo;
QString mGeometryColumn;
QString mBoundingBoxColumn;
QString mSqlWhereClause;
QgsFields mFields;
QgsPostgresGeometryColumnType mSpatialColType;

View File

@ -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();

View File

@ -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