PYQGIS:如何用QgsRasterFileWriter.writeRaster从NumPy数组创建栅格
使用QGIS Core的writeRaster创建含浮点数与NaN的单波段栅格问题解答
Q1:QgsRasterPipe是什么?如何使用?作用是什么?
QgsRasterPipe是QGIS中负责栅格数据流转的核心组件,相当于一个“数据通道”——它串联起栅格的数据源、处理逻辑(比如投影转换、色彩渲染)和输出目标。writeRaster方法必须依赖它获取栅格的元数据(波段数、数据类型、像素大小)以及实际的像素数据。
使用时无需复杂配置,核心是给它添加栅格数据源提供者和对应的波段定义信息。对于从NumPy数组创建栅格的场景,关键是先把数组转成QgsRasterBlock,再将其关联到pipe的数据源中。
Q2:outputExtent参数的作用,以及像素值在哪里声明?
outputExtent(QgsRectangle类型)用来定义栅格的地理边界范围,即栅格在地图坐标系下的左上角和右下角坐标,它仅负责定位栅格的空间位置,和像素值无直接关联。
像素值需要先存储在QgsRasterBlock对象里,再通过QgsRasterPipe传递给writeRaster方法。
可运行的完整脚本示例
from qgis.core import ( QgsRasterBlock, QgsRasterPipe, QgsRectangle, QgsRasterFileWriter, QgsCoordinateReferenceSystem ) import numpy as np # 1. 创建含NaN的浮点数NumPy数组(示例数据) rows = 100 cols = 100 raster_data = np.random.rand(rows, cols).astype(np.float32) # 随机设置一些NaN值 raster_data[np.random.randint(0, rows, 20), np.random.randint(0, cols, 20)] = np.nan # 2. 将NumPy数组转为QgsRasterBlock data_type = QgsRasterBlock.DataType.Float32 raster_block = QgsRasterBlock(data_type, cols, rows) # 把数组数据写入栅格块(QGIS栅格块按行优先存储,与NumPy逻辑一致) raster_block.setData(raster_data.tobytes()) # 3. 配置QgsRasterPipe pipe = QgsRasterPipe() # 创建内存数据源,关联栅格块 provider = pipe.createProvider('MEM', { 'WIDTH': str(cols), 'HEIGHT': str(rows), 'BANDS': '1', 'DATATYPE': str(data_type) }) if provider is not None: # 将栅格块数据写入数据源的第1波段 provider.setEditable(True) provider.writeBlock(raster_block, 1, 0, 0) provider.setEditable(False) pipe.set(provider) # 4. 定义输出范围和坐标系(示例用WGS84,按需修改) x_min, y_min = 110.0, 30.0 x_max, y_max = 110.1, 30.1 output_extent = QgsRectangle(x_min, y_min, x_max, y_max) crs = QgsCoordinateReferenceSystem('EPSG:4326') # 5. 配置栅格写入器并输出 output_path = 'output_float_raster.tif' writer = QgsRasterFileWriter(output_path) writer.setOutputFormat('GTiff') # 计算输出像素大小 pixel_x = (x_max - x_min) / cols pixel_y = (y_max - y_min) / rows # 执行写入 writer.writeRaster( pipe, cols, rows, output_extent, crs )
关键说明
- 转换
QgsRasterBlock时要确保数据类型匹配(比如NumPy的float32对应QgsRasterBlock.DataType.Float32) output_extent的坐标要与设置的坐标系一致,像素大小通过范围除以行列数计算- MEM类型数据源是临时内存数据源,适合从数组直接构建栅格
内容的提问来源于stack exchange,提问作者Vincent Bénet
相关产品推荐
相关产品推荐

