def layerRenderByComposer(self, layer, outName): self.hideOtherLayers(layer) mapRenderer = self.iface.mapCanvas().mapRenderer() mapRenderer.setLayerSet([layer.id()]) c = QgsComposition(mapRenderer) c.setPlotStyle(QgsComposition.Print) c.setPaperSize(297, 210) c.setPrintResolution(300) x, y = 0, 0 w, h = c.paperWidth(), c.paperHeight() composerMap = QgsComposerMap(c, x, y, w, h) composerMap.setMapCanvas(self.iface.mapCanvas()) c.addItem(composerMap) legend = QgsComposerLegend(c) root = QgsProject.instance().layerTreeRoot().clone() root = self.buildLegendLayerTree(root, [layer]) legend.modelV2().setRootGroup(root) legend.setItemPosition(250, 20) legend.setResizeToContents(True) c.addItem(legend) label = QgsComposerLabel(c) label.setMarginX(125) label.setMarginY(10) label.setText(layer.name()) label.setFont(QFont('PMinliu', 20, QFont.Bold)) label.adjustSizeToText() c.addItem(label) item = QgsComposerScaleBar(c) item.setStyle('Double Box') # optionally modify the style item.setComposerMap(composerMap) item.applyDefaultSize() item.setItemPosition(10, 190) c.addItem(item) dpmm = 300 / 25.4 width = int(dpmm * c.paperWidth()) width = int(width / 2) * 2 height = int(dpmm * c.paperHeight()) height = int(height / 2) * 2 Dots = int(dpmm * 1000 / 2) * 2 # create output image and initialize it image = QImage(QSize(width, height), QImage.Format_ARGB32) image.setDotsPerMeterX(Dots) image.setDotsPerMeterY(Dots) image.fill(0) # render the composition imagePainter = QPainter(image) c.renderPage(imagePainter, 0) imagePainter.end() outName = os.path.join(self.workingFolder, outName + '.png') image.save(outName, "png") return outName
def draw_native_scalebar(self, composer_map, top_offset): """Draw a scale bar using QGIS' native drawing. In the case of geographic maps, scale will be in degrees, not km. :param composer_map: Composer map on which to draw the scalebar. :type composer_map: QgsComposerMap :param top_offset: Vertical offset at which the logo should be drawn. :type top_offset: int """ LOGGER.debug('InaSAFE Map drawNativeScaleBar called') myScaleBar = QgsComposerScaleBar(self.composition) myScaleBar.setStyle('Numeric') # optionally modify the style myScaleBar.setComposerMap(composer_map) myScaleBar.applyDefaultSize() myScaleBarHeight = myScaleBar.boundingRect().height() myScaleBarWidth = myScaleBar.boundingRect().width() # -1 to avoid overlapping the map border myScaleBar.setItemPosition( self.pageMargin + 1, top_offset + self.mapHeight - (myScaleBarHeight * 2), myScaleBarWidth, myScaleBarHeight) myScaleBar.setFrameEnabled(self.showFramesFlag)
def drawNativeScaleBar(self, theComposerMap, theTopOffset): """Draw a scale bar using QGIS' native drawing - in the case of geographic maps, scale will be in degrees, not km. Args: None Returns: None Raises: Any exceptions raised by the InaSAFE library will be propagated. """ LOGGER.debug("InaSAFE Map drawNativeScaleBar called") myScaleBar = QgsComposerScaleBar(self.composition) myScaleBar.setStyle("Numeric") # optionally modify the style myScaleBar.setComposerMap(theComposerMap) myScaleBar.applyDefaultSize() myScaleBarHeight = myScaleBar.boundingRect().height() myScaleBarWidth = myScaleBar.boundingRect().width() # -1 to avoid overlapping the map border myScaleBar.setItemPosition( self.pageMargin + 1, theTopOffset + self.mapHeight - (myScaleBarHeight * 2), myScaleBarWidth, myScaleBarHeight, ) myScaleBar.setFrame(self.showFramesFlag)
def drawNativeScaleBar(self, theComposerMap, theTopOffset): """Draw a scale bar using QGIS' native drawing - in the case of geographic maps, scale will be in degrees, not km. Args: None Returns: None Raises: Any exceptions raised by the InaSAFE library will be propagated. """ LOGGER.debug('InaSAFE Map drawNativeScaleBar called') myScaleBar = QgsComposerScaleBar(self.composition) myScaleBar.setStyle('Numeric') # optionally modify the style myScaleBar.setComposerMap(theComposerMap) myScaleBar.applyDefaultSize() myScaleBarHeight = myScaleBar.boundingRect().height() myScaleBarWidth = myScaleBar.boundingRect().width() # -1 to avoid overlapping the map border myScaleBar.setItemPosition( self.pageMargin + 1, theTopOffset + self.mapHeight - (myScaleBarHeight * 2), myScaleBarWidth, myScaleBarHeight) myScaleBar.setFrame(self.showFramesFlag)
def draw_native_scalebar(self, composer_map, top_offset): """Draw a scale bar using QGIS' native drawing. In the case of geographic maps, scale will be in degrees, not km. :param composer_map: Composer map on which to draw the scalebar. :type composer_map: QgsComposerMap :param top_offset: Vertical offset at which the logo should be drawn. :type top_offset: int """ LOGGER.debug('InaSAFE Map drawNativeScaleBar called') scale_bar = QgsComposerScaleBar(self.composition) scale_bar.setStyle('Numeric') # optionally modify the style scale_bar.setComposerMap(composer_map) scale_bar.applyDefaultSize() scale_bar_height = scale_bar.boundingRect().height() scale_bar_width = scale_bar.boundingRect().width() # -1 to avoid overlapping the map border scale_bar.setItemPosition( self.page_margin + 1, top_offset + self.map_height - (scale_bar_height * 2), scale_bar_width, scale_bar_height) scale_bar.setFrameEnabled(self.show_frames)