<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    Hi Andrea,<br>
    <br>
    Are you aware that QGIS already supports serial printing out of the
    box without scripting? I would first test if that works fine for you
    before bothering with scripts. QGIS 2.2 had serial printing in core,
    2.4 has it improved and 2.6 has a lot more improvements. I am pretty
    sure that many (most?) cases can now be handled out of the box.<br>
    <br>
    Andreas<br>
    <br>
    <div class="moz-cite-prefix">On 01.10.2014 10:54, Andrea Amparore
      wrote:<br>
    </div>
    <blockquote
cite="mid:CAHsKc1p9jbPJ2fyeZ_bW7Rhsa_iWZtjQ2AYbdxDhr1ABFFfx1g@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div>Dear QGIS users community,</div>
        <div><br>
        </div>
        <div>I'm a new member and I am stuck on a problem since few
          days, maybe someone can help me with this.</div>
        <div><br>
        </div>
        <div>I have developed a stand-alone python script for making
          serial maps using PyQGIS library.</div>
        <div><br>
        </div>
        <div>The maps should follow a specific format that is indicated
          by a template .qpt file.</div>
        <div><br>
        </div>
        <div>This template file is opened and edited with lxml library
          in order to add information about the map (title, date,
          source, etc).</div>
        <div><br>
        </div>
        <div>The modified .qpt is then loaded into a new composition,
          the layers are added and the map exported.</div>
        <div><br>
        </div>
        <div>Everything was working perfectly since I’ve been using QGIS
          2.2. Few days ago I have updated QGIS to the latest version
          2.4 and now the output is sadly empty: map elements are
          displayed (frame, legend, title..), but no layer appears on
          the map.</div>
        <div><br>
        </div>
        <div>The script is correct, because it still run correctly on
          another machine having QGIS 2.2. Is there anything that I have
          to modify for running it with QGIS 2.4?</div>
        <div><br>
        </div>
        <div>This is a very basic version of the script.</div>
        <div><br>
        </div>
        <div>import os</div>
        <div>from qgis.core import *</div>
        <div>from qgis.gui import *</div>
        <div>from PyQt4.QtCore import *</div>
        <div>from PyQt4.QtGui import *</div>
        <div>from PyQt4.QtXml import *</div>
        <div>import lxml.etree as etree</div>
        <div><br>
        </div>
        <div>print "setting prefix"</div>
        <div>QgsApplication.setPrefixPath("/usr", True)</div>
        <div>print "initiating qgis"</div>
        <div>QgsApplication.initQgis()</div>
        <div>print 'creating new app'</div>
        <div>app = QgsApplication([], True)</div>
        <div>#removing old layers</div>
        <div>QgsMapLayerRegistry.instance().removeAllMapLayers()</div>
        <div><br>
        </div>
        <div>script_folder = os.path.dirname(__file__)</div>
        <div>project_folder = os.path.dirname(script_folder)</div>
        <div>output_folder = os.path.join(project_folder, 'map_outputs')</div>
        <div>xml_folder = os.path.join(project_folder,
          'project_outputs')</div>
        <div>shapefile_folder = os.path.join(project_folder,
          'shapefile_folder')</div>
        <div><br>
        </div>
        <div>template_composer = os.path.join(project_folder,
          'basic_composer_template_QGIS24.qpt')</div>
        <div>polyg_shapefile = os.path.join(shapefile_folder,
          'polygon.shp') # crs EPSG:4326 - WGS 84</div>
        <div>point_shapefile = os.path.join(shapefile_folder,
          'point.shp') # crs EPSG:32615 - WGS 84 / UTM zone 15N</div>
        <div><br>
        </div>
        <div>mapname = "Test Map"</div>
        <div>srid = 4326</div>
        <div>provider_name = 'ogr'</div>
        <div>layerset = []</div>
        <div><br>
        </div>
        <div>#add layer 1</div>
        <div>vlayer_name= 'polygon layer'</div>
        <div>vdata_source = polyg_shapefile</div>
        <div>print "Loading EQ buffers"</div>
        <div>layer = QgsVectorLayer(vdata_source, vlayer_name,
          provider_name)</div>
        <div>print "Buffers loaded"</div>
        <div>QgsMapLayerRegistry.instance().addMapLayer(layer)</div>
        <div>layerset.append(<a moz-do-not-send="true"
            href="http://layer.id">layer.id</a>())</div>
        <div><br>
        </div>
        <div>#add layer 2</div>
        <div>point_layer_name= 'point layer'</div>
        <div>point_data_source = point_shapefile</div>
        <div>point_layer = QgsVectorLayer(point_data_source,
          point_layer_name, provider_name)</div>
        <div>QgsMapLayerRegistry.instance().addMapLayer(point_layer)</div>
        <div>layerset.append(<a moz-do-not-send="true"
            href="http://point_layer.id">point_layer.id</a>())</div>
        <div><br>
        </div>
        <div># Set up the map renderer that will be assigned to the
          composition</div>
        <div>map_renderer = QgsMapRenderer()</div>
        <div>#preparing the map the extent - 3 times wider than the
          polygon layer's extent</div>
        <div>rect = layer.extent()</div>
        <div>rect.scale(3)</div>
        <div># Set the labelling engine for the canvas</div>
        <div>labelling_engine = QgsPalLabeling()</div>
        <div>map_renderer.setLabelingEngine(labelling_engine)</div>
        <div># Enable on the fly CRS transformations</div>
        <div>map_renderer.setProjectionsEnabled(True)</div>
        <div># Now set up the composition</div>
        <div>composition = QgsComposition(map_renderer)</div>
        <div>#set WGS84 as destination crs</div>
        <div>map_projection = QgsCoordinateReferenceSystem(srid,
          QgsCoordinateReferenceSystem.PostgisCrsId)</div>
        <div>map_projection_descr = map_projection.description()</div>
        <div>map_renderer.setDestinationCrs(map_projection)</div>
        <div><br>
        </div>
        <div>#open the composer template and edit it</div>
        <div>with open(template_composer, 'r') as f:</div>
        <div>    tree  = etree.parse(f)</div>
        <div>    #setting extent</div>
        <div>    for elem in tree.iter(tag = 'Extent'):</div>
        <div>        elem.attrib['xmax'] = str(rect.xMaximum())</div>
        <div>        elem.attrib['xmin'] = str(rect.xMinimum())</div>
        <div>        elem.attrib['ymax'] = str(rect.yMaximum())</div>
        <div>        elem.attrib['ymin'] = str(rect.yMinimum())</div>
        <div>    #editing the title</div>
        <div>    for elem in tree.iter(tag = 'ComposerLabel'):</div>
        <div>            for child in elem:</div>
        <div>                if child.tag == 'ComposerItem':</div>
        <div>                    if child.attrib['id'] ==
          "__maintitle__":</div>
        <div>                        elem.attrib['labelText'] = mapname</div>
        <div>    #save the edited composer as a new file</div>
        <div>    new_composer = os.path.join(xml_folder, mapname +
          "_composer.qpt")</div>
        <div>    tree.write(new_composer)</div>
        <div><br>
        </div>
        <div>#open the newly created composer</div>
        <div>new_composerfile = file(new_composer, 'rt')</div>
        <div>new_composer_content = new_composerfile.read()</div>
        <div>new_composerfile.close()</div>
        <div>document = QDomDocument()</div>
        <div>document.setContent(new_composer_content)</div>
        <div>result = composition.loadFromTemplate(document)</div>
        <div><br>
        </div>
        <div># Get the main map canvas on the composition and set the
          layers</div>
        <div>composerMap = composition.getComposerMapById(0)</div>
        <div>composerMap.renderModeUpdateCachedImage()</div>
        <div>map_renderer.setLayerSet(layerset)</div>
        <div><br>
        </div>
        <div>#legend</div>
        <div>legend = QgsComposerLegend(composition)</div>
        <div>legend.model().setLayerSet(map_renderer.layerSet())</div>
        <div>legend.model().setLayerSet</div>
        <div>composition.addItem(legend)</div>
        <div>legend.setItemPosition (25,122)</div>
        <div>legend.setFrameEnabled(True)</div>
        <div>legend.setScale(.7)</div>
        <div><br>
        </div>
        <div>#save image</div>
        <div>print 'saving image'</div>
        <div>image = composition.printPageAsRaster(0)</div>
        <div>image.save(os.path.join(output_folder,mapname) + ".png")</div>
        <div><br>
        </div>
        <div>In this link you can find the 2 shapefiles and the composer
          template that you need for running the script, and the example
          of failed export: <a moz-do-not-send="true"
            href="http://we.tl/8y3SrCxlGM" target="_blank"
style="font-size:12.8000001907349px;color:rgb(18,148,220);font-family:Helvetica,sans-serif;line-height:20px;text-decoration:none;background-color:rgb(240,244,247)">http://we.tl/8y3SrCxlGM</a></div>
        <div><br>
        </div>
        <div>Thanks in advance.</div>
        <div><br>
        </div>
        <div>Regards,</div>
        <div><br>
        </div>
        <div>Andrea</div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
Qgis-user mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Qgis-user@lists.osgeo.org">Qgis-user@lists.osgeo.org</a>
<a class="moz-txt-link-freetext" href="http://lists.osgeo.org/mailman/listinfo/qgis-user">http://lists.osgeo.org/mailman/listinfo/qgis-user</a></pre>
    </blockquote>
    <br>
  </body>
</html>