Example #1
0
 def testPalettedClassDataToString(self):
     classes = [
         QgsPalettedRasterRenderer.Class(1, QColor(0, 255, 0), 'class 2'),
         QgsPalettedRasterRenderer.Class(3, QColor(255, 0, 0), 'class 1')
     ]
     self.assertEqual(QgsPalettedRasterRenderer.classDataToString(classes),
                      '1 0 255 0 255 class 2\n3 255 0 0 255 class 1')
     # must be sorted by value to work OK in ArcMap
     classes = [
         QgsPalettedRasterRenderer.Class(4, QColor(0, 255, 0), 'class 2'),
         QgsPalettedRasterRenderer.Class(3, QColor(255, 0, 0), 'class 1')
     ]
     self.assertEqual(QgsPalettedRasterRenderer.classDataToString(classes),
                      '3 255 0 0 255 class 1\n4 0 255 0 255 class 2')
Example #2
0
    def testPalettedRendererWithNegativeColorValue(self):
        """ test paletted raster renderer with negative values in color table"""

        path = os.path.join(unitTestDataPath('raster'),
                            'hub13263.vrt')
        info = QFileInfo(path)
        base_name = info.baseName()
        layer = QgsRasterLayer(path, base_name)
        self.assertTrue(layer.isValid(), 'Raster not loaded: {}'.format(path))

        renderer = QgsPalettedRasterRenderer(layer.dataProvider(), 1,
                                             [QgsPalettedRasterRenderer.Class(-1, QColor(0, 255, 0), 'class 2'),
                                              QgsPalettedRasterRenderer.Class(3, QColor(255, 0, 0), 'class 1')])

        self.assertEqual(renderer.nColors(), 2)
        self.assertEqual(renderer.usesBands(), [1])
Example #3
0
def apply_symbology(rlayer, rband, symbology):
    """Apply symbology to raster layer using Paletted/Unique values"""
    paletted_classes = []
    for name, value, color in symbology:
        paletted_classes.append(
            QgsPalettedRasterRenderer.Class(
                value, QColor(color[0], color[1], color[2], color[3]), name))

    renderer = QgsPalettedRasterRenderer(rlayer.dataProvider(), rband,
                                         paletted_classes)
    # Set renderer for raster layer
    rlayer.setRenderer(renderer)

    # set the opacity to the layer based on the opacity set in active layer UI
    from ThRasE.gui.main_dialog import ThRasEDialog
    active_layer = next((active_layer for active_layer in [
        al for als in [
            view_widget.active_layers
            for view_widget in ThRasEDialog.view_widgets
        ] for al in als
    ] if active_layer.layer == rlayer), False)
    if active_layer:
        if rlayer.type() == QgsMapLayer.VectorLayer:
            rlayer.setOpacity(active_layer.opacity / 100.0)
        else:
            rlayer.renderer().setOpacity(active_layer.opacity / 100.0)

    # Repaint
    if hasattr(rlayer, 'setCacheImage'):
        rlayer.setCacheImage(None)
    rlayer.triggerRepaint()
