La raison de cette apparence mosaïque est que chaque image unique est dessinée avec une échelle de gris étirée de l'image min à l'image max, et NON à travers le min / max global. Lorsque vous fusionnez toutes les images en une seule, eh bien, il n'y a qu'une seule min / max. Il en va de même pour VRT, car VRT traite toutes les images comme une seule (lorsque vous regardez le fichier VRT, vous verrez les statistiques communes).
Lorsque les deux, fusion et VRT, ne sont pas une option, le script suivant peut aider.
Dans la première boucle, j'itère sur toutes les couches, sélectionne les rasters et obtient une estimation de leur intervalle min / max. C'est ainsi que QGIS fonctionne lui-même. À partir de ces valeurs min / max, je calcule le min / max global
Dans la deuxième boucle, les rendus de toutes les couches raster sont configurés de telle sorte que l'échelle de gris est étirée sur l'intervalle global min / max.
gmin = 9999
gmax = -9999
layers = []
# loop over all layers, take rasters and estimate min, max values
for layer in iface.mapCanvas().layers():
if isinstance(layer, QgsRasterLayer):
# change percentages and sample size to increase or decrease accuracy
min_max = layer.dataProvider().cumulativeCut(1, 0.02, 0.98, theSampleSize=250000)
gmin = min(gmin, min_max[0])
gmax = max(gmax, min_max[1])
layers.append(layer)
# for all rasters create a single band gray scale renderer with
# gray scale stretched across the interval [gmin..gmax]
for rasterlayer in layers:
renderer = QgsSingleBandGrayRenderer(rasterlayer.dataProvider(), 1)
# take the first band (0)
ce = QgsContrastEnhancement(rasterlayer.dataProvider().dataType(0))
ce.setContrastEnhancementAlgorithm(QgsContrastEnhancement.StretchToMinimumMaximum)
ce.setMinimumValue(gmin)
ce.setMaximumValue(gmax)
renderer.setContrastEnhancement(ce)
rasterlayer.setRenderer(renderer)
# refresh canvas to show changes
iface.mapCanvas().refresh()