You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:27:18