用于VRT的GDAL C#包装器未写入VRT文件

时间:2019-03-27 21:17:37

标签: c# gdal osgeo

我正在将GDAL库用于.NET(库版本2.3.3)和OSGeo4W Shell。

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

作为测试,我可以在外壳中发出以下GDAL命令:

gdalbuildvrt C:\Temp\GdalTests\z7_x43_y43.vrt F:\gdal\Aero\gnc\1\0000a013.gn1 F:\gdal\Aero\gnc\1\0000b013.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\1\0000a013.gn1");
aeroFiles.Add(@"F:\gdal\Aero\gnc\1\0000b013.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返回对象,该对象正确地表示了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等,具体取决于选项)。我只是想知道为什么即使我们传入了目的地名称(vrtFile),也从来没有产生过物理VRT文件。

1 个答案:

答案 0 :(得分:0)

在进行处置请求之前,VRT驱动程序不会写入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\1\0000a013.gn1");
aeroFiles.Add(@"F:\gdal\Aero\gnc\1\0000b013.gn1");
var vrtOptions = new GDALBuildVRTOptions(new [] { "-overwrite" });
var vrtDataset = Gdal.wrapper_GDALBuildVRT_names(vrtFile, aeroFiles.ToArray(), vrtOptions, null, null);
vrtDataset.Dispose();