Reputation: 1
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.
# 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