I am very new to GIS in general and even more to QGis. I have a pretty simple task which is to import all shapefiles in one folder, style them and finally export them.

I have wrote python code that does it one by one just well from the console but when I try to launch it from a pyton class, I do not obtain the shapefile layer printed as I did from the console. Only the elements such as the legend, label appear and a big "Map will be printed here" !

I guess it is because I'm not dealing explicitly with the shapefile I just imported but I didn't find examples doing so on the documentation...

Here is my class so far :

from glob import glob
from os import path
from qgis.core import *
from qgis.gui import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtXml import *
import PyQt4

    class Loader:
        def __init__(self, iface):
            """Initialize using the qgis.utils.iface 
            object passed from the console.

            self.iface = iface

        def load_shapefiles(self, shp_path):
            """Load all shapefiles found in shp_path"""
            print "Loading shapes from %s" % path.join(shp_path, "*.shp")
            shps = glob(path.join(shp_path, "*.shp"))
            for shp in shps:
                (shpdir, shpfile) = path.split(shp)
                layer = self.iface.addVectorLayer(shp, shpfile, 'ogr' )

                #Create composition 
                mapRenderer = self.iface.mapCanvas().mapRenderer()
                c = QgsComposition(mapRenderer)
                x, y = 0, 0
                w, h = c.paperWidth(), c.paperHeight()

                composerMap = QgsComposerMap(c, x,y,w,h)
                composerLabel = QgsComposerLabel(c)
                composerLabel.setText("Hello world")

                legend = QgsComposerLegend(c)

                item = QgsComposerScaleBar(c)
                item.setStyle('Numeric') # optionally modify the style

                composerLabel.setItemPosition(20,10, 100, 30)
                dpi = c.printResolution()
                dpmm = dpi / 25.4
                width = int(dpmm * c.paperWidth())
                height = int(dpmm * c.paperHeight())

                # create output image and initialize it
                image = PyQt4.QtGui.QImage(PyQt4.QtCore.QSize(width, height), PyQt4.QtGui.QImage.Format_ARGB32)
                image.setDotsPerMeterX(dpmm * 1000)
                image.setDotsPerMeterY(dpmm * 1000)
                color = PyQt4.QtGui.QColor(155, 155, 155)

                # render the composition
                imagePainter = QPainter(image)
                sourceArea = QRectF(0, 0, c.paperWidth(), c.paperHeight())
                targetArea = QRectF(0, 0, width, height)
                c.render(imagePainter, targetArea, sourceArea)

                image.save("C:\FOLDER\USER\\outfromscript.png", "png")
  • For your layer.loadNamedStyle('C:\ARIA\ENZO\shape\shapestyle.qml') and image.save("C:\FOLDER\USER\outfromscript.png", "png"), try escaping using double backslashes. – Joseph May 31 '16 at 10:58
  • Ok, thanks to this I now have a big "The map will be printed here" that appeared in my outputfile, but still not the map that appears in user interface ! Any ideas ? – Enzoupi May 31 '16 at 11:14
  • It looks as though your script attempts to create an image for each shape file, however it seems as though each image will get overwritten as your image.save uses the same file name each time. Try creating a file name from a variable that is changed on each loop and then see if any of the images are rendered correctly – ian Jun 1 '16 at 9:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.