Ejemplo n.º 1
0
  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)
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
  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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
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)))
Ejemplo n.º 10
0
    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()
Ejemplo n.º 11
0
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'))
Ejemplo n.º 12
0
    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")