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')
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])
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()
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")
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)