def testReadExtentOnTable(self): # vector layer based on a standard table vl0 = QgsVectorLayer(self.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POLYGON table="qgis_test"."some_poly_data" (geom) sql=', 'test', 'postgres') self.assertTrue(vl0.isValid()) self.assertTrue(vl0.dataProvider().hasMetadata()) # set a custom extent originalExtent = vl0.extent() customExtent = QgsRectangle(-80, 80, -70, 90) vl0.setExtent(customExtent) # write xml doc = QDomDocument("testdoc") elem = doc.createElement("maplayer") self.assertTrue(vl0.writeLayerXml(elem, doc, QgsReadWriteContext())) # read xml with the custom extent. It should not be used by default vl1 = QgsVectorLayer() vl1.readLayerXml(elem, QgsReadWriteContext()) self.assertTrue(vl1.isValid()) self.assertEqual(vl1.extent(), originalExtent) # read xml with custom extent with readExtent option. Extent read from # xml document should NOT be used because we don't have a view or a # materialized view vl2 = QgsVectorLayer() vl2.setReadExtentFromXml(True) vl2.readLayerXml(elem, QgsReadWriteContext()) self.assertTrue(vl2.isValid()) self.assertEqual(vl2.extent(), originalExtent)
def testReadExtentOnView(self): # vector layer based on view vl0 = QgsVectorLayer( self.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POLYGON table="qgis_test"."some_poly_data_view" (geom) sql=', 'test', 'postgres') self.assertTrue(vl0.isValid()) self.assertFalse(vl0.dataProvider().hasMetadata()) # set a custom extent originalExtent = vl0.extent() customExtent = QgsRectangle(-80, 80, -70, 90) vl0.setExtent(customExtent) # write xml doc = QDomDocument("testdoc") elem = doc.createElement("maplayer") self.assertTrue(vl0.writeLayerXml(elem, doc, QgsReadWriteContext())) # read xml with the custom extent. It should not be used by default vl1 = QgsVectorLayer() vl1.readLayerXml(elem, QgsReadWriteContext()) self.assertTrue(vl1.isValid()) self.assertEqual(vl1.extent(), originalExtent) # read xml with custom extent with readExtent option. Extent read from # xml document should be used because we have a view vl2 = QgsVectorLayer() vl2.setReadExtentFromXml(True) vl2.readLayerXml(elem, QgsReadWriteContext()) self.assertTrue(vl2.isValid()) self.assertEqual(vl2.extent(), customExtent) # but a force update on extent should allow retrieveing the data # provider extent vl2.updateExtents() vl2.readLayerXml(elem, QgsReadWriteContext()) self.assertEqual(vl2.extent(), customExtent) vl2.updateExtents(force=True) vl2.readLayerXml(elem, QgsReadWriteContext()) self.assertEqual(vl2.extent(), originalExtent)
def testReadExtentOnView(self): # vector layer based on view vl0 = QgsVectorLayer(self.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POLYGON table="qgis_test"."some_poly_data_view" (geom) sql=', 'test', 'postgres') self.assertTrue(vl0.isValid()) self.assertFalse(vl0.dataProvider().hasMetadata()) # set a custom extent originalExtent = vl0.extent() customExtent = QgsRectangle(-80, 80, -70, 90) vl0.setExtent(customExtent) # write xml doc = QDomDocument("testdoc") elem = doc.createElement("maplayer") self.assertTrue(vl0.writeLayerXml(elem, doc, QgsReadWriteContext())) # read xml with the custom extent. It should not be used by default vl1 = QgsVectorLayer() vl1.readLayerXml(elem, QgsReadWriteContext()) self.assertTrue(vl1.isValid()) self.assertEqual(vl1.extent(), originalExtent) # read xml with custom extent with readExtent option. Extent read from # xml document should be used because we have a view vl2 = QgsVectorLayer() vl2.setReadExtentFromXml(True) vl2.readLayerXml(elem, QgsReadWriteContext()) self.assertTrue(vl2.isValid()) self.assertEqual(vl2.extent(), customExtent) # but a force update on extent should allow retrieveing the data # provider extent vl2.updateExtents() vl2.readLayerXml(elem, QgsReadWriteContext()) self.assertEqual(vl2.extent(), customExtent) vl2.updateExtents(force=True) vl2.readLayerXml(elem, QgsReadWriteContext()) self.assertEqual(vl2.extent(), originalExtent)
def run(item, action, mainwindow): db = item.database() uri = db.uri() iface = mainwindow.iface quoteId = db.connector.quoteId quoteStr = db.connector.quoteString # check if the selected item is a topology schema isTopoSchema = False if not hasattr(item, 'schema'): mainwindow.infoBar.pushMessage("Invalid topology", u'Select a topology schema to continue.', QgsMessageBar.INFO, mainwindow.iface.messageTimeout()) return False if item.schema() is not None: sql = u"SELECT srid FROM topology.topology WHERE name = %s" % quoteStr(item.schema().name) c = db.connector._get_cursor() db.connector._execute(c, sql) res = db.connector._fetchone(c) isTopoSchema = res is not None if not isTopoSchema: mainwindow.infoBar.pushMessage("Invalid topology", u'Schema "{0}" is not registered in topology.topology.'.format( item.schema().name), QgsMessageBar.WARNING, mainwindow.iface.messageTimeout()) return False if (res[0] < 0): mainwindow.infoBar.pushMessage("WARNING", u'Topology "{0}" is registered as having a srid of {1} in topology.topology, we will assume 0 (for unknown)'.format(item.schema().name, res[0]), QgsMessageBar.WARNING, mainwindow.iface.messageTimeout()) toposrid = '0' else: toposrid = unicode(res[0]) # load layers into the current project toponame = item.schema().name template_dir = os.path.join(current_path, 'templates') registry = QgsMapLayerRegistry.instance() legend = iface.legendInterface() # do not refresh the canvas until all the layers are added prevRenderFlagState = iface.mapCanvas().renderFlag() iface.mapCanvas().setRenderFlag(False) try: supergroup = legend.addGroup(u'Topology "%s"' % toponame, False) provider = db.dbplugin().providerName() uri = db.uri() # FACES group = legend.addGroup(u'Faces', False, supergroup) # face mbr uri.setDataSource(toponame, 'face', 'mbr', '', 'face_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBPolygon) layer = QgsVectorLayer(uri.uri(), u'%s.face_mbr' % toponame, provider) layer.loadNamedStyle(os.path.join(template_dir, 'face_mbr.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) face_extent = layer.extent() # face geometry sql = u'SELECT face_id, topology.ST_GetFaceGeometry(%s, face_id) as geom ' \ 'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)) uri.setDataSource('', u'(%s\n)' % sql, 'geom', '', 'face_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBPolygon) layer = QgsVectorLayer(uri.uri(), u'%s.face' % toponame, provider) layer.setExtent(face_extent) layer.loadNamedStyle(os.path.join(template_dir, 'face.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # face_seed sql = u'SELECT face_id, ST_PointOnSurface(topology.ST_GetFaceGeometry(%s, face_id)) as geom ' \ 'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)) uri.setDataSource('', u'(%s)' % sql, 'geom', '', 'face_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBPoint) layer = QgsVectorLayer(uri.uri(), u'%s.face_seed' % toponame, provider) layer.setExtent(face_extent) layer.loadNamedStyle(os.path.join(template_dir, 'face_seed.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # TODO: add polygon0, polygon1 and polygon2 ? # NODES group = legend.addGroup(u'Nodes', False, supergroup) # node uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBPoint) layer = QgsVectorLayer(uri.uri(), u'%s.node' % toponame, provider) layer.loadNamedStyle(os.path.join(template_dir, 'node.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) node_extent = layer.extent() # node labels uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBPoint) layer = QgsVectorLayer(uri.uri(), u'%s.node_id' % toponame, provider) layer.setExtent(node_extent) layer.loadNamedStyle(os.path.join(template_dir, 'node_label.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # EDGES group = legend.addGroup(u'Edges', False, supergroup) # edge uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBLineString) layer = QgsVectorLayer(uri.uri(), u'%s.edge' % toponame, provider) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) edge_extent = layer.extent() # directed edge uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBLineString) layer = QgsVectorLayer(uri.uri(), u'%s.directed_edge' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'edge.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # edge labels uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBLineString) layer = QgsVectorLayer(uri.uri(), u'%s.edge_id' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'edge_label.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # face_left uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBLineString) layer = QgsVectorLayer(uri.uri(), u'%s.face_left' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'face_left.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # face_right uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBLineString) layer = QgsVectorLayer(uri.uri(), u'%s.face_right' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'face_right.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # next_left uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBLineString) layer = QgsVectorLayer(uri.uri(), u'%s.next_left' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'next_left.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # next_right uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QGis.WKBLineString) layer = QgsVectorLayer(uri.uri(), u'%s.next_right' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'next_right.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) finally: # Set canvas extent to topology extent, if not yet initialized canvas = iface.mapCanvas() if (canvas.fullExtent().isNull()): ext = node_extent ext.combineExtentWith(edge_extent) # Grow by 1/20 of largest side ext = ext.buffer(max(ext.width(), ext.height()) / 20) canvas.setExtent(ext) # restore canvas render flag iface.mapCanvas().setRenderFlag(prevRenderFlagState) return True
def run(item, action, mainwindow): db = item.database() uri = db.uri() iface = mainwindow.iface quoteId = db.connector.quoteId quoteStr = db.connector.quoteString # check if the selected item is a topology schema isTopoSchema = False if not hasattr(item, 'schema'): mainwindow.infoBar.pushMessage("Invalid topology", u'Select a topology schema to continue.', QgsMessageBar.INFO, mainwindow.iface.messageTimeout()) return False if item.schema() is not None: sql = u"SELECT srid FROM topology.topology WHERE name = %s" % quoteStr(item.schema().name) c = db.connector._get_cursor() db.connector._execute( c, sql ) res = db.connector._fetchone( c ) isTopoSchema = res is not None if not isTopoSchema: mainwindow.infoBar.pushMessage("Invalid topology", u'Schema "{0}" is not registered in topology.topology.'.format(item.schema().name), QgsMessageBar.WARNING, mainwindow.iface.messageTimeout()) return False toposrid = str(res[0]) # load layers into the current project toponame = item.schema().name template_dir = os.path.join(current_path, 'templates') registry = QgsMapLayerRegistry.instance() legend = iface.legendInterface() # do not refresh the canvas until all the layers are added prevRenderFlagState = iface.mapCanvas().renderFlag() iface.mapCanvas().setRenderFlag( False ) try: supergroup = legend.addGroup(u'Topology "%s"' % toponame, False) provider = db.dbplugin().providerName() uri = db.uri() # FACES group = legend.addGroup(u'Faces', False, supergroup) # face mbr uri.setDataSource(toponame, 'face', 'mbr', '', 'face_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBPolygon ) layer = QgsVectorLayer(uri.uri(), u'%s.face_mbr' % toponame, provider) layer.loadNamedStyle(os.path.join(template_dir, 'face_mbr.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) face_extent = layer.extent() # face geometry sql = u'SELECT face_id, topology.ST_GetFaceGeometry(%s, face_id) as geom ' \ 'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)) uri.setDataSource('', u'(%s\n)' % sql, 'geom', '', 'face_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBPolygon ) layer = QgsVectorLayer(uri.uri(), u'%s.face' % toponame, provider) layer.setExtent(face_extent) layer.loadNamedStyle(os.path.join(template_dir, 'face.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # face_seed sql = u'SELECT face_id, ST_PointOnSurface(topology.ST_GetFaceGeometry(%s, face_id)) as geom ' \ 'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)) uri.setDataSource('', u'(%s)' % sql, 'geom', '', 'face_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBPoint ) layer = QgsVectorLayer(uri.uri(), u'%s.face_seed' % toponame, provider) layer.setExtent(face_extent) layer.loadNamedStyle(os.path.join(template_dir, 'face_seed.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # TODO: add polygon0, polygon1 and polygon2 ? # NODES group = legend.addGroup(u'Nodes', False, supergroup) # node uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBPoint ) layer = QgsVectorLayer(uri.uri(), u'%s.node' % toponame, provider) layer.loadNamedStyle(os.path.join(template_dir, 'node.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) node_extent = layer.extent() # node labels uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBPoint ) layer = QgsVectorLayer(uri.uri(), u'%s.node_id' % toponame, provider) layer.setExtent(node_extent) layer.loadNamedStyle(os.path.join(template_dir, 'node_label.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # EDGES group = legend.addGroup(u'Edges', False, supergroup) # edge uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBLineString ) layer = QgsVectorLayer(uri.uri(), u'%s.edge' % toponame, provider) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) edge_extent = layer.extent() # directed edge uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBLineString ) layer = QgsVectorLayer(uri.uri(), u'%s.directed_edge' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'edge.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # edge labels uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBLineString ) layer = QgsVectorLayer(uri.uri(), u'%s.edge_id' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'edge_label.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # face_left uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBLineString ) layer = QgsVectorLayer(uri.uri(), u'%s.face_left' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'face_left.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # face_right uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBLineString ) layer = QgsVectorLayer(uri.uri(), u'%s.face_right' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'face_right.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # next_left uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBLineString ) layer = QgsVectorLayer(uri.uri(), u'%s.next_left' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'next_left.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) # next_right uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid( toposrid ) uri.setWkbType( QGis.WKBLineString ) layer = QgsVectorLayer(uri.uri(), u'%s.next_right' % toponame, provider) layer.setExtent(edge_extent) layer.loadNamedStyle(os.path.join(template_dir, 'next_right.qml')) registry.addMapLayers([layer]) legend.moveLayer(layer, group) legend.setLayerVisible(layer, False) legend.setLayerExpanded(layer, False) finally: # restore canvas render flag iface.mapCanvas().setRenderFlag( prevRenderFlagState ) return True
def run(item, action, mainwindow): db = item.database() uri = db.uri() iface = mainwindow.iface quoteId = db.connector.quoteId quoteStr = db.connector.quoteString # check if the selected item is a topology schema isTopoSchema = False if not hasattr(item, 'schema'): mainwindow.infoBar.pushMessage( "Invalid topology", u'Select a topology schema to continue.', QgsMessageBar.INFO, mainwindow.iface.messageTimeout()) return False if item.schema() is not None: sql = u"SELECT srid FROM topology.topology WHERE name = %s" % quoteStr( item.schema().name) c = db.connector._get_cursor() db.connector._execute(c, sql) res = db.connector._fetchone(c) isTopoSchema = res is not None if not isTopoSchema: mainwindow.infoBar.pushMessage( "Invalid topology", u'Schema "{0}" is not registered in topology.topology.'.format( item.schema().name), QgsMessageBar.WARNING, mainwindow.iface.messageTimeout()) return False if (res[0] < 0): mainwindow.infoBar.pushMessage( "WARNING", u'Topology "{0}" is registered as having a srid of {1} in topology.topology, we will assume 0 (for unknown)' .format(item.schema().name, res[0]), QgsMessageBar.WARNING, mainwindow.iface.messageTimeout()) toposrid = '0' else: toposrid = str(res[0]) # load layers into the current project toponame = item.schema().name template_dir = os.path.join(current_path, 'templates') # do not refresh the canvas until all the layers are added wasFrozen = iface.mapCanvas().isFrozen() iface.mapCanvas().freeze() try: provider = db.dbplugin().providerName() uri = db.uri() # Force use of estimated metadata (topologies can be big) uri.setUseEstimatedMetadata(True) # FACES # face mbr uri.setDataSource(toponame, 'face', 'mbr', '', 'face_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Polygon) layerFaceMbr = QgsVectorLayer(uri.uri(False), u'%s.face_mbr' % toponame, provider) layerFaceMbr.loadNamedStyle(os.path.join(template_dir, 'face_mbr.qml')) face_extent = layerFaceMbr.extent() # face geometry sql = u'SELECT face_id, 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.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Polygon) layerFaceGeom = QgsVectorLayer(uri.uri(False), u'%s.face' % toponame, provider) layerFaceGeom.setExtent(face_extent) layerFaceGeom.loadNamedStyle(os.path.join(template_dir, 'face.qml')) # face_seed sql = u'SELECT face_id, 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.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Point) layerFaceSeed = QgsVectorLayer(uri.uri(False), u'%s.face_seed' % toponame, provider) layerFaceSeed.setExtent(face_extent) layerFaceSeed.loadNamedStyle( os.path.join(template_dir, 'face_seed.qml')) # TODO: add polygon0, polygon1 and polygon2 ? # NODES # node uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Point) layerNode = QgsVectorLayer(uri.uri(False), u'%s.node' % toponame, provider) layerNode.loadNamedStyle(os.path.join(template_dir, 'node.qml')) node_extent = layerNode.extent() # node labels uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Point) 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')) # EDGES # edge uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) layerEdge = QgsVectorLayer(uri.uri(False), u'%s.edge' % toponame, provider) edge_extent = layerEdge.extent() # directed edge uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) layerDirectedEdge = QgsVectorLayer(uri.uri(False), u'%s.directed_edge' % toponame, provider) layerDirectedEdge.setExtent(edge_extent) layerDirectedEdge.loadNamedStyle(os.path.join(template_dir, 'edge.qml')) # edge labels uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # face_left uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # face_right uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # next_left uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # next_right uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # Add layers to the layer tree faceLayers = [layerFaceMbr, layerFaceGeom, layerFaceSeed] nodeLayers = [layerNode, layerNodeLabel] edgeLayers = [ layerEdge, layerDirectedEdge, layerEdgeLabel, layerEdgeFaceLeft, layerEdgeFaceRight, layerEdgeNextLeft, layerEdgeNextRight ] QgsProject.instance().addMapLayers(faceLayers, False) groupFaces = QgsLayerTreeGroup(u'Faces') for layer in faceLayers: nodeLayer = groupFaces.addLayer(layer) nodeLayer.setVisible(Qt.Unchecked) nodeLayer.setExpanded(False) groupNodes = QgsLayerTreeGroup(u'Nodes') for layer in faceLayers: nodeLayer = groupNodes.addLayer(layer) nodeLayer.setVisible(Qt.Unchecked) nodeLayer.setExpanded(False) groupEdges = QgsLayerTreeGroup(u'Edges') for layer in faceLayers: nodeLayer = groupEdges.addLayer(layer) nodeLayer.setVisible(Qt.Unchecked) nodeLayer.setExpanded(False) supergroup = QgsLayerTreeGroup(u'Topology "%s"' % toponame) supergroup.insertChildNodes(-1, [groupFaces, groupNodes, groupEdges]) QgsProject.instance().layerTreeRoot().addChildNode(supergroup) finally: # Set canvas extent to topology extent, if not yet initialized canvas = iface.mapCanvas() if (canvas.fullExtent().isNull()): ext = node_extent ext.combineExtentWith(edge_extent) # Grow by 1/20 of largest side ext = ext.buffer(max(ext.width(), ext.height()) / 20) canvas.setExtent(ext) # restore canvas render flag if not wasFrozen: iface.mapCanvas().freeze(False) return True
def run(item, action, mainwindow): db = item.database() uri = db.uri() iface = mainwindow.iface quoteId = db.connector.quoteId quoteStr = db.connector.quoteString # check if the selected item is a topology schema isTopoSchema = False if not hasattr(item, 'schema'): mainwindow.infoBar.pushMessage("Invalid topology", u'Select a topology schema to continue.', QgsMessageBar.INFO, mainwindow.iface.messageTimeout()) return False if item.schema() is not None: sql = u"SELECT srid FROM topology.topology WHERE name = %s" % quoteStr(item.schema().name) c = db.connector._get_cursor() db.connector._execute(c, sql) res = db.connector._fetchone(c) isTopoSchema = res is not None if not isTopoSchema: mainwindow.infoBar.pushMessage("Invalid topology", u'Schema "{0}" is not registered in topology.topology.'.format( item.schema().name), QgsMessageBar.WARNING, mainwindow.iface.messageTimeout()) return False if (res[0] < 0): mainwindow.infoBar.pushMessage("WARNING", u'Topology "{0}" is registered as having a srid of {1} in topology.topology, we will assume 0 (for unknown)'.format(item.schema().name, res[0]), QgsMessageBar.WARNING, mainwindow.iface.messageTimeout()) toposrid = '0' else: toposrid = str(res[0]) # load layers into the current project toponame = item.schema().name template_dir = os.path.join(current_path, 'templates') # do not refresh the canvas until all the layers are added wasFrozen = iface.mapCanvas().isFrozen() iface.mapCanvas().freeze() try: provider = db.dbplugin().providerName() uri = db.uri() # Force use of estimated metadata (topologies can be big) uri.setUseEstimatedMetadata(True) # FACES # face mbr uri.setDataSource(toponame, 'face', 'mbr', '', 'face_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Polygon) layerFaceMbr = QgsVectorLayer(uri.uri(False), u'%s.face_mbr' % toponame, provider) layerFaceMbr.loadNamedStyle(os.path.join(template_dir, 'face_mbr.qml')) face_extent = layerFaceMbr.extent() # face geometry sql = u'SELECT face_id, 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.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Polygon) layerFaceGeom = QgsVectorLayer(uri.uri(False), u'%s.face' % toponame, provider) layerFaceGeom.setExtent(face_extent) layerFaceGeom.loadNamedStyle(os.path.join(template_dir, 'face.qml')) # face_seed sql = u'SELECT face_id, 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.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Point) layerFaceSeed = QgsVectorLayer(uri.uri(False), u'%s.face_seed' % toponame, provider) layerFaceSeed.setExtent(face_extent) layerFaceSeed.loadNamedStyle(os.path.join(template_dir, 'face_seed.qml')) # TODO: add polygon0, polygon1 and polygon2 ? # NODES # node uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Point) layerNode = QgsVectorLayer(uri.uri(False), u'%s.node' % toponame, provider) layerNode.loadNamedStyle(os.path.join(template_dir, 'node.qml')) node_extent = layerNode.extent() # node labels uri.setDataSource(toponame, 'node', 'geom', '', 'node_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.Point) 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')) # EDGES # edge uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) layerEdge = QgsVectorLayer(uri.uri(False), u'%s.edge' % toponame, provider) edge_extent = layerEdge.extent() # directed edge uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) layerDirectedEdge = QgsVectorLayer(uri.uri(False), u'%s.directed_edge' % toponame, provider) layerDirectedEdge.setExtent(edge_extent) layerDirectedEdge.loadNamedStyle(os.path.join(template_dir, 'edge.qml')) # edge labels uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # face_left uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # face_right uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # next_left uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # next_right uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id') uri.setSrid(toposrid) uri.setWkbType(QgsWkbTypes.LineString) 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')) # Add layers to the layer tree faceLayers = [layerFaceMbr, layerFaceGeom, layerFaceSeed] nodeLayers = [layerNode, layerNodeLabel] edgeLayers = [layerEdge, layerDirectedEdge, layerEdgeLabel # , layerEdgeFaceLeft, layerEdgeFaceRight, layerEdgeNextLeft, layerEdgeNextRight ] QgsProject.instance().addMapLayers(faceLayers, False) groupFaces = QgsLayerTreeGroup(u'Faces') for layer in faceLayers: nodeLayer = groupFaces.addLayer(layer) nodeLayer.setVisible(Qt.Unchecked) nodeLayer.setExpanded(False) groupNodes = QgsLayerTreeGroup(u'Nodes') for layer in nodeLayers: nodeLayer = groupNodes.addLayer(layer) nodeLayer.setVisible(Qt.Unchecked) nodeLayer.setExpanded(False) groupEdges = QgsLayerTreeGroup(u'Edges') for layer in edgeLayers: nodeLayer = groupEdges.addLayer(layer) nodeLayer.setVisible(Qt.Unchecked) nodeLayer.setExpanded(False) supergroup = QgsLayerTreeGroup(u'Topology "%s"' % toponame) supergroup.insertChildNodes(-1, [groupFaces, groupNodes, groupEdges]) QgsProject.instance().layerTreeRoot().addChildNode(supergroup) finally: # Set canvas extent to topology extent, if not yet initialized canvas = iface.mapCanvas() if (canvas.fullExtent().isNull()): ext = node_extent ext.combineExtentWith(edge_extent) # Grow by 1/20 of largest side ext = ext.buffer(max(ext.width(), ext.height()) / 20) canvas.setExtent(ext) # restore canvas render flag if not wasFrozen: iface.mapCanvas().freeze(False) return True