def renderedImage(self, width, height, extent, transp_background=False, layerids=None): if QGis.QGIS_VERSION_INT < 20700: return self._renderedImage2(width, height, extent, transp_background, layerids) # render layers with QgsMapRendererCustomPainterJob from qgis.core import QgsMapRendererCustomPainterJob antialias = True settings = self.exportSettings.mapSettings # store old map settings old_outputSize = settings.outputSize() old_extent = settings.extent() old_rotation = settings.rotation() old_layerids = settings.layers() old_backgroundColor = settings.backgroundColor() # map settings settings.setOutputSize(QSize(width, height)) settings.setExtent(extent.unrotatedRect()) settings.setRotation(extent.rotation()) if layerids is not None: settings.setLayers(layerids) if transp_background: settings.setBackgroundColor(QColor(Qt.transparent)) #else: #TODO: remove #settings.setBackgroundColor(self.exportSettings.canvas.canvasColor()) has_pluginlayer = False for layerId in settings.layers(): layer = QgsMapLayerRegistry.instance().mapLayer(layerId) if layer and layer.type() == QgsMapLayer.PluginLayer: has_pluginlayer = True break # create an image image = QImage(width, height, QImage.Format_ARGB32_Premultiplied) painter = QPainter() painter.begin(image) if antialias: painter.setRenderHint(QPainter.Antialiasing) # rendering job = QgsMapRendererCustomPainterJob(settings, painter) if has_pluginlayer: job.renderSynchronously() # use this method so that TileLayerPlugin layer is rendered correctly else: job.start() job.waitForFinished() painter.end() # restore map settings settings.setOutputSize(old_outputSize) settings.setExtent(old_extent) settings.setRotation(old_rotation) settings.setLayers(old_layerids) settings.setBackgroundColor(old_backgroundColor) return tools.base64image(image)
def renderedImage(self, width, height, extent, transp_background=False, layerids=None): # render layers with QgsMapRendererCustomPainterJob from qgis.core import QgsMapRendererCustomPainterJob antialias = True settings = self.exportSettings.mapSettings # store old map settings old_outputSize = settings.outputSize() old_extent = settings.extent() old_rotation = settings.rotation() old_layers = settings.layers() old_backgroundColor = settings.backgroundColor() # map settings settings.setOutputSize(QSize(width, height)) settings.setExtent(extent.unrotatedRect()) settings.setRotation(extent.rotation()) if layerids: settings.setLayers(tools.getLayersByLayerIds(layerids)) if transp_background: settings.setBackgroundColor(QColor(Qt.transparent)) has_pluginlayer = False for layer in settings.layers(): if layer and layer.type() == QgsMapLayer.PluginLayer: has_pluginlayer = True break # create an image image = QImage(width, height, QImage.Format_ARGB32_Premultiplied) painter = QPainter() painter.begin(image) if antialias: painter.setRenderHint(QPainter.Antialiasing) # rendering job = QgsMapRendererCustomPainterJob(settings, painter) if has_pluginlayer: job.renderSynchronously( ) # use this method so that TileLayerPlugin layer is rendered correctly else: job.start() job.waitForFinished() painter.end() # restore map settings settings.setOutputSize(old_outputSize) settings.setExtent(old_extent) settings.setRotation(old_rotation) settings.setLayers(old_layers) settings.setBackgroundColor(old_backgroundColor) return image
def renderedImage(self, width, height, extent, transp_background=False, layerids=None): if QGis.QGIS_VERSION_INT < 20700: return self._renderedImage2(width, height, extent, transp_background, layerids) from qgis.core import QgsMapRendererCustomPainterJob antialias = True # render map image with QgsMapRendererCustomPainterJob settings = self.context.canvas.mapSettings() settings.setOutputSize(QSize(width, height)) settings.setExtent(extent.unrotatedRect()) settings.setRotation(extent.rotation()) if layerids: settings.setLayers(layerids) if transp_background: settings.setBackgroundColor(QColor(Qt.transparent)) #else: #TODO: remove #settings.setBackgroundColor(self.context.canvas.canvasColor()) image = QImage(width, height, QImage.Format_ARGB32_Premultiplied) painter = QPainter() painter.begin(image) if antialias: painter.setRenderHint(QPainter.Antialiasing) job = QgsMapRendererCustomPainterJob(settings, painter) job.start() job.waitForFinished() painter.end() return tools.base64image(image)
def paint(self, painter, option, widget): self.draw_background(painter) painter.setClipRect(0, 0, self.__width - 1, self.__height - 2) image_depth = (self.__image_depth_range[1] - self.__image_depth_range[0]) ymin = -(self.__max_z - self.__image_depth_range[0] ) / image_depth * self.__layer.height() ymax = -(self.__min_z - self.__image_depth_range[0] ) / image_depth * self.__layer.height() # we need to also set the width of the extent according to the aspect ratio # so that QGIS allows to "zoom in" ar = float(self.__layer.width()) / self.__layer.height() nw = ar * (ymax - ymin) lext = QgsRectangle(self.__x_offset, ymin, self.__x_offset + nw - 1, ymax) # QgsMapSettings.setExtent() recomputes the given extent # so that the scene is centered # We reproduce here this computation to set the raster # x coordinate to what we want mw = float(self.__width - 2) mh = float(self.__height - 2) mu_p_px_y = lext.height() / mh mu_p_px_x = lext.width() / mw dxmin = lext.xMinimum() dxmax = lext.xMaximum() dymin = lext.yMinimum() dymax = lext.yMaximum() if mu_p_px_y > mu_p_px_x: mu_p_px = mu_p_px_y whitespace = ((mw * mu_p_px) - lext.width()) * 0.5 dxmin -= whitespace dxmax += whitespace else: mu_p_px = mu_p_px_x whitespace = ((mh * mu_p_px) - lext.height()) * 0.5 dymin -= whitespace dymax += whitespace lext = QgsRectangle(dxmin + whitespace, dymin, dxmax + whitespace, dymax) ms = QgsMapSettings() ms.setExtent(lext) ms.setOutputSize(QSize(mw, mh)) ms.setLayers([self.__layer]) if self.selected(): ms.setBackgroundColor(QColor("#ffff66")) job = QgsMapRendererCustomPainterJob(ms, painter) painter.translate(1, 1) job.start() job.waitForFinished() painter.translate(-1, -1)
def make_image(self, mapSettings): image = QImage(mapSettings.outputSize(), QImage.Format_RGB32) p = QPainter() p.begin(image) mapRenderer = QgsMapRendererCustomPainterJob(mapSettings, p) mapRenderer.start() mapRenderer.waitForFinished() p.end() return image
def save_layer_image(filename, layer, extent): h = int(extent.height() / extent.width() * WIDTH) img = QImage(QSize(WIDTH, h), QImage.Format_A2BGR30_Premultiplied) color = QColor(255, 255, 255, 255) img.fill(color.rgba()) p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing) ms = QgsMapSettings() ms.setBackgroundColor(color) ms.setLayers([layer]) ms.setExtent(extent) ms.setOutputSize(img.size()) render = QgsMapRendererCustomPainterJob(ms, p) render.start() render.waitForFinished() p.end() img.save(filename)
def _saveLayerThumbnail(layer): filename = tempFileInSubFolder("thumbnail.png") img = QImage(QSize(800, 800), QImage.Format_A2BGR30_Premultiplied) color = QColor(255, 255, 255, 255) img.fill(color.rgba()) p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing) ms = QgsMapSettings() ms.setBackgroundColor(color) ms.setLayers([layer]) ms.setExtent(layer.extent()) ms.setOutputSize(img.size()) render = QgsMapRendererCustomPainterJob(ms, p) render.start() render.waitForFinished() p.end() img.save(filename) return filename
def test_different_dpi_target_vector(self): """Test rendering a raster layer with vector output and a target dpi Used when layout previewing """ # modify labeling settings label_settings = self.polys_layer.labeling().settings() fmt = label_settings.format() # enable a mask fmt.mask().setEnabled(True) fmt.mask().setSize(4.0) # and mask other symbol layers underneath fmt.mask().setMaskedSymbolLayers([ # the black part of roads QgsSymbolLayerReference(self.lines_layer.id(), QgsSymbolLayerId("", 0)) ]) label_settings.setFormat(fmt) self.polys_layer.labeling().setSettings(label_settings) self.map_settings.setLayers( [self.lines_layer, self.polys_layer, self.raster_layer]) self.map_settings.setOutputDpi(81) self.map_settings.setDpiTarget(300) self.map_settings.setFlag(Qgis.MapSettingsFlag.ForceVectorOutput, True) image = QImage(self.map_settings.deviceOutputSize(), self.map_settings.outputImageFormat()) image.setDevicePixelRatio(self.map_settings.devicePixelRatio()) image.setDotsPerMeterX(int(1000 * self.map_settings.outputDpi() / 25.4)) image.setDotsPerMeterY(int(1000 * self.map_settings.outputDpi() / 25.4)) image.fill(Qt.transparent) pImg = QPainter() pImg.begin(image) job = QgsMapRendererCustomPainterJob(self.map_settings, pImg) job.start() job.waitForFinished() pImg.end() tmp = getTempfilePath('png') image.save(tmp) control_name = "different_dpi_target_vector" self.checker.setControlName(control_name) self.checker.setRenderedImage(tmp) res = self.checker.compareImages(control_name) self.report += self.checker.report() self.assertTrue(res) # Same test with high dpi self.map_settings.setDevicePixelRatio(2) image = QImage(self.map_settings.deviceOutputSize(), self.map_settings.outputImageFormat()) image.setDevicePixelRatio(self.map_settings.devicePixelRatio()) image.setDotsPerMeterX(int(1000 * self.map_settings.outputDpi() / 25.4)) image.setDotsPerMeterY(int(1000 * self.map_settings.outputDpi() / 25.4)) image.fill(Qt.transparent) pImg = QPainter() pImg.begin(image) job = QgsMapRendererCustomPainterJob(self.map_settings, pImg) job.start() job.waitForFinished() pImg.end() tmp = getTempfilePath('png') image.save(tmp) control_name = "different_dpi_target_vector_hdpi" self.checker.setControlName(control_name) self.checker.setRenderedImage(tmp) res = self.checker.compareImages(control_name) self.report += self.checker.report() self.assertTrue(res)
def cvt_vtr(self): QSWATMOD_path_dict = self.dirs_and_paths() selectedVector = self.dlg.comboBox_vector_lyrs.currentText() layer = QgsProject.instance().mapLayersByName(str(selectedVector))[0] # Find .dis file and read number of rows, cols, x spacing, and y spacing (not allowed to change) for filename in glob.glob(str(QSWATMOD_path_dict['SMfolder']) + "/*.dis"): with open(filename, "r") as f: data = [] for line in f.readlines(): if not line.startswith("#"): data.append(line.replace('\n', '').split()) nrow = int(data[0][1]) ncol = int(data[0][2]) delr = float(data[2][1]) # is the cell width along rows (y spacing) delc = float( data[3][1]) # is the cell width along columns (x spacing). # get extent ext = layer.extent() xmin = ext.xMinimum() xmax = ext.xMaximum() ymin = ext.yMinimum() ymax = ext.yMaximum() extent = "{a},{b},{c},{d}".format(a=xmin, b=xmax, c=ymin, d=ymax) fdnames = [ field.name() for field in layer.dataProvider().fields() if not (field.name() == 'fid' or field.name() == 'id' or field.name() == 'xmin' or field.name() == 'xmax' or field.name() == 'ymin' or field.name() == 'ymax' or field.name() == 'grid_id' or field.name() == 'row' or field.name() == 'col' or field.name() == 'elev_mf') ] # Create swatmf_results tree inside root = QgsProject.instance().layerTreeRoot() if root.findGroup("swatmf_results"): swatmf_results = root.findGroup("swatmf_results") else: swatmf_results = root.insertGroup(0, "swatmf_results") if root.findGroup(selectedVector): rastergroup = root.findGroup(selectedVector) else: rastergroup = swatmf_results.insertGroup(0, selectedVector) per = 0 self.dlg.progressBar_cvt_vtr.setValue(0) for fdnam in fdnames: QCoreApplication.processEvents() nodata = float(self.dlg.lineEdit_nodata.text()) mincolor = self.dlg.mColorButton_min_rmap.color().name() maxcolor = self.dlg.mColorButton_max_rmap.color().name() name = fdnam name_ext = "{}.tif".format(name) output_dir = QSWATMOD_path_dict['SMshps'] # create folder for each layer output rasterpath = os.path.join(output_dir, selectedVector) if not os.path.exists(rasterpath): os.makedirs(rasterpath) output_raster = os.path.join(rasterpath, name_ext) params = { 'INPUT': layer, 'FIELD': fdnam, 'UNITS': 1, 'WIDTH': delc, 'HEIGHT': delr, 'EXTENT': extent, 'NODATA': nodata, 'DATA_TYPE': 5, #Float32 'OUTPUT': output_raster } processing.run("gdal:rasterize", params) rasterlayer = QgsRasterLayer(output_raster, '{0} ({1})'.format(fdnam, selectedVector)) QgsProject.instance().addMapLayer(rasterlayer, False) rastergroup.insertChildNode(0, QgsLayerTreeLayer(rasterlayer)) stats = rasterlayer.dataProvider().bandStatistics( 1, QgsRasterBandStats.All) rmin = stats.minimumValue rmax = stats.maximumValue fnc = QgsColorRampShader() lst = [ QgsColorRampShader.ColorRampItem(rmin, QColor(mincolor)), QgsColorRampShader.ColorRampItem(rmax, QColor(maxcolor)) ] fnc.setColorRampItemList(lst) fnc.setColorRampType(QgsColorRampShader.Interpolated) shader = QgsRasterShader() shader.setRasterShaderFunction(fnc) renderer = QgsSingleBandPseudoColorRenderer(rasterlayer.dataProvider(), 1, shader) rasterlayer.setRenderer(renderer) rasterlayer.triggerRepaint() # create image img = QImage(QSize(800, 800), QImage.Format_ARGB32_Premultiplied) # set background color # bcolor = QColor(255, 255, 255, 255) bcolor = QColor(255, 255, 255, 0) img.fill(bcolor.rgba()) # create painter p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing) # create map settings ms = QgsMapSettings() ms.setBackgroundColor(bcolor) # set layers to render flayer = QgsProject.instance().mapLayersByName(rasterlayer.name()) ms.setLayers([flayer[0]]) # set extent rect = QgsRectangle(ms.fullExtent()) rect.scale(1.1) ms.setExtent(rect) # set ouptut size ms.setOutputSize(img.size()) # setup qgis map renderer render = QgsMapRendererCustomPainterJob(ms, p) render.start() render.waitForFinished() # get timestamp p.drawImage(QPoint(), img) pen = QPen(Qt.red) pen.setWidth(2) p.setPen(pen) font = QFont() font.setFamily('Times') # font.setBold(True) font.setPointSize(18) p.setFont(font) # p.setBackground(QColor('sea green')) doesn't work p.drawText(QRect(0, 0, 800, 800), Qt.AlignRight | Qt.AlignBottom, fdnam) p.end() # save the image img.save(os.path.join(rasterpath, '{:03d}_{}.jpg'.format(per, fdnam))) # Update progress bar per += 1 progress = round((per / len(fdnames)) * 100) self.dlg.progressBar_cvt_vtr.setValue(progress) QCoreApplication.processEvents() self.dlg.raise_() duration = self.dlg.doubleSpinBox_ani_r_time.value() # filepaths fp_in = os.path.join(rasterpath, '*.jpg') fp_out = os.path.join(rasterpath, '{}.gif'.format(selectedVector)) # https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#gif fimg, *fimgs = [Image.open(f) for f in sorted(glob.glob(fp_in))] fimg.save(fp=fp_out, format='GIF', append_images=fimgs, save_all=True, duration=duration * 1000, loop=0, transparency=0) msgBox = QMessageBox() msgBox.setWindowIcon(QtGui.QIcon(':/QSWATMOD2/pics/sm_icon.png')) msgBox.setWindowTitle("Coverted!") msgBox.setText( "Fields from {} were converted successfully!".format(selectedVector)) msgBox.exec_() questionBox = QMessageBox() questionBox.setWindowIcon(QtGui.QIcon(':/QSWATMOD2/pics/sm_icon.png')) reply = QMessageBox.question(questionBox, 'Open?', 'Do you want to open the animated gif file?', QMessageBox.Yes, QMessageBox.No) if reply == QMessageBox.Yes: os.startfile(os.path.join(rasterpath, '{}.gif'.format(selectedVector)))
def render(self, params): self.check_required_params(params) with change_directory(self.project_root): crs = QgsCoordinateReferenceSystem() crs.createFromSrid(params.get('srs')) img = QImage( QSize(*params.get('image_size')), QImage.Format_ARGB32_Premultiplied ) dpm = 1 / 0.00028 img.setDotsPerMeterX(dpm) img.setDotsPerMeterY(dpm) # set background color bgcolor = params.get('bgcolor') if params.get('transparent'): # fully transparent bgcolor.append(0) else: # fully opaque bgcolor.append(255) color = QColor(*bgcolor) img.fill(color) map_settings = QgsMapSettings() map_settings.setBackgroundColor(color) map_settings.setDestinationCrs(crs) map_settings.setCrsTransformEnabled(True) map_settings.setExtent(QgsRectangle(*params.get('bbox'))) map_settings.setOutputDpi(img.logicalDpiX()) map_settings.setOutputSize(img.size()) map_settings.setMapUnits(crs.mapUnits()) layers = params.get('layers') self.setTransparencies(layers, params.get('transparencies')) map_settings.setLayers(layers) p = QPainter() p.begin(img) job = QgsMapRendererCustomPainterJob(map_settings, p) job.start() job.waitForFinished() map_buffer = QBuffer() map_buffer.open(QIODevice.ReadWrite) if params.get('image_format') == 'jpeg': img.save(map_buffer, 'JPEG') elif params.get('image_format') == 'png8': png8 = img.convertToFormat(QImage.Format_Indexed8) png8.save(map_buffer, "PNG") else: img.save(map_buffer, 'PNG') # clean up p.end() map_buffer.close() return map_buffer.data()
def GDX_Publisher(self): # print ("GDX_Publisher -------------------------------\n") tumpdir = unicode( QFileInfo(QgsApplication.qgisUserDatabaseFilePath()).path() ) + "/python/plugins/gearthview3/_WebServer" # print (tumpdir) adesso = str(datetime.datetime.now()) adesso = adesso.replace(" ", "_") adesso = adesso.replace(":", "_") adesso = adesso.replace(".", "_") # print ("adesso: <%s>\n" %(adesso)) # HERE IT DELETES THE OLD IMAGE ------------------------------------ # (if you comment these, images still remain ... :) for filename in glob.glob(str(tumpdir + '/*.png')): os.remove(str(filename)) for filename in glob.glob(str(tumpdir + '/*.pngw')): os.remove(str(filename)) # ------------------------------------------------------------------ mapCanvas = self.iface.mapCanvas() text = mapCanvas.extent().toString() text1 = text.replace(",", " ") text2 = text1.replace(" : ", ",") # print ("extent: <%s>\n" %(text2)) layer = mapCanvas.currentLayer() # print ("Layer: <%s>\n" %(layer.name() )) extent = mapCanvas.extent() crsSrc = mapCanvas.mapSettings().destinationCrs() crsDest = QgsCoordinateReferenceSystem(4326) try: transform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance()) except: transform = QgsCoordinateTransform(crsSrc, crsDest) projectedExtent = transform.transformBoundingBox(extent) x1 = projectedExtent.xMinimum() y1 = projectedExtent.yMinimum() x2 = projectedExtent.xMaximum() y2 = projectedExtent.yMinimum() x3 = projectedExtent.xMaximum() y3 = projectedExtent.yMaximum() x4 = projectedExtent.xMinimum() y4 = projectedExtent.yMaximum() xc = (x1 + x3) / 2. yc = (y1 + y3) / 2. out_folder = tumpdir # create output image and initialize it mapRect = mapCanvas.extent() width = mapCanvas.width() height = mapCanvas.height() srs = mapCanvas.mapSettings().destinationCrs() # print (width, height) # MINORU # canvas = mapCanvas ## image = QImage(size.width(), size.height(), QImage.Format_ARGB32_Premultiplied) # image = QImage(QSize(math.ceil(width), math.ceil(height)), QImage.Format_ARGB32) # image.fill(Qt.transparent) ## image.fill(QColor(0)) # painter = QPainter() # painter.setRenderHint(QPainter.Antialiasing, True) # painter.setRenderHint(QPainter.TextAntialiasing, True) # painter.setRenderHint(QPainter.SmoothPixmapTransform, True) ## painter.setRenderHint(QPainter.transparent, True) # ## brush = QtGui.QBrush() ## brush.setColor(QtGui.QColor(0)) ## painter.setBackground(self, 0) # # painter.begin(image) # canvas.render(painter) # painter.end() # MINORU # MINORU2 # settings = self.exportSettings.mapSettings settings = QgsMapSettings() # extent = settings.extent() extent = mapCanvas.extent() # store old map settings # old_outputSize = settings.outputSize() # old_extent = settings.extent() # old_rotation = settings.rotation() # old_layers = settings.layers() # old_backgroundColor = settings.backgroundColor() # map settings settings.setOutputSize(QSize(width, height)) # settings.setExtent(extent.unrotatedRect()) # settings.setRotation(extent.rotation()) # if layerids: # settings.setLayers(tools.getLayersByLayerIds(layerids)) # if transp_background: settings.setBackgroundColor(QColor(Qt.transparent)) has_pluginlayer = False for layer in settings.layers(): if layer and layer.type() == QgsMapLayer.PluginLayer: has_pluginlayer = True break # create an image image = QImage(width, height, QImage.Format_ARGB32_Premultiplied) painter = QPainter() painter.begin(image) # if antialias: # painter.setRenderHint(QPainter.Antialiasing) # rendering job = QgsMapRendererCustomPainterJob(settings, painter) if has_pluginlayer: job.renderSynchronously( ) # use this method so that TileLayerPlugin layer is rendered correctly else: job.start() job.waitForFinished() painter.end() # restore map settings # settings.setOutputSize(old_outputSize) # settings.setExtent(old_extent) # settings.setRotation(old_rotation) # settings.setLayers(old_layers) # settings.setBackgroundColor(old_backgroundColor) # MINORU2 kml = codecs.open(out_folder + '/doc.kml', 'w', encoding='utf-8') kml.write('<?xml version="1.0" encoding="UTF-8"?>\n') kml.write( '<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">\n' ) kml.write(' <Document>\n') kml.write(' <name>QGisView</name>\n') kml.write(' <Snippet maxLines="0"></Snippet>\n') # loc = (" <description><![CDATA[https://map.what3words.com/%.7lf,%.7lf]]></description>\n") %(yc, xc) # kml.write(loc) kml.write(' <open>1</open>\n') kml.write(' <Style id="sh_style">\n') kml.write(' <PolyStyle>\n') kml.write(' <color>7fff8080</color>\n') kml.write(' </PolyStyle>\n') kml.write(' </Style>\n') kml.write(' <StyleMap id="msn_style">\n') kml.write(' <Pair>\n') kml.write(' <key>normal</key>\n') kml.write(' <styleUrl>#sn_style</styleUrl>\n') kml.write(' </Pair>\n') kml.write(' <Pair>\n') kml.write(' <key>highlight</key>\n') kml.write(' <styleUrl>#sh_style</styleUrl>\n') kml.write(' </Pair>\n') kml.write(' </StyleMap>\n') kml.write(' <Style id="sn_style">\n') kml.write(' <PolyStyle>\n') kml.write(' <color>00ff8080</color>\n') kml.write(' <fill>0</fill>\n') kml.write(' </PolyStyle>\n') kml.write(' </Style>\n') kml.write(' <Style id="sh_ylw-pushpin">\n') kml.write(' <IconStyle>\n') kml.write(' <scale>1.2</scale>\n') kml.write(' </IconStyle>\n') kml.write(' <PolyStyle>\n') kml.write(' <fill>0</fill>\n') kml.write(' </PolyStyle>\n') kml.write(' </Style>\n') kml.write(' <Style id="sn_ylw-pushpin">\n') kml.write(' <PolyStyle>\n') kml.write(' <fill>0</fill>\n') kml.write(' </PolyStyle>\n') kml.write(' </Style>\n') kml.write(' <StyleMap id="msn_ylw-pushpin">\n') kml.write(' <Pair>\n') kml.write(' <key>normal</key>\n') kml.write(' <styleUrl>#sn_ylw-pushpin</styleUrl>\n') kml.write(' </Pair>\n') kml.write(' <Pair>\n') kml.write(' <key>highlight</key>\n') kml.write(' <styleUrl>#sh_ylw-pushpin</styleUrl>\n') kml.write(' </Pair>\n') kml.write(' </StyleMap>\n') kml.write(' <StyleMap id="msn_style">\n') kml.write(' <Pair>\n') kml.write(' <key>normal</key>\n') kml.write(' <styleUrl>#sn_style</styleUrl>\n') kml.write(' </Pair>\n') kml.write(' <Pair>\n') kml.write(' <key>highlight</key>\n') kml.write(' <styleUrl>#sh_style</styleUrl>\n') kml.write(' </Pair>\n') kml.write(' </StyleMap>\n') kml.write(' <Style id="hl">\n') kml.write(' <IconStyle>\n') kml.write(' <scale>0.7</scale>\n') kml.write(' <Icon>\n') kml.write( ' <href>http://maps.google.com/mapfiles/kml/shapes/placemark_circle_highlight.png</href>\n' ) kml.write(' </Icon>\n') kml.write(' </IconStyle>\n') kml.write(' <LabelStyle>\n') kml.write(' <scale>0.7</scale>\n') kml.write(' </LabelStyle>\n') kml.write(' <ListStyle>\n') kml.write(' </ListStyle>\n') kml.write(' </Style>\n') kml.write(' <Style id="default">\n') kml.write(' <IconStyle>\n') kml.write(' <scale>0.7</scale>\n') kml.write(' <Icon>\n') kml.write( ' <href>http://maps.google.com/mapfiles/kml/shapes/placemark_circle.png</href>\n' ) kml.write(' </Icon>\n') kml.write(' </IconStyle>\n') kml.write(' <LabelStyle>\n') kml.write(' <scale>0.7</scale>\n') kml.write(' </LabelStyle>\n') kml.write(' <ListStyle>\n') kml.write(' </ListStyle>\n') kml.write(' </Style>\n') kml.write(' <StyleMap id="default0">\n') kml.write(' <Pair>\n') kml.write(' <key>normal</key>\n') kml.write(' <styleUrl>#default</styleUrl>\n') kml.write(' </Pair>\n') kml.write(' <Pair>\n') kml.write(' <key>highlight</key>\n') kml.write(' <styleUrl>#hl</styleUrl>\n') kml.write(' </Pair>\n') kml.write(' </StyleMap>\n') rotazio = 0.0 rotazio = -(mapCanvas.rotation()) kml.write(' <Folder>\n') xc = (x1 + x3) / 2. yc = (y1 + y3) / 2. dx = (x3 - x1) * 75000. #100000. kml.write(' <open>1</open>\n') kml.write(' <NetworkLink>\n') kml.write(' <name>QGIS_link</name>\n') kml.write(' <visibility>1</visibility>\n') kml.write(' <open>1</open>\n') kml.write(' <Link>\n') kml.write(' <href>QGIS_link.kmz</href>\n') kml.write(' </Link>\n') kml.write(' </NetworkLink>\n') kml.write(' <LookAt>\n') stringazza = (" <longitude>%lf</longitude>\n") % (xc) kml.write(stringazza) stringazza = (" <latitude>%lf</latitude>\n") % (yc) kml.write(stringazza) kml.write(' <altitude>0</altitude>\n') stringazza = (" <heading>%lf</heading>\n") % (rotazio) kml.write(stringazza) kml.write(' <tilt>0</tilt>\n') stringazza = (" <range>%lf</range>\n") % (dx) kml.write(stringazza) kml.write(' <gx:altitudeMode>relativeToGround</gx:altitudeMode>\n') kml.write(' </LookAt>\n') kml.write(' <GroundOverlay>\n') kml.write(' <name>QGisView</name>\n') kml.write(' <Icon>\n') xN = projectedExtent.xMinimum() yN = projectedExtent.yMinimum() nomePNG = ("QGisView_%lf_%lf_%s") % (xN, yN, adesso) stringazza = (" <href>%s.png</href>\n") % (nomePNG) kml.write(stringazza) kml.write(' <viewBoundScale>1.0</viewBoundScale>\n') kml.write(' </Icon>\n') kml.write(' <gx:LatLonQuad>\n') kml.write(' <coordinates>\n') stringazza = ("%.7lf,%.7lf,0 %.7lf,%.7lf,0 %.7lf,%.7lf,0 %.7lf,%.7lf,0\n" ) % (x1, y1, x2, y2, x3, y3, x4, y4) kml.write(stringazza) kml.write(' </coordinates>\n') kml.write(' </gx:LatLonQuad>\n') kml.write(' </GroundOverlay>\n') #Export tfw-file xScale = (projectedExtent.xMaximum() - projectedExtent.xMinimum()) / image.width() yScale = (projectedExtent.yMaximum() - projectedExtent.yMinimum()) / image.height() f = open(out_folder + "/" + nomePNG + ".pngw", 'w') f.write(str(xScale) + '\n') f.write(str(0) + '\n') f.write(str(0) + '\n') f.write('-' + str(yScale) + '\n') f.write(str(projectedExtent.xMinimum()) + '\n') f.write(str(projectedExtent.yMaximum()) + '\n') f.write(str(projectedExtent.xMaximum()) + '\n') f.write(str(projectedExtent.yMinimum())) f.close() input_file = out_folder + "/" + nomePNG + ".png" #Save the image image.save(input_file, "png") nomeLay = "gearthview" # foo default name # Adesso scrivo il vettoriale # Prendo il sistema di riferimento del Layer selezionato ------------------ curLayer = mapCanvas.currentLayer() iface = qgis.utils.iface selectedLayers = iface.layerTreeView().selectedLayers() if (not selectedLayers): # print ("selectedLayers is Empty") selectedLayers = [] selectedLayers.append(curLayer) for layer in selectedLayers: if layer: if layer.type() == layer.VectorLayer: name = layer.source() nomeLayer = layer.name() nomeLay = nomeLayer.replace(" ", "_") # print(layer.name()) kml.write(' <Folder>\n') stringazza = (' <name>%s</name>\n') % (nomeLay) kml.write(stringazza) crsSrc = layer.crs() crsDest = QgsCoordinateReferenceSystem(4326) # Wgs84LLH xform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance()) #---------------------------------------------------------------------------- # Trasformo la finestra video in coordinate layer, # per estrarre solo gli elementi visibili #---------------------------------------------------------------------------- # mapCanvas = iface.mapCanvas() boundBox = mapCanvas.extent() xMin = float(boundBox.xMinimum()) yMin = float(boundBox.yMinimum()) xMax = float(boundBox.xMaximum()) yMax = float(boundBox.yMaximum()) crs2 = mapCanvas.mapSettings().destinationCrs() crsSrc2 = QgsCoordinateReferenceSystem(crs2.authid()) crsDest2 = QgsCoordinateReferenceSystem(layer.crs()) xform2 = QgsCoordinateTransform(crsSrc2, crsDest2, QgsProject.instance()) pt0 = xform2.transform(QgsPointXY(xMin, yMin)) pt1 = xform2.transform(QgsPointXY(xMax, yMax)) rect = QgsRectangle(pt0, pt1) # print ("pt0x: <%s>" %(str(pt0.x())) ) # print ("pt0y: <%s>" %(str(pt0.y())) ) # print ("pt1x: <%s>" %(str(pt1.x())) ) # print ("pt1y: <%s>" %(str(pt1.y())) ) rq = QgsFeatureRequest(rect) iter = layer.getFeatures(rq) for feat in iter: nele = feat.id() # fetch geometry geom = feat.geometry() # show some information about the feature # print (("GeomType: %d") %(geom.type())) if geom.type() == 0: elem = geom.asPoint() x1 = elem.x() y1 = elem.y() # pt1 = xform.transform(QgsPoint(x1, y1)) kml.write(' <Placemark>\n') stringazza = (' <name>%s</name>\n') % (nele) kml.write(stringazza) kml.write(' <styleUrl>#default0</styleUrl>\n') # DESCRIPTION DATA----------- kml.write(' <Snippet maxLines="0"></Snippet>\n') kml.write(' <description><![CDATA[\n') kml.write('<html><body><table border="1">\n') kml.write( '<tr><th>Field Name</th><th>Field Value</th></tr>\n' ) # Prendo il contenuto dei campi ------------- fff = feat.fields() num = fff.count() iii = -1 for f in layer.fields(): iii = iii + 1 stringazza = ('<tr><td>%s</td><td>%s</td></tr>\n' ) % (f.name(), feat[iii]) kml.write(stringazza) kml.write('</table></body></html>\n') kml.write(']]></description>\n') # EXTENDED DATA ------------- stringazza = ( ' <ExtendedData><SchemaData schemaUrl="#%s">\n' ) % (nomeLay) kml.write(stringazza) ## Prendo il contenuto dei campi ------------- fff = feat.fields() num = fff.count() iii = -1 for f in layer.fields(): iii = iii + 1 stringazza = ( ' <SimpleData name="%s">%s</SimpleData>\n' ) % (f.name(), feat[iii]) if (stringazza.find('<SimpleData name="descrip') == -1): kml.write(stringazza) kml.write(' </SchemaData></ExtendedData>\n') # EXTENDED DATA ------------- wkt = layer.crs().toWkt() source = osr.SpatialReference() source.ImportFromWkt(wkt) target = osr.SpatialReference() target.ImportFromEPSG(4326) transform = osr.CoordinateTransformation( source, target) testo = geom.asWkt() # print (testo) testo = testo.replace("PointZ (", "Point (") testo = testo.replace("PointZM (", "Point (") testo = testo.replace(" 0,", ",") testo = testo.replace(" 0)", ")") geometra = ogr.CreateGeometryFromWkt(testo) geometra.Transform(transform) testoKML = geometra.ExportToKML() kml.write(testoKML) kml.write(' </Placemark>\n') elif geom.type() == 1: elem = geom.asPolyline() kml.write(' <Placemark>\n') stringazza = (' <name>%s</name>\n') % (nele) kml.write(stringazza) kml.write(' <styleUrl>#default0</styleUrl>\n') # DESCRIPTION DATA----------- kml.write(' <Snippet maxLines="0"></Snippet>\n') kml.write(' <description><![CDATA[\n') kml.write('<html><body><table border="1">\n') kml.write( '<tr><th>Field Name</th><th>Field Value</th></tr>\n' ) # Prendo il contenuto dei campi ------------- fff = feat.fields() num = fff.count() iii = -1 for f in layer.fields(): iii = iii + 1 stringazza = ('<tr><td>%s</td><td>%s</td></tr>\n' ) % (f.name(), feat[iii]) kml.write(stringazza) kml.write('</table></body></html>\n') kml.write(']]></description>\n') # EXTENDED DATA ------------- stringazza = ( ' <ExtendedData><SchemaData schemaUrl="#%s">\n' ) % (nomeLay) kml.write(stringazza) ## Prendo il contenuto dei campi ------------- fff = feat.fields() num = fff.count() iii = -1 for f in layer.fields(): iii = iii + 1 stringazza = ( ' <SimpleData name="%s">%s</SimpleData>\n' ) % (f.name(), feat[iii]) if (stringazza.find('<SimpleData name="descrip') == -1): kml.write(stringazza) kml.write(' </SchemaData></ExtendedData>\n') # EXTENDED DATA ------------- wkt = layer.crs().toWkt() source = osr.SpatialReference() source.ImportFromWkt(wkt) target = osr.SpatialReference() target.ImportFromEPSG(4326) transform = osr.CoordinateTransformation( source, target) testo = geom.asWkt() # print (testo) testo = testo.replace("LineStringZ (", "LineString (") testo = testo.replace("LineStringZM (", "LineString (") testo = testo.replace(" 0,", ",") testo = testo.replace(" 0)", ")") geometra = ogr.CreateGeometryFromWkt(testo) geometra.Transform(transform) testoKML = geometra.ExportToKML() kml.write(testoKML) kml.write(' </Placemark>\n') elif geom.type() == 2: kml.write(' <Placemark>\n') stringazza = (' <name>%s</name>\n') % (nele) kml.write(stringazza) kml.write(' <styleUrl>#msn_style</styleUrl>\n') # DESCRIPTION DATA----------- kml.write(' <Snippet maxLines="0"></Snippet>\n') kml.write(' <description><![CDATA[\n') kml.write('<html><body><table border="1">\n') kml.write( '<tr><th>Field Name</th><th>Field Value</th></tr>\n' ) # Prendo il contenuto dei campi ------------- fff = feat.fields() num = fff.count() iii = -1 for f in layer.fields(): iii = iii + 1 stringazza = ('<tr><td>%s</td><td>%s</td></tr>\n' ) % (f.name(), feat[iii]) kml.write(stringazza) kml.write('</table></body></html>\n') kml.write(']]></description>\n') # EXTENDED DATA ------------- stringazza = ( ' <ExtendedData><SchemaData schemaUrl="#%s">\n' ) % (nomeLay) kml.write(stringazza) ## Prendo il contenuto dei campi ------------- fff = feat.fields() num = fff.count() iii = -1 for f in layer.fields(): iii = iii + 1 stringazza = ( ' <SimpleData name="%s">%s</SimpleData>\n' ) % (f.name(), feat[iii]) if (stringazza.find('<SimpleData name="descrip') == -1): kml.write(stringazza) kml.write(' </SchemaData></ExtendedData>\n') # EXTENDED DATA ------------- testo = geom.asWkt() # print (testo) wkt = layer.crs().toWkt() source = osr.SpatialReference() source.ImportFromWkt(wkt) target = osr.SpatialReference() target.ImportFromEPSG(4326) transform = osr.CoordinateTransformation( source, target) testo = testo.replace("PolygonZ (", "Polygon (") testo = testo.replace("PolygonZM (", "Polygon (") testo = testo.replace(" 0,", ",") testo = testo.replace(" 0)", ")") geometra = ogr.CreateGeometryFromWkt(testo) geometra.Transform(transform) testoKML = geometra.ExportToKML() testoKML = testoKML.replace( "<Polygon>", "<Polygon><altitudeMode>relativeToGround</altitudeMode>" ) kml.write(testoKML) kml.write(' </Placemark>\n') kml.write(' </Folder>\n') kml.write('</Folder>\n') kml.write('</Document>\n') kml.write('</kml>\n') kml.close() if platform.system() == "Windows": os.startfile(out_folder + '/doc.kml') if platform.system() == "Darwin": os.system("open " + str(out_folder + '/doc.kml')) if platform.system() == "Linux": os.system("xdg-open " + str(out_folder + '/doc.kml'))
def printMap(self,taxon): # copy style from grid layer to output layer outstyle = tempfile.gettempdir() + os.sep + "output.qml" getLayerFromId(self.GRID_LAYER).saveNamedStyle(outstyle) self.TAXON_GRID_LAYER.loadNamedStyle(outstyle) # create layer set baseLayer = getLayerFromId(self.BASE_LAYER) if self.TAXON_GRID_LAYER.crs() != baseLayer.crs(): QMessageBox.information(self.dlg,"Distribution Map Generator", "All layers must have the same projection.") raise QgsCsException("All layers must have the same projection.") baseCrs = baseLayer.crs() if self.SECONDARY_LAYER != "None": secondaryLayer = getLayerFromId(self.SECONDARY_LAYER) if secondaryLayer.crs() != baseLayer.crs(): QMessageBox.information(self.dlg,"Distribution Map Generator", "All layers must have the same projection.") raise QgsCsException("All layers must have the same projection.") else: secondaryLayer = None if self.SURFACE_LAYER != "None": surfaceLayer = getLayerFromId(self.SURFACE_LAYER) if surfaceLayer.crs() != baseLayer.crs(): QMessageBox.information(self.dlg,"Distribution Map Generator", "All layers must have the same projection.") raise QgsCsException("All layers must have the same projection.") else: surfaceLayer = None lst = [] lst.append(self.TAXON_GRID_LAYER) if self.SURFACE_LAYER != "None": lst.append(surfaceLayer) if self.SECONDARY_LAYER != "None": lst.append(secondaryLayer) lst.append(baseLayer) ms = QgsMapSettings() ms.setLayers(lst) ms.setBackgroundColor(self.BACKGROUND_COLOUR) # set extent (xmin,ymin,xmax,ymax) rect = QgsRectangle(self.X_MIN,self.Y_MIN,self.X_MAX,self.Y_MAX) ms.setExtent(rect) # set output size outputSize = QSize(self.OUT_WIDTH,self.OUT_HEIGHT) ms.setOutputSize(outputSize) # create painter p = QPainter() p.setRenderHint(QPainter.Antialiasing) # create image (dimensions 325x299) img = QImage(outputSize, QImage.Format_ARGB32_Premultiplied) p.begin(img) # do the rendering r = QgsMapRendererCustomPainterJob(ms, p) r.start() r.waitForFinished() p.end() # save image outdir = self.OUT_DIR img.save(outdir+os.sep+str(str(taxon))+".png","png")