VRT 的 GDAL C# 包装器不写入 VRT 文件

GDAL C# wrapper for VRT doesn't write a VRT file

我正在使用 .NET 的 GDAL 库(库版本 2.3.3)和 OSGeo4W shell。

我正在做的是将两个(或更多)光栅文件合并到一个 VRT 中,以供以后处理。这发生在代码中。

作为测试,在 shell 中,我可以发出此 GDAL 命令:

gdalbuildvrt C:\Temp\GdalTests\z7_x43_y43.vrt F:\gdal\Aero\gnc[=10=]00a013.gn1 F:\gdal\Aero\gnc[=10=]00b013.gn1

正如预期的那样,它在列出的文件夹中生成了一个名为 "z7_x43_y43.vrt" 的 VRT 文件。

但是,相应的 GDAL C# 库似乎无法重现此正确行为;没有 VRT 文件写入 vrtFile.

我可以毫无问题地使用其他 GDAL C# 库,例如 wrapper_GDALTranslate(...)(意思是,当提供目标路径时,会在其中写入一个文件),似乎只是 BuildVRT 具有一个问题。

这是我正在使用的代码,针对这个问题进行了简化:

GdalConfiguration.ConfigureGdal();
var vrtFile = @"C:\Temp\GdalTests\z7_x43_y43.vrt";
var aeroFiles = new List<string>();
aeroFiles.Add(@"F:\gdal\Aero\gnc[=11=]00a013.gn1");
aeroFiles.Add(@"F:\gdal\Aero\gnc[=11=]00b013.gn1");
var vrtOptions = new GDALBuildVRTOptions(new [] { "-overwrite" });
Gdal.wrapper_GDALBuildVRT_names(vrtFile, aeroFiles.ToArray(), vrtOptions, null, null);

源文件 (*.gn1) 使用 NITF 驱动程序和 WGS84 数据,并且在其他 GDAL C# 库相关代码任务中工作得很好(例如,我可以将它们加载为光栅,应用 gdal_translate 到他们等等)。

有没有人使用过 GDAL C# 库的 VRT 端?关于我可能做错了什么,或者库本身有问题的建议?

编辑: 并不是对 wrapper_GDALBuildVRT_names 的调用什么都不做......它确实有一个 Dataset return 对象, 正确表示 VRT 数据,可以传递到翻译函数等。

var vrtDataset = Gdal.wrapper_GDALBuildVRT_names(vrtFile, aeroFiles.ToArray(), vrtOptions, null, null);
Gdal.wrapper_GDALTranslate(outPath, vrtDataset, new GDALTranslateOptions(translateOptions.ToArray()),
                    null, null);

这将在 outPath 处正确生成输出文件(例如 PNG、GeoTIFF 等,具体取决于选项)。我只是想知道为什么从来没有生成物理 VRT 文件,即使我们传入了目的地名称 (vrtFile)。

VRT 驱动程序在调用 dispose 之前不会写入 VRT 文件(这最初也让我感到困惑)。下面的代码应该会导致写入预期的 z7_x43_y43.vrt 文件。如果您计划在 VRT 上运行,您将希望在使用结束时将其丢弃,或者丢弃并重新加载 VRT 以供进一步使用。

GdalConfiguration.ConfigureGdal();
var vrtFile = @"C:\Temp\GdalTests\z7_x43_y43.vrt";
var aeroFiles = new List<string>();
aeroFiles.Add(@"F:\gdal\Aero\gnc[=10=]00a013.gn1");
aeroFiles.Add(@"F:\gdal\Aero\gnc[=10=]00b013.gn1");
var vrtOptions = new GDALBuildVRTOptions(new [] { "-overwrite" });
var vrtDataset = Gdal.wrapper_GDALBuildVRT_names(vrtFile, aeroFiles.ToArray(), vrtOptions, null, null);
vrtDataset.Dispose();