def testFromQPainter(self): """ test QgsRenderContext.fromQPainter """ # no painter c = QgsRenderContext.fromQPainter(None) self.assertFalse(c.painter()) # assuming 88 dpi as fallback self.assertAlmostEqual(c.scaleFactor(), 88 / 25.4, 3) # no painter destination p = QPainter() c = QgsRenderContext.fromQPainter(p) self.assertEqual(c.painter(), p) self.assertEqual(c.testFlag(QgsRenderContext.Antialiasing), False) self.assertAlmostEqual(c.scaleFactor(), 88 / 25.4, 3) im = QImage(1000, 600, QImage.Format_RGB32) dots_per_m = 300 / 25.4 * 1000 # 300 dpi to dots per m im.setDotsPerMeterX(dots_per_m) im.setDotsPerMeterY(dots_per_m) p = QPainter(im) p.setRenderHint(QPainter.Antialiasing) c = QgsRenderContext.fromQPainter(p) self.assertEqual(c.painter(), p) self.assertEqual(c.testFlag(QgsRenderContext.Antialiasing), True) self.assertAlmostEqual(c.scaleFactor(), dots_per_m / 1000, 3) # scaleFactor should be pixels/mm
def testFromQPainter(self): """ test QgsRenderContext.fromQPainter """ # no painter c = QgsRenderContext.fromQPainter(None) self.assertFalse(c.painter()) # assuming 88 dpi as fallback self.assertAlmostEqual(c.scaleFactor(), 88 / 25.4, 3) # no painter destination p = QPainter() c = QgsRenderContext.fromQPainter(p) self.assertEqual(c.painter(), p) self.assertAlmostEqual(c.scaleFactor(), 88 / 25.4, 3) im = QImage(1000, 600, QImage.Format_RGB32) dots_per_m = 300 / 25.4 * 1000 # 300 dpi to dots per m im.setDotsPerMeterX(dots_per_m) im.setDotsPerMeterY(dots_per_m) p = QPainter(im) c = QgsRenderContext.fromQPainter(p) self.assertEqual(c.painter(), p) self.assertAlmostEqual(c.scaleFactor(), dots_per_m / 1000, 3) # scaleFactor should be pixels/mm
def testFromQPainter(self): """ test QgsRenderContext.fromQPainter """ # no painter c = QgsRenderContext.fromQPainter(None) self.assertFalse(c.painter()) # assuming 88 dpi as fallback self.assertAlmostEqual(c.scaleFactor(), 88 / 25.4, 3) # no painter destination p = QPainter() c = QgsRenderContext.fromQPainter(p) self.assertEqual(c.painter(), p) self.assertEqual(c.testFlag(QgsRenderContext.Antialiasing), False) self.assertEqual(c.testFlag(QgsRenderContext.LosslessImageRendering), False) self.assertAlmostEqual(c.scaleFactor(), 88 / 25.4, 3) im = QImage(1000, 600, QImage.Format_RGB32) dots_per_m = 300 / 25.4 * 1000 # 300 dpi to dots per m im.setDotsPerMeterX(dots_per_m) im.setDotsPerMeterY(dots_per_m) p = QPainter(im) p.setRenderHint(QPainter.Antialiasing) try: p.setRenderHint(QPainter.LosslessImageRendering) supports_lossless = True except AttributeError: supports_lossless = False c = QgsRenderContext.fromQPainter(p) self.assertEqual(c.painter(), p) self.assertEqual(c.testFlag(QgsRenderContext.Antialiasing), True) self.assertEqual(c.testFlag(QgsRenderContext.LosslessImageRendering), supports_lossless) self.assertAlmostEqual(c.scaleFactor(), dots_per_m / 1000, 3) # scaleFactor should be pixels/mm
def testRenderNoFeature(self): """ test that rendering a interpolated line outside of a map render works""" interpolated_width = QgsInterpolatedLineWidth() interpolated_color = QgsInterpolatedLineColor() interpolated_width.setIsVariableWidth(False) interpolated_width.setFixedStrokeWidth(5) interpolated_color.setColor(QColor(255, 0, 0)) interpolated_color.setColoringMethod( QgsInterpolatedLineColor.SingleColor) layer = QgsInterpolatedLineSymbolLayer() layer.setDataDefinedProperty( QgsSymbolLayer.PropertyLineStartWidthValue, QgsProperty.fromExpression('5')) layer.setDataDefinedProperty(QgsSymbolLayer.PropertyLineEndWidthValue, QgsProperty.fromExpression('1')) layer.setDataDefinedProperty( QgsSymbolLayer.PropertyLineStartColorValue, QgsProperty.fromExpression('2')) layer.setDataDefinedProperty(QgsSymbolLayer.PropertyLineEndColorValue, QgsProperty.fromExpression('6')) layer.setInterpolatedWidth(interpolated_width) layer.setInterpolatedColor(interpolated_color) symbol = QgsLineSymbol() symbol.changeSymbolLayer(0, layer) image = QImage(200, 200, QImage.Format_RGB32) image.fill(QColor(255, 255, 255)) painter = QPainter(image) context = QgsRenderContext.fromQPainter(painter) symbol.startRender(context) symbol.renderPolyline( QPolygonF([QPointF(30, 50), QPointF(100, 70), QPointF(150, 30)]), None, context) symbol.stopRender(context) painter.end() self.assertTrue( self.imageCheck('interpolatedlinesymbollayer_no_feature', 'interpolatedlinesymbollayer_no_feature', image))
def paint(self, painter, option, widget): # pylint: disable=missing-docstring, unused-argument, too-many-locals if self.image is not None: painter.drawImage(0, 0, self.image) return image_size = self.canvas.mapSettings().outputSize() self.image = QImage(image_size.width(), image_size.height(), QImage.Format_ARGB32) self.image.fill(0) image_painter = QPainter(self.image) render_context = QgsRenderContext.fromQPainter(image_painter) image_painter.setRenderHint(QPainter.Antialiasing, True) rect = self.canvas.mapSettings().visibleExtent() request = QgsFeatureRequest() request.setFilterRect(rect) request.setFilterExpression( QgsExpression.createFieldEqualityExpression('type', self.task)) for f in self.electorate_layer.getFeatures(request): # pole, dist = f.geometry().clipped(rect).poleOfInaccessibility(rect.width() / 30) pixel = self.toCanvasCoordinates( f.geometry().clipped(rect).centroid().asPoint()) calc = QgsAggregateCalculator(self.meshblock_layer) calc.setFilter('staged_electorate={}'.format(f['electorate_id'])) estimated_pop, ok = calc.calculate(QgsAggregateCalculator.Sum, 'offline_pop_{}'.format( self.task.lower())) # pylint: disable=unused-variable text_string = [ '{}'.format(f['name']), '{}'.format(int(estimated_pop)) ] QgsTextRenderer().drawText(QPointF(pixel.x(), pixel.y()), 0, QgsTextRenderer.AlignCenter, text_string, render_context, self.text_format) image_painter.end() painter.drawImage(0, 0, self.image)
def test_no_feature_coordinate_transform(self): """ Test rendering as a pure symbol, no feature associated, with coordinate transform """ buffer_layer = QgsGeometryGeneratorSymbolLayer.create( {'geometryModifier': 'buffer($geometry, 5)'}) buffer_layer.setSymbolType(QgsSymbol.Fill) buffer_layer.setUnits(QgsUnitTypes.RenderMillimeters) self.assertIsNotNone(buffer_layer.subSymbol()) symbol = QgsLineSymbol() symbol.changeSymbolLayer(0, buffer_layer) image = QImage(400, 400, QImage.Format_RGB32) image.setDotsPerMeterX(int(96 / 25.4 * 1000)) image.setDotsPerMeterY(int(96 / 25.4 * 1000)) image.fill(QColor(255, 255, 255)) painter = QPainter(image) context = QgsRenderContext.fromQPainter(painter) context.setCoordinateTransform( QgsCoordinateTransform(QgsCoordinateReferenceSystem('EPSG:4326'), QgsCoordinateReferenceSystem('EPSG:3857'), QgsProject.instance().transformContext())) symbol.startRender(context) symbol.renderPolyline( QPolygonF([QPointF(50, 200), QPointF(100, 170), QPointF(350, 270)]), None, context) symbol.stopRender(context) painter.end() self.assertTrue( self.imageCheck('geometrygenerator_nofeature', 'geometrygenerator_nofeature', image))
def testPlot(self): plot = Qgs2DPlot() plot.setSize(QSizeF(600, 500)) sym1 = QgsFillSymbol.createSimple({ 'color': '#fdbf6f', 'outline_style': 'no' }) plot.setChartBackgroundSymbol(sym1) sym2 = QgsFillSymbol.createSimple({ 'outline_color': '#0000ff', 'style': 'no', 'outline_style': 'solid', 'outline_width': 1 }) plot.setChartBorderSymbol(sym2) sym3 = QgsLineSymbol.createSimple({ 'outline_color': '#00ffff', 'outline_width': 1 }) plot.xAxis().setGridMajorSymbol(sym3) sym4 = QgsLineSymbol.createSimple({ 'outline_color': '#ff00ff', 'outline_width': 0.5 }) plot.xAxis().setGridMinorSymbol(sym4) sym3 = QgsLineSymbol.createSimple({ 'outline_color': '#0066ff', 'outline_width': 1 }) plot.yAxis().setGridMajorSymbol(sym3) sym4 = QgsLineSymbol.createSimple({ 'outline_color': '#ff4433', 'outline_width': 0.5 }) plot.yAxis().setGridMinorSymbol(sym4) font = QgsFontUtils.getStandardTestFont('Bold', 16) x_axis_format = QgsTextFormat.fromQFont(font) x_axis_format.setColor(QColor(255, 0, 0)) plot.xAxis().setTextFormat(x_axis_format) x_axis_number_format = QgsBasicNumericFormat() x_axis_number_format.setNumberDecimalPlaces(1) x_axis_number_format.setShowTrailingZeros(True) plot.xAxis().setNumericFormat(x_axis_number_format) font = QgsFontUtils.getStandardTestFont('Bold', 18) y_axis_format = QgsTextFormat.fromQFont(font) y_axis_format.setColor(QColor(0, 255, 0)) plot.yAxis().setTextFormat(y_axis_format) y_axis_number_format = QgsBasicNumericFormat() y_axis_number_format.setShowPlusSign(True) plot.yAxis().setNumericFormat(y_axis_number_format) plot.setXMinimum(3) plot.setXMaximum(9) plot.setYMinimum(2) plot.setYMaximum(12) im = QImage(600, 500, QImage.Format_ARGB32) im.fill(Qt.white) im.setDotsPerMeterX(int(96 / 25.4 * 1000)) im.setDotsPerMeterY(int(96 / 25.4 * 1000)) painter = QPainter(im) rc = QgsRenderContext.fromQPainter(painter) plot.render(rc) painter.end() assert self.imageCheck('plot_2d_base', 'plot_2d_base', im) plot_rect = plot.interiorPlotArea(rc) self.assertAlmostEqual(plot_rect.left(), 64.8, 0) self.assertAlmostEqual(plot_rect.right(), 592.44, 0) self.assertAlmostEqual(plot_rect.top(), 7.559, 0) self.assertAlmostEqual(plot_rect.bottom(), 465.55, 0)
def testOptimiseIntervals(self): plot = Qgs2DPlot() plot.setSize(QSizeF(600, 500)) font = QgsFontUtils.getStandardTestFont('Bold', 16) x_axis_format = QgsTextFormat.fromQFont(font) plot.xAxis().setTextFormat(x_axis_format) font = QgsFontUtils.getStandardTestFont('Bold', 18) y_axis_format = QgsTextFormat.fromQFont(font) plot.yAxis().setTextFormat(y_axis_format) plot.setXMinimum(3) plot.setXMaximum(13) plot.setYMinimum(2) plot.setYMaximum(12) im = QImage(600, 500, QImage.Format_ARGB32) im.fill(Qt.white) im.setDotsPerMeterX(int(96 / 25.4 * 1000)) im.setDotsPerMeterY(int(96 / 25.4 * 1000)) painter = QPainter(im) rc = QgsRenderContext.fromQPainter(painter) painter.end() plot.calculateOptimisedIntervals(rc) self.assertEqual(plot.xAxis().labelInterval(), 1) self.assertEqual(plot.yAxis().labelInterval(), 2) self.assertEqual(plot.xAxis().gridIntervalMinor(), 1) self.assertEqual(plot.yAxis().gridIntervalMinor(), 1) self.assertEqual(plot.xAxis().gridIntervalMajor(), 5) self.assertEqual(plot.yAxis().gridIntervalMajor(), 4) plot.setXMinimum(3) plot.setXMaximum(113) plot.setYMinimum(2) plot.setYMaximum(112) plot.calculateOptimisedIntervals(rc) self.assertEqual(plot.xAxis().labelInterval(), 20) self.assertEqual(plot.yAxis().labelInterval(), 20) self.assertEqual(plot.xAxis().gridIntervalMinor(), 10) self.assertEqual(plot.yAxis().gridIntervalMinor(), 10) self.assertEqual(plot.xAxis().gridIntervalMajor(), 40) self.assertEqual(plot.yAxis().gridIntervalMajor(), 40) plot.setXMinimum(0.3) plot.setXMaximum(0.5) plot.setYMinimum(1.1) plot.setYMaximum(2) plot.calculateOptimisedIntervals(rc) self.assertEqual(plot.xAxis().labelInterval(), 0.05) self.assertEqual(plot.yAxis().labelInterval(), 0.2) self.assertEqual(plot.xAxis().gridIntervalMinor(), 0.025) self.assertEqual(plot.yAxis().gridIntervalMinor(), 0.1) self.assertEqual(plot.xAxis().gridIntervalMajor(), 0.1) self.assertEqual(plot.yAxis().gridIntervalMajor(), 0.4) plot.setXMinimum(-10) plot.setXMaximum(0) plot.setYMinimum(-10000) plot.setYMaximum(-500) plot.calculateOptimisedIntervals(rc) self.assertEqual(plot.xAxis().labelInterval(), 2) self.assertEqual(plot.yAxis().labelInterval(), 2000) self.assertEqual(plot.xAxis().gridIntervalMinor(), 1) self.assertEqual(plot.yAxis().gridIntervalMinor(), 1000) self.assertEqual(plot.xAxis().gridIntervalMajor(), 4) self.assertEqual(plot.yAxis().gridIntervalMajor(), 4000) plot.setXMinimum(100000) plot.setXMaximum(200000) plot.calculateOptimisedIntervals(rc) self.assertEqual(plot.xAxis().labelInterval(), 100000) self.assertEqual(plot.xAxis().gridIntervalMinor(), 50000) self.assertEqual(plot.xAxis().gridIntervalMajor(), 200000)
def testPlotDataDefinedProperties(self): plot = Qgs2DPlot() plot.setSize(QSizeF(600, 500)) sym1 = QgsFillSymbol.createSimple({ 'color': '#ffffff', 'outline_style': 'no' }) plot.setChartBackgroundSymbol(sym1) sym2 = QgsFillSymbol.createSimple({ 'outline_color': '#000000', 'style': 'no', 'outline_style': 'solid', 'outline_width': 1 }) plot.setChartBorderSymbol(sym2) sym3 = QgsLineSymbol.createSimple({ 'outline_color': '#00ffff', 'outline_width': 1, 'capstyle': 'flat' }) sym3[0].setDataDefinedProperty( QgsSymbolLayer.PropertyStrokeWidth, QgsProperty.fromExpression( 'case when @plot_axis_value = 10 then 3 else 1 end')) plot.xAxis().setGridMajorSymbol(sym3) sym4 = QgsLineSymbol.createSimple({ 'outline_color': '#ff00ff', 'outline_width': 0.5, 'capstyle': 'flat' }) sym4[0].setDataDefinedProperty( QgsSymbolLayer.PropertyStrokeWidth, QgsProperty.fromExpression( 'case when @plot_axis_value = 6 then 3 else 0.5 end')) plot.xAxis().setGridMinorSymbol(sym4) sym3 = QgsLineSymbol.createSimple({ 'outline_color': '#0066ff', 'outline_width': 1, 'capstyle': 'flat' }) sym3[0].setDataDefinedProperty( QgsSymbolLayer.PropertyStrokeWidth, QgsProperty.fromExpression( 'case when @plot_axis_value = 5 then 3 else 0.5 end')) plot.yAxis().setGridMajorSymbol(sym3) sym4 = QgsLineSymbol.createSimple({ 'outline_color': '#ff4433', 'outline_width': 0.5, 'capstyle': 'flat' }) sym4[0].setDataDefinedProperty( QgsSymbolLayer.PropertyStrokeWidth, QgsProperty.fromExpression( 'case when @plot_axis_value = 9 then 3 else 0.5 end')) plot.yAxis().setGridMinorSymbol(sym4) font = QgsFontUtils.getStandardTestFont('Bold', 16) x_axis_format = QgsTextFormat.fromQFont(font) x_axis_format.dataDefinedProperties().setProperty( QgsPalLayerSettings.Color, QgsProperty.fromExpression( 'case when @plot_axis_value %3 = 0 then \'#ff0000\' else \'#000000\' end' )) plot.xAxis().setTextFormat(x_axis_format) font = QgsFontUtils.getStandardTestFont('Bold', 18) y_axis_format = QgsTextFormat.fromQFont(font) y_axis_format.dataDefinedProperties().setProperty( QgsPalLayerSettings.Color, QgsProperty.fromExpression( 'case when @plot_axis_value %4 = 0 then \'#0000ff\' else \'#000000\' end' )) plot.yAxis().setTextFormat(y_axis_format) plot.setXMinimum(3) plot.setXMaximum(13) plot.setYMinimum(2) plot.setYMaximum(12) im = QImage(600, 500, QImage.Format_ARGB32) im.fill(Qt.white) im.setDotsPerMeterX(int(96 / 25.4 * 1000)) im.setDotsPerMeterY(int(96 / 25.4 * 1000)) painter = QPainter(im) rc = QgsRenderContext.fromQPainter(painter) plot.render(rc) painter.end() assert self.imageCheck('plot_2d_data_defined', 'plot_2d_data_defined', im) plot_rect = plot.interiorPlotArea(rc) self.assertAlmostEqual(plot_rect.left(), 44.71, 0) self.assertAlmostEqual(plot_rect.right(), 592.44, 0) self.assertAlmostEqual(plot_rect.top(), 7.559, 0) self.assertAlmostEqual(plot_rect.bottom(), 465.55, 0)
def testPlotIntervals(self): plot = Qgs2DPlot() plot.setSize(QSizeF(600, 500)) sym1 = QgsFillSymbol.createSimple({ 'color': '#fdbf6f', 'outline_style': 'no' }) plot.setChartBackgroundSymbol(sym1) sym2 = QgsFillSymbol.createSimple({ 'outline_color': '#0000ff', 'style': 'no', 'outline_style': 'solid', 'outline_width': 1 }) plot.setChartBorderSymbol(sym2) sym3 = QgsLineSymbol.createSimple({ 'outline_color': '#00ffff', 'outline_width': 1 }) plot.xAxis().setGridMajorSymbol(sym3) sym4 = QgsLineSymbol.createSimple({ 'outline_color': '#ff00ff', 'outline_width': 0.5 }) plot.xAxis().setGridMinorSymbol(sym4) sym3 = QgsLineSymbol.createSimple({ 'outline_color': '#0066ff', 'outline_width': 1 }) plot.yAxis().setGridMajorSymbol(sym3) sym4 = QgsLineSymbol.createSimple({ 'outline_color': '#ff4433', 'outline_width': 0.5 }) plot.yAxis().setGridMinorSymbol(sym4) font = QgsFontUtils.getStandardTestFont('Bold', 16) x_axis_format = QgsTextFormat.fromQFont(font) plot.xAxis().setTextFormat(x_axis_format) font = QgsFontUtils.getStandardTestFont('Bold', 18) y_axis_format = QgsTextFormat.fromQFont(font) plot.yAxis().setTextFormat(y_axis_format) plot.setXMinimum(1) plot.setXMaximum(21) plot.setYMinimum(27) plot.setYMaximum(327) plot.xAxis().setGridIntervalMajor(10) plot.xAxis().setGridIntervalMinor(2) plot.yAxis().setGridIntervalMajor(100) plot.yAxis().setGridIntervalMinor(50) plot.xAxis().setLabelInterval(5) plot.yAxis().setLabelInterval(70) im = QImage(600, 500, QImage.Format_ARGB32) im.fill(Qt.white) im.setDotsPerMeterX(int(96 / 25.4 * 1000)) im.setDotsPerMeterY(int(96 / 25.4 * 1000)) painter = QPainter(im) rc = QgsRenderContext.fromQPainter(painter) plot.render(rc) painter.end() assert self.imageCheck('plot_2d_intervals', 'plot_2d_intervals', im)