<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 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 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 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>