|
20 | 20 | import sys
|
21 | 21 | import os
|
22 | 22 | from utilities import unitTestDataPath, getQgisTestApp
|
23 |
| -from PyQt4.QtCore import QUrl, QString, qDebug |
| 23 | +from PyQt4.QtCore import QFileInfo, QDir, QStringList |
24 | 24 | from PyQt4.QtXml import QDomDocument
|
25 |
| -from qgis.core import (QgsComposition, QgsPoint) |
| 25 | +from qgis.core import (QgsComposition, |
| 26 | + QgsPoint, |
| 27 | + QgsRasterLayer, |
| 28 | + QgsMultiBandColorRenderer, |
| 29 | + QgsMapLayerRegistry, |
| 30 | + QgsMapRenderer |
| 31 | + ) |
26 | 32 |
|
27 |
| -from qgscompositionchecker import QgsCompositionChecker |
28 | 33 | # support python < 2.7 via unittest2
|
29 | 34 | # needed for expected failure decorator
|
30 | 35 | if sys.version_info[0:2] < (2,7):
|
|
34 | 39 | print "You need to install unittest2 to run the salt tests"
|
35 | 40 | sys.exit(1)
|
36 | 41 | else:
|
37 |
| - from unittest import TestCase, expectedFailure |
| 42 | + from unittest import expectedFailure |
38 | 43 |
|
39 | 44 | QGISAPP, CANVAS, IFACE, PARENT = getQgisTestApp()
|
40 | 45 | TEST_DATA_DIR = unitTestDataPath()
|
@@ -94,5 +99,62 @@ def testNoSubstitutionMap(self):
|
94 | 99 | myMessage = ('Map 0 could not be found in template %s', myFile)
|
95 | 100 | assert myMap is not None, myMessage
|
96 | 101 |
|
| 102 | + def testPrintMapFromTemplate(self): |
| 103 | + """Test that we can get a map to render in the template.""" |
| 104 | + myPath = os.path.join(TEST_DATA_DIR, 'landsat.tif') |
| 105 | + myFileInfo = QFileInfo(myPath) |
| 106 | + myRasterLayer = QgsRasterLayer(myFileInfo.filePath(), |
| 107 | + myFileInfo.completeBaseName()) |
| 108 | + myRenderer = QgsMultiBandColorRenderer( |
| 109 | + myRasterLayer.dataProvider(), 2, 3, 4) |
| 110 | + #mRasterLayer.setRenderer( rasterRenderer ) |
| 111 | + myPipe = myRasterLayer.pipe() |
| 112 | + assert myPipe.set( myRenderer ), "Cannot set pipe renderer" |
| 113 | + |
| 114 | + QgsMapLayerRegistry.instance().addMapLayer(myRasterLayer) |
| 115 | + |
| 116 | + myMapRenderer = QgsMapRenderer() |
| 117 | + myLayerStringList = QStringList() |
| 118 | + myLayerStringList.append(myRasterLayer.id()) |
| 119 | + myMapRenderer.setLayerSet(myLayerStringList) |
| 120 | + myMapRenderer.setProjectionsEnabled(False) |
| 121 | + |
| 122 | + |
| 123 | + myComposition = QgsComposition(myMapRenderer) |
| 124 | + myFile = os.path.join(TEST_DATA_DIR, 'template-for-substitution.qpt') |
| 125 | + myTemplateFile = file(myFile, 'rt') |
| 126 | + myTemplateContent = myTemplateFile.read() |
| 127 | + myTemplateFile.close() |
| 128 | + myDocument = QDomDocument() |
| 129 | + myDocument.setContent(myTemplateContent) |
| 130 | + myComposition.loadFromTemplate(myDocument) |
| 131 | + |
| 132 | + # now render the map, first zooming to the raster extents |
| 133 | + myMap = myComposition.getComposerMapById(0) |
| 134 | + myMessage = ('Map 0 could not be found in template %s', myFile) |
| 135 | + assert myMap is not None, myMessage |
| 136 | + |
| 137 | + myExtent = myRasterLayer.extent() |
| 138 | + myMap.setNewExtent(myExtent) |
| 139 | + |
| 140 | + myImagePath = os.path.join(str(QDir.tempPath()), |
| 141 | + 'template_map_render_python.png') |
| 142 | + |
| 143 | + myPageNumber = 0 |
| 144 | + myImage = myComposition.printPageAsRaster(myPageNumber) |
| 145 | + myImage.save(myImagePath) |
| 146 | + assert os.path.exists(myImagePath), 'Map render was not created.' |
| 147 | + |
| 148 | + # Not sure if this is a predictable way to test but its quicker than |
| 149 | + # rendering. |
| 150 | + myFileSize = QFileInfo(myImagePath).size() |
| 151 | + myExpectedFileSize = 100000 |
| 152 | + myMessage = ('Expected file size to be greater than %s, got %s' % |
| 153 | + (myExpectedFileSize, myFileSize)) |
| 154 | + assert myFileSize > myExpectedFileSize, myMessage |
| 155 | + |
| 156 | + |
| 157 | + |
| 158 | + |
97 | 159 | if __name__ == '__main__':
|
98 | 160 | unittest.main()
|
0 commit comments