Example #4
0
    def testPalettedBand(self):
        """ test paletted raster render band"""
        path = os.path.join(unitTestDataPath(), 'landsat_4326.tif')
        info = QFileInfo(path)
        base_name = info.baseName()
        layer = QgsRasterLayer(path, base_name)
        self.assertTrue(layer.isValid(), 'Raster not loaded: {}'.format(path))

        renderer = QgsPalettedRasterRenderer(layer.dataProvider(), 2, [
            QgsPalettedRasterRenderer.Class(137, QColor(0, 255, 0), 'class 2'),
            QgsPalettedRasterRenderer.Class(138, QColor(255, 0, 0), 'class 1'),
            QgsPalettedRasterRenderer.Class(139, QColor(0, 0, 255), 'class 1')
        ])

        layer.setRenderer(renderer)
        ms = QgsMapSettings()
        ms.setLayers([layer])
        ms.setExtent(layer.extent())

        checker = QgsRenderChecker()
        checker.setControlName("expected_paletted_renderer_band2")
        checker.setMapSettings(ms)

        self.assertTrue(checker.runTest("expected_paletted_renderer_band2"),
                        "Paletted rendering test failed")

        renderer = QgsPalettedRasterRenderer(layer.dataProvider(), 3, [
            QgsPalettedRasterRenderer.Class(120, QColor(0, 255, 0), 'class 2'),
            QgsPalettedRasterRenderer.Class(123, QColor(255, 0, 0), 'class 1'),
            QgsPalettedRasterRenderer.Class(124, QColor(0, 0, 255), 'class 1')
        ])

        layer.setRenderer(renderer)
        ms = QgsMapSettings()
        ms.setLayers([layer])
        ms.setExtent(layer.extent())

        checker = QgsRenderChecker()
        checker.setControlName("expected_paletted_renderer_band3")
        checker.setMapSettings(ms)

        self.assertTrue(checker.runTest("expected_paletted_renderer_band3"),
                        "Paletted rendering test failed")
