3

I'm having troubles with a pyQGIS script. I'm trying to create a large number of maps showing NDVI in a certain area over the time. The script opens a raster file, applies a style, changes title and exports map.

I made a loop to do that and it doesn't work, the canvas doesn't refresh and many maps are from the same raster file. I Use solutions like How to refresh MapCanvas while PyQGIS-script is running? or Map on canvas renders after image saving [duplicate] with no success.

But, I'm looking a way to create dummy rasters/vectors prior to recreates pyQGIS problems. R have excellent guides, and this also can be applied to spatial data.

So, is there a way to create dummy rasters with random numbers to recreates problems like this?

By the way, the script is something like the code below. I'm looking a way to replaces files item into dummy rasters.

from qgis.core import QgsProject
from qgis.gui import *
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication,QFileInfo,QSizeF,QTimer
from PyQt4.QtGui import QAction, QIcon, QPrinter,QPainter
import os
import glob

files = glob.glob(r'Path/to/monthly/NDVI/*.tif')

aaa = [some list]

n = 287 # 12 year

for i in range(0,n):
    project = QgsProject.instance()
    project.read(QFileInfo('some/Project.qgs'))
    layer1 = QgsRasterLayer(files[i],'NDVI')
    uri = '/path/to/estilo.qml'
    layer1.loadNamedStyle(uri)
    root = QgsProject.instance().layerTreeRoot()
    group = root.findGroup('Raster')
    QgsMapLayerRegistry.instance().addMapLayer(layer1, False)
    group.insertChildNode(-1, QgsLayerTreeLayer(layer1))
    iface.mapCanvas().refresh()
    iface.mapCanvas().refreshAllLayers()
    composers = iface.activeComposers()
    composers[0].items()[2].setText('Test' + str(files[i]))
    c = composers[0].composition()
    c.items()[8].refreshDataDefinedProperty()
    c.items()[8].updateBoundingRect()
    c.refreshItems()

    def ExP():
        imgOut = c.printPageAsRaster (0)
        imgOut.save(os.path.join(r'/path/to/export/',aaa[i]+'.png'),"PNG")
        return

    QTimer.singleShot(2000, ExP)

    def ReM():
        QgsMapLayerRegistry.instance().removeMapLayer( layer1.id() )
        return

    QTimer.singleShot(2000, ReM)

    QgsProject.instance().clear()
aldo_tapia
  • 13,560
  • 5
  • 30
  • 56

0 Answers0