def vectorLayerRender(self, layer, outName): img = QImage(QSize(1600, 900), QImage.Format_ARGB32_Premultiplied) color = QColor(255, 255, 255) img.fill(color.rgb()) p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing) render = QgsMapRenderer() lst = [layer.id()] # add ID of every layer render.setLayerSet(lst) # set extent rect = QgsRectangle(render.fullExtent()) rect.scale(1.1) render.setExtent(rect) # set output size render.setOutputSize(img.size(), img.logicalDpiX()) # do the rendering render.render(p) p.end() # save image path = os.path.join(self.workingFolder, outName + '.tiff') img.save(path, "tiff") return path
def preview(request, layer_slug): """Home page for layers. :param request: The web request. :param layer_slug: The layer """ layer = get_object_or_404(Layer, slug=layer_slug) layer_path = os.path.join( settings.MEDIA_ROOT, 'layers', layer.slug, 'raw') map_layer = QgsVectorLayer(layer_path, layer.name, 'ogr') QgsMapLayerRegistry.instance().addMapLayer(map_layer) layer_uri = tempfile.NamedTemporaryFile( suffix='.png', prefix='inasafe-web-', dir='/tmp/').name # create image image = QImage(QSize(100, 100), QImage.Format_ARGB32_Premultiplied) # set image's background color color = QColor(255, 255, 255) image.fill(color.rgb()) # create painter p = QPainter() p.begin(image) p.setRenderHint(QPainter.Antialiasing) renderer = QgsMapRenderer() # set layer set layers = [map_layer.id()] # add ID of every layer renderer.setLayerSet(layers) # set extent rect = QgsRectangle(renderer.fullExtent()) rect.scale(1.1) renderer.setExtent(rect) # set output size renderer.setOutputSize(image.size(), image.logicalDpiX()) # do the rendering renderer.render(p) p.end() # clean up registry_list = qgis_layers() QgsMapLayerRegistry.instance().removeMapLayer(map_layer.id()) print registry_list # save image image.save(layer_uri, 'png') with open(layer_uri, 'rb') as f: response = HttpResponse(f.read(), content_type='png') os.remove(layer_uri) return response
def save_layer_as_image(layer, extent, path_to_file, max_resolution='1024', image_type = 'tif'): """ Select and save the currently visible extent to a .tif file :param width: image width :type width: int :param height: image height :type height: int :param name: name of the created file :type name: str :return: :rtype: """ # calculate the extents width and height width = extent.width() height = extent.height() # calculate the missing value (width or height) of the output file, based on the extent if width >= height: height_as_dec = max_resolution / width * height width = max_resolution height = int(height_as_dec) else: width_as_dec = max_resolution / height * width width = int(width_as_dec) height = max_resolution # append the resolution to the filename and call the save method filename=layer.name() if filename.startswith("WMS_"): filename=filename.replace("WMS_","") else: resolution_prefix = '{}_{}-'.format(width, height) filename = resolution_prefix + layer.name() img = QImage(QSize(width, height), QImage.Format_ARGB32_Premultiplied) color = QColor(187, 187, 187, 0) img.fill(color.rgba()) leonardo = QPainter() leonardo.begin(img) leonardo.setRenderHint(QPainter.Antialiasing) renderer = QgsMapRenderer() lst = [layer.id()] renderer.setLayerSet(lst) renderer.setExtent(extent) renderer.setOutputSize(img.size(), img.logicalDpiX()) renderer.render(leonardo) leonardo.end() filename += '.{}'.format(image_type) out_path = os.path.join(path_to_file, filename) if img.save(out_path, image_type): return out_path
def createimage(self, extent, crs, outputsize): render = QgsMapRenderer() render.setLayerSet(self.loadedlayers.values()) render.setProjectionsEnabled(True) render.setDestinationCrs(crs) render.setExtent(extent) img = QImage(outputsize, QImage.Format_ARGB32_Premultiplied) img.fill(Qt.transparent) #needed, apparently the QImage() is not empty painter = QPainter() painter.begin(img) painter.setRenderHint(QPainter.Antialiasing) render.setOutputSize(img.size(), img.logicalDpiX()) log("about to render") render.render(painter) log("just rendered") painter.end() return img
def renderLayers(size, layers, imageFileName): imgSize = QSize(size, size) # create image img = QImage(imgSize, QImage.Format_RGB32) # set image's background color color = QColor(255, 255, 255) img.fill(color.rgb()) # create painter p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing) render = QgsMapRenderer() # set layer set render.setLayerSet(layers.keys()) # set extent rect = QgsRectangle(render.fullExtent()) render.setExtent(rect) # set output size render.setOutputSize(img.size(), img.logicalDpiX()) print "render()" # do the rendering render.render(p) p.end() print " ...Done" print "save(" + imageFileName + ")" # save image img.save(imageFileName) print " ...Done"
def saveControlImage(self, tmpimg=''): # don't save control images for RenderVsOtherOutput (Vs) tests, since # those control images belong to a different test result if ('PAL_CONTROL_IMAGE' not in os.environ or 'Vs' in self._TestGroup): return imgpath = self.controlImagePath() # print "saveControlImage: {0}".format(imgpath) testdir = os.path.dirname(imgpath) if not os.path.exists(testdir): os.makedirs(testdir) imgbasepath = \ os.path.join(testdir, os.path.splitext(os.path.basename(imgpath))[0]) for f in glob.glob(imgbasepath + '.*'): if os.path.exists(f): os.remove(f) if tmpimg and os.path.exists(tmpimg): shutil.copyfile(tmpimg, imgpath) else: print '\nsaveControlImage.render(): entered' print '{0}.{1}'.format(self._TestGroup, self._TestFunction) ms = self._MapSettings # class settings """:type: QgsMapSettings""" if self._TestMapSettings is not None: ms = self._TestMapSettings # per test settings print 'self._MapSettings...' print 'ms.layers(): {0}'.format( [self._MapRegistry.mapLayer(i).name() for i in ms.layers()]) print 'ms.outputSize(): {0} x {1}'.format(ms.outputSize().width(), ms.outputSize().height()) print 'ms.outputDpi(): {0}'.format(ms.outputDpi()) print 'ms.mapUnits(): {0}'.format(ms.mapUnits()) print 'ms.extent(): {0}'.format(ms.extent().toString()) print 'ms.hasCrsTransformEnabled(): {0}'.format( ms.hasCrsTransformEnabled()) print 'ms.destinationCrs(): {0}'.format( ms.destinationCrs().authid()) # pal = QgsPalLabeling() pal = self._Pal.clone() # or custom settings are lost pal.init(ms) r = QgsMapRenderer() r.setLabelingEngine(pal) # this seems too redundant r.setOutputSize(ms.outputSize(), ms.outputDpi()) r.setMapUnits(ms.mapUnits()) r.setExtent(ms.extent()) r.setProjectionsEnabled(ms.hasCrsTransformEnabled()) r.setDestinationCrs(ms.destinationCrs()) r.setLayerSet(ms.layers()) ctx = r.rendererContext() ctx.setDrawEditingInformation( ms.testFlag(QgsMapSettings.DrawEditingInfo)) ctx.setForceVectorOutput( ms.testFlag(QgsMapSettings.ForceVectorOutput)) ctx.setUseAdvancedEffects( ms.testFlag(QgsMapSettings.UseAdvancedEffects)) image = QImage(ms.outputSize(), QImage.Format_ARGB32) image.fill(ms.backgroundColor().rgb()) image.setDotsPerMeterX(ms.outputDpi() / 25.4 * 1000) image.setDotsPerMeterY(ms.outputDpi() / 25.4 * 1000) p = QPainter(image) r.render(p) p.end() if not image.save(imgpath, 'png'): os.unlink(imgpath) # delete extraneous world file (always generated) # wrld_file = imgbasepath + '.PNGw' # if os.path.exists(wrld_file): # os.remove(wrld_file) if not os.path.exists(imgpath): raise OSError('Control image not created: {0}'.format(imgpath))
def updateDisplay(self): ''' Add map(s) of all QF components to the canvas based on what's selected in self.lstTimes''' timestamps = [ pd.datetime.strptime(newItem.text(), '%Y-%m-%d %H:%M') for newItem in self.lstTimes.selectedItems() ] for t in timestamps: outs = pd.read_csv(self.model.getFileList()[t], header=0, index_col=0) outLayer = self.outputLayer # Make sure the output file is properly appended (this gets evaluated for non-extra-disaggregated datasets) # because I didn't set an output shapefile path properly if os.path.split(self.outputLayer)[0] == '': outLayer = os.path.join(self.model.downscaledPath, os.path.split(self.outputLayer)[1]) fileToPopulate = self.outputLayer new_layer = populateShapefileFromTemplate( outs, self.featureIdField, outLayer, int(self.outputEPSG), title=t.strftime(' %Y-%m-%d %H:%M UTC')) # Set ranges suited to all the different QF types range_minima = [0, 0.000001, 0.1, 1, 10, 100] range_maxima = [0.000001, 0.1, 1, 10, 100, 1000] colours = [ '#CECECE', '#FEE6CE', '#FDAE6B', '#F16913', '#D94801', '#7F2704' ] opacity = 1 for component in self.componentTranslation.values(): layerName = component + t.strftime(' %Y-%m-%d %H:%M UTC') if component == self.componentTranslation.values()[0]: colourRanges(new_layer, component, opacity, range_minima, range_maxima, colours) new_layer.setLayerName(layerName) layerId = new_layer.id() QgsMapLayerRegistry.instance().addMapLayer(new_layer) proportion = new_layer.extent().height( ) / new_layer.extent().width() else: # Have to clone. Can't seem to duplicate a map layer... layer = duplicateVectorLayer(new_layer) layer.setLayerName(layerName) colourRanges(layer, component, opacity, range_minima, range_maxima, colours) layerId = layer.id() QgsMapLayerRegistry.instance().addMapLayer(layer) proportion = layer.extent().height() / layer.extent( ).width() maxSize = 2000 # Max size of output image if proportion > 1: hSize = maxSize / proportion vSize = maxSize else: hSize = maxSize vSize = maxSize * proportion # create image in proportion with layer img = QImage(QSize(hSize, vSize), QImage.Format_ARGB32_Premultiplied) # set image's background color color = QColor(255, 255, 255) img.fill(color.rgb()) # create painter p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing) render = QgsMapRenderer() # set layer set lst = [layerId] # add ID of every layer render.setLayerSet(lst) # set extent rect = QgsRectangle(render.fullExtent()) rect.scale(1.1) render.setExtent(rect) # set output size render.setOutputSize(img.size(), img.logicalDpiX()) # do the rendering render.render(p) p.end() # save image img.save( os.path.join( self.model.renderPath, component + t.strftime('_%Y-%m-%d_%H-%M_UTC.png')), "png")
def saveControlImage(self, tmpimg=''): # don't save control images for RenderVsOtherOutput (Vs) tests, since # those control images belong to a different test result if ('PAL_CONTROL_IMAGE' not in os.environ or 'Vs' in self._TestGroup): return imgpath = self.controlImagePath() # print "saveControlImage: {0}".format(imgpath) testdir = os.path.dirname(imgpath) if not os.path.exists(testdir): os.makedirs(testdir) imgbasepath = \ os.path.join(testdir, os.path.splitext(os.path.basename(imgpath))[0]) for f in glob.glob(imgbasepath + '.*'): if os.path.exists(f): os.remove(f) if tmpimg and os.path.exists(tmpimg): shutil.copyfile(tmpimg, imgpath) else: print '\nsaveControlImage.render(): entered' print '{0}.{1}'.format(self._TestGroup, self._TestFunction) ms = self._MapSettings # class settings """:type: QgsMapSettings""" if self._TestMapSettings is not None: ms = self._TestMapSettings # per test settings print 'self._MapSettings...' print 'ms.layers(): {0}'.format( [self._MapRegistry.mapLayer(i).name() for i in ms.layers()] ) print 'ms.outputSize(): {0} x {1}'.format( ms.outputSize().width(), ms.outputSize().height()) print 'ms.outputDpi(): {0}'.format(ms.outputDpi()) print 'ms.mapUnits(): {0}'.format(ms.mapUnits()) print 'ms.extent(): {0}'.format(ms.extent().toString()) print 'ms.hasCrsTransformEnabled(): {0}'.format( ms.hasCrsTransformEnabled()) print 'ms.destinationCrs(): {0}'.format( ms.destinationCrs().authid()) # pal = QgsPalLabeling() pal = self._Pal.clone() # or custom settings are lost pal.init(ms) r = QgsMapRenderer() r.setLabelingEngine(pal) # this seems too redundant r.setOutputSize(ms.outputSize(), ms.outputDpi()) r.setMapUnits(ms.mapUnits()) r.setExtent(ms.extent()) r.setProjectionsEnabled(ms.hasCrsTransformEnabled()) r.setDestinationCrs(ms.destinationCrs()) r.setLayerSet(ms.layers()) ctx = r.rendererContext() ctx.setDrawEditingInformation( ms.testFlag(QgsMapSettings.DrawEditingInfo)) ctx.setForceVectorOutput( ms.testFlag(QgsMapSettings.ForceVectorOutput)) ctx.setUseAdvancedEffects( ms.testFlag(QgsMapSettings.UseAdvancedEffects)) image = QImage(ms.outputSize(), QImage.Format_ARGB32) image.fill(ms.backgroundColor().rgb()) image.setDotsPerMeterX(ms.outputDpi() / 25.4 * 1000) image.setDotsPerMeterY(ms.outputDpi() / 25.4 * 1000) p = QPainter(image) r.render(p) p.end() if not image.save(imgpath, 'png'): os.unlink(imgpath) # delete extraneous world file (always generated) # wrld_file = imgbasepath + '.PNGw' # if os.path.exists(wrld_file): # os.remove(wrld_file) if not os.path.exists(imgpath): raise OSError('Control image not created: {0}'.format(imgpath))
img = QImage(iwidth, iheight, QImage.Format_RGB32) img.setDotsPerMeterX(dpi / 25.4 * 1000) img.setDotsPerMeterY(dpi / 25.4 * 1000) img.fill(qRgb(255, 255, 255)) dpi = img.logicalDpiX() print("Image DPI: %d" % dpi) render.setOutputSize(QSize(img.width(), img.height()), dpi) render.setDestinationCrs(crs) render.setProjectionsEnabled(True) render.setMapUnits(crs.mapUnits()) render.setExtent(extent) print("Scale: %f" % render.scale()) painter = QPainter(img) painter.setRenderHint(QPainter.Antialiasing) render.render(painter) painter.end() ba = QByteArray() bf = QBuffer(ba) bf.open(QIODevice.WriteOnly) img.save(bf, 'PNG') bf.close() with open(args.output, 'wb') as fd: fd.write(ba)