Muhammad Arsalan
Muhammad Arsalan

Reputation: 1

Style not being applied to the temporary layer inside the QGIS Plugin UI map canvas

I have this code inside a function for qgis plugin

def addMainElements_spatial(self):
        self.mapCanvas = QgsMapCanvas(self.spatial)
        self.mapCanvas.setGeometry(QtCore.QRect(50, 150, 1100, 720))
        self.mapCanvas.setObjectName("mapCanvas")

        # Set canvas properties
        self.mapCanvas.setCanvasColor(QtCore.Qt.white)
        self.mapCanvas.enableAntiAliasing(True)

        # Load the OSM basemap
        osm_url = "type=xyz&url=https://tile.openstreetmap.org/{z}/{x}/{y}.png"
        self.osm_layer = QgsRasterLayer(osm_url, "OSM Basemap", "wms")
        self.osm_layer.setCrs(QgsCoordinateReferenceSystem(3857))

        if self.osm_layer.isValid():
            self.mapCanvas.setDestinationCrs(QgsCoordinateReferenceSystem(3857))
            self.mapCanvas.setLayers([self.osm_layer])
            self.mapCanvas.setExtent(QgsRectangle(221068, 5672193, 1870902, 7456160))
        else:
            print("Failed to load the OSM basemap layer")

I have rendered this basemap inside a tab in the plugin UI, but I am not able to see the symbology applied to the layer loaded in this map based on a query.

Here is what I have tried with fill symbology, but this style gets applied to the layer if I add it inside the QgsProject.instance(). The problem is that this style is not applied to the layer in QgsMapCanvas inside the Plugin UI. The map zooms to the layer extent, but I don't see any style applied to the polygon.
# Create a memory layer for the query results
        layer = QgsVectorLayer("MultiPolygon?crs=EPSG:3857", "Query Result", "memory")
        layer_data_provider = layer.dataProvider()

        # Loop through rows and add features to the memory layer
        for row in rows:
            attributes = row[:-1]  # All columns except WKT geometry
            geom_wkt = row[-1]     # WKT Geometry as the last column
            feature = QgsFeature()
            feature.setGeometry(QgsGeometry.fromWkt(geom_wkt))  # Set geometry from WKT
            feature.setAttributes(list(attributes))  # Set the attributes for the feature
            layer_data_provider.addFeatures([feature])

        layer.updateExtents()

        # Apply symbology
        symbol = QgsFillSymbol.defaultSymbol(layer.geometryType())
        symbol.setColor(QColor(255, 0, 0, 127))  # Red fill with 50% opacity
        symbol_layer = symbol.symbolLayer(0)
        if symbol_layer:
            symbol_layer.setStrokeColor(QColor(0, 0, 0))  # Black border
            symbol_layer.setStrokeWidth(0.5)

        renderer = QgsSingleSymbolRenderer(symbol)
        layer.setRenderer(renderer)

        # Ensure the OSM basemap layer is at the bottom and the query result layer is on top
        layers = self.mapCanvas.layers()
        osm_layer = next((layer for layer in layers if isinstance(layer, QgsRasterLayer) and layer.name() == "OSM Basemap"), None)

        # Add layers to map canvas
        if osm_layer:
            self.mapCanvas.setLayers([osm_layer, layer])  # Add basemap layer first, then the query result layer
        else:
            self.mapCanvas.setLayers([layer])  # Add only the query result layer if no basemap

        # Refresh canvas and set extent to fit the query result
        self.mapCanvas.setExtent(layer.extent())
        self.mapCanvas.refresh()

Upvotes: 0

Views: 22

Answers (0)

Related Questions