如何使用node-gdal-async从二维数组创建并写入新数据集
如何使用node-gdal-async从二维数组创建并写入新数据集
嘿,我来帮你搞定这个问题!你已经成功迈出了第一步——创建了空的TIFF数据集,接下来只需要把你的二维数组数据写入进去就行,步骤其实很简单:
关键步骤拆解
第一步:获取目标波段
因为你创建的是单波段数据集,直接通过dataset.bands.get(1)获取第一个波段就行(注意哦,node-gdal-async里的波段是从1开始计数的,不是0开始,别踩这个坑!)第二步:转换二维数组为TypedArray
gdal的写入方法需要连续的TypedArray(和你指定的数据类型gdal.GDT_Int32对应,这里要用Int32Array),所以先把二维数组打平成一维数组,再转换成对应的类型:// 把二维数组打平,再转成匹配的Int32Array const flatData = new Int32Array(data.flat());第三步:写入数据到波段
调用波段的writeRasterAsync方法,指定写入的起始坐标、尺寸,以及转换好的数据即可。
完整可运行代码
把你的代码和上述步骤整合后,完整代码如下:
const gdal = require('gdal-async'); async function createDatasetFrom2DArray() { const driver = gdal.drivers.get('GTiff'); const xSize = 3; const ySize = 3; const bandCount = 1; const dataType = gdal.GDT_Int32; // 创建空的TIFF数据集 const dataset = await gdal.openAsync('output.tif', 'w', driver, xSize, ySize, bandCount, dataType); // 你的二维数组数据 const data = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ]; // 1. 获取第一个波段 const band = dataset.bands.get(1); // 2. 转换二维数组为Int32Array const flatData = new Int32Array(data.flat()); // 3. 写入数据到波段 await band.writeRasterAsync(0, 0, xSize, ySize, flatData, xSize, ySize, dataType); // 别忘了关闭数据集,确保数据完全写入磁盘 dataset.close(); console.log('数据集创建并写入完成!'); } // 执行函数并捕获错误 createDatasetFrom2DArray().catch(err => console.error(err));
额外注意事项
- 数据类型必须严格匹配:如果创建数据集时用的是
gdal.GDT_Float32,那就要把数据转换成Float32Array,否则会出现数据错乱。 - 多波段场景:如果是多波段数据集,需要循环每个波段,分别准备对应的数据数组,再逐个写入。
- 务必关闭数据集:一定要调用
dataset.close(),或者用try/finally结构确保数据集被正确关闭,否则可能导致文件损坏或数据丢失。
备注:内容来源于stack exchange,提问作者Kipnoedels
相关产品推荐
相关产品推荐

