I'm developing an application to automate reports that include several QGIS maps. The main drag on the application, as noted below, is the time required to instantiate the QgsProject and to load the composition.
gui_flag = True app = QgsApplication(sys.argv, True) QgsApplication.setPrefixPath("/usr", True) QgsApplication.initQgis() project_path = 'project.qgs' template_path = 'template.qpt' canvas = QgsMapCanvas() canvas.resize(QSize(1450, 850)) QgsProject.instance().read(QFileInfo(project_path)) #takes 39.9 sec to execute root = QgsProject.instance().layerTreeRoot() bridge = QgsLayerTreeMapCanvasBridge(root, canvas) bridge.setCanvasLayers() registry = QgsMapLayerRegistry.instance() template_file = file(template_path) template_content = template_file.read() template_file.close() document = QDomDocument() document.setContent(template_content) map_settings = canvas.mapSettings() composition = QgsComposition(map_settings) composition.loadFromTemplate(document) #takes 13 sec. to execute
It's especially slow if the project file has several composers. Pickling the QgsComposition object doesn't work, and neither does pickling the QFileInfo object which I guess is related to the PyQt4 classes that comprise it based on this post. Is there another caching strategy that would work to speed up the load time for a composition object?