Example #5
0
    def testPaletted(self):
        """ test paletted raster renderer with raster with color table"""
        path = os.path.join(unitTestDataPath('raster'),
                            'with_color_table.tif')
        info = QFileInfo(path)
        base_name = info.baseName()
        layer = QgsRasterLayer(path, base_name)
        self.assertTrue(layer.isValid(), 'Raster not loaded: {}'.format(path))

        renderer = QgsPalettedRasterRenderer(layer.dataProvider(), 1,
                                             [QgsPalettedRasterRenderer.Class(1, QColor(0, 255, 0), 'class 2'),
                                              QgsPalettedRasterRenderer.Class(3, QColor(255, 0, 0), 'class 1')])

        self.assertEqual(renderer.nColors(), 2)
        self.assertEqual(renderer.usesBands(), [1])

        # test labels
        self.assertEqual(renderer.label(1), 'class 2')
        self.assertEqual(renderer.label(3), 'class 1')
        self.assertFalse(renderer.label(101))

        # test legend symbology - should be sorted by value
        legend = renderer.legendSymbologyItems()
        self.assertEqual(legend[0][0], 'class 2')
        self.assertEqual(legend[1][0], 'class 1')
        self.assertEqual(legend[0][1].name(), '#00ff00')
        self.assertEqual(legend[1][1].name(), '#ff0000')

        # test retrieving classes
        classes = renderer.classes()
        self.assertEqual(classes[0].value, 1)
        self.assertEqual(classes[1].value, 3)
        self.assertEqual(classes[0].label, 'class 2')
        self.assertEqual(classes[1].label, 'class 1')
        self.assertEqual(classes[0].color.name(), '#00ff00')
        self.assertEqual(classes[1].color.name(), '#ff0000')

        # test set label
        # bad index
        renderer.setLabel(1212, 'bad')
        renderer.setLabel(3, 'new class')
        self.assertEqual(renderer.label(3), 'new class')

        # color ramp
        r = QgsLimitedRandomColorRamp(5)
        renderer.setSourceColorRamp(r)
        self.assertEqual(renderer.sourceColorRamp().type(), 'random')
        self.assertEqual(renderer.sourceColorRamp().count(), 5)

        # clone
        new_renderer = renderer.clone()
        classes = new_renderer.classes()
        self.assertEqual(classes[0].value, 1)
        self.assertEqual(classes[1].value, 3)
        self.assertEqual(classes[0].label, 'class 2')
        self.assertEqual(classes[1].label, 'new class')
        self.assertEqual(classes[0].color.name(), '#00ff00')
        self.assertEqual(classes[1].color.name(), '#ff0000')
        self.assertEqual(new_renderer.sourceColorRamp().type(), 'random')
        self.assertEqual(new_renderer.sourceColorRamp().count(), 5)

        # write to xml and read
        doc = QDomDocument('testdoc')
        elem = doc.createElement('qgis')
        renderer.writeXml(doc, elem)
        restored = QgsPalettedRasterRenderer.create(elem.firstChild().toElement(), layer.dataProvider())
        self.assertTrue(restored)
        self.assertEqual(restored.usesBands(), [1])
        classes = restored.classes()
        self.assertTrue(classes)
        self.assertEqual(classes[0].value, 1)
        self.assertEqual(classes[1].value, 3)
        self.assertEqual(classes[0].label, 'class 2')
        self.assertEqual(classes[1].label, 'new class')
        self.assertEqual(classes[0].color.name(), '#00ff00')
        self.assertEqual(classes[1].color.name(), '#ff0000')
        self.assertEqual(restored.sourceColorRamp().type(), 'random')
        self.assertEqual(restored.sourceColorRamp().count(), 5)

        # render test
        layer.setRenderer(renderer)
        ms = QgsMapSettings()
        ms.setLayers([layer])
        ms.setExtent(layer.extent())

        checker = QgsRenderChecker()
        checker.setControlName("expected_paletted_renderer")
        checker.setMapSettings(ms)

        self.assertTrue(checker.runTest("expected_paletted_renderer"), "Paletted rendering test failed")
    def on_cannyPushButton_clicked(self):

        raster_layer_name = self.rasterLayerComboBox.currentText()
        raster_layer = QgsProject.instance().mapLayersByName(
            raster_layer_name)[0]
        provider = raster_layer.dataProvider()

        extent = provider.extent()
        rows = raster_layer.height()
        cols = raster_layer.width()

        # 读取栅格值

        block = provider.block(1, extent, cols, rows)
        img = np.zeros([rows, cols, 3], np.uint8)

        band_num = 3
        for band_index in range(band_num):
            block = provider.block(band_index + 1, extent, cols, rows)
            # for row_index in range(rows):
            #     for col_index in range(cols):
            #         img[row_index][col_index][band_index] = block.value(
            #             row_index, col_index)
            img[:, :,
                band_index] = np.array(block.data()).reshape([rows, cols])

        print(img)
        print(img.shape)

        edges = cv2.Canny(img, 200, 400, 15)
        plt.subplot(121)
        plt.imshow(img)
        plt.title('Original Image')
        plt.xticks([])
        plt.yticks([])
        plt.subplot(122)
        plt.imshow(edges, cmap='gray')
        plt.title('Edge Image')
        plt.xticks([])
        plt.yticks([])
        plt.show()
        cv2.imwrite(r'edge_result.jpg', edges)

        # 写入Tiff

        driver = gdal.GetDriverByName('GTiff')

        # 创建图像
        print(f'cols {cols}, rows {rows}')
        ds = driver.Create('edge_result.tif',
                           xsize=cols,
                           ysize=rows,
                           bands=1,
                           eType=gdal.GDT_Byte)
        # 设置参考坐标系
        crs_wkt = raster_layer.crs().toWkt()
        ds.SetProjection(crs_wkt)
        print(crs_wkt)

        # srs = osr.SpatialReference()
        # srs.SetUTM(12, 1)
        # srs.SetWellKnownGeogCS('WGS84')
        # ds.SetProjection(srs.ExportToWkt())

        # 设置Tiff的图像转换参数
        transformParam = [
            extent.xMinimum(), (extent.width() / cols), 0,
            extent.yMaximum(), 0, -(extent.height() / rows)
        ]
        ds.SetGeoTransform(transformParam)
        print(transformParam)
        # 写入数据
        ds.GetRasterBand(1).WriteArray(edges[:, :])
        # 关闭文件
        ds = None

        # 添加至图层并设置样式

        rlayer = QgsRasterLayer('edge_result.tif', "result tif layer")
        QgsProject.instance().addMapLayer(rlayer)

        palette_raster_render = QgsPalettedRasterRenderer(
            rlayer.dataProvider(), 1, [
                QgsPalettedRasterRenderer.Class(0, QtGui.QColor(0, 0, 0, 0)),
                QgsPalettedRasterRenderer.Class(255,
                                                QtGui.QColor(255, 0, 0, 255))
            ])
        rlayer.setRenderer(palette_raster_render)