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

在C#中不使用GDAL,如何通过BitMiracle读取GeoTiff的NODATA值?

问题:不依赖GDAL,使用BitMiracle.LibTiff读写GeoTIFF的No Data值

我正在C#中编写一个不依赖GDAL的GeoTiff读写器,这是硬性要求。目前我已能通过以下代码读取列数等信息:

using BitMiracle.LibTiff.Classic;

// ... 省略代码 ...

using (Tiff image = Tiff.Open(fileToOpen, "r"))
{
    if (image == null) throw new Exception("Could not open file.");

    returnRaster = new Raster();

    FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH);
    int width = value[0].ToInt();
    returnRaster.numColumns = width;
}

但当我尝试通过类似如下代码获取NODATA值时:

value = image.GetField(TiffTag.NODATA);
int nodata = value[0].ToInt();
returnRaster.No_Data = nodata;

发现不存在TiffTag.NODATA或等效项。请问如何在不使用GDAL、仅使用BitMiracle API的情况下读取(及写入)GeoTiff的No Data值?


解决方案

GeoTIFF的No Data值通常存储在GDALNoData这个自定义TIFF标签中(标签编号为42113),BitMiracle.LibTiff默认没有预定义该标签,需要手动注册后再进行读写操作。

1. 读取No Data值

先注册自定义标签,再通过GetField获取对应值:

// 注册GDALNoData自定义标签(标签ID 42113)
Tiff.RegisterField(42113, "GDALNoData", TiffType.DOUBLE, 1, TiffFieldFlags.CUSTOM | TiffFieldFlags.WRITE);

using (Tiff image = Tiff.Open(fileToOpen, "r"))
{
    if (image == null) throw new Exception("Could not open file.");

    returnRaster = new Raster();

    // 读取宽度(保留原有逻辑)
    FieldValue[] widthVal = image.GetField(TiffTag.IMAGEWIDTH);
    returnRaster.numColumns = widthVal[0].ToInt();

    // 读取No Data值
    if (image.GetField(42113, out FieldValue[] nodataVal))
    {
        // 根据栅格数据类型转换,此处以int类型示例
        int noData = Convert.ToInt32(nodataVal[0].ToDouble());
        returnRaster.No_Data = noData;
    }
}

2. 写入No Data值

写入前同样需要先注册标签,再通过SetField设置值:

// 注册自定义标签
Tiff.RegisterField(42113, "GDALNoData", TiffType.DOUBLE, 1, TiffFieldFlags.CUSTOM | TiffFieldFlags.WRITE);

using (Tiff image = Tiff.Open(fileToSave, "w"))
{
    if (image == null) throw new Exception("Could not open file for writing.");

    // 设置必要的TIFF基础字段(如宽度、高度等,保留原有逻辑)
    image.SetField(TiffTag.IMAGEWIDTH, returnRaster.numColumns);
    // ... 其他必填字段设置 ...

    // 写入No Data值
    image.SetField(42113, returnRaster.No_Data);
}

额外说明

  • 部分工具生成的GeoTIFF可能用NoDataValue标签(编号33550)存储无数据值,可根据需求同时处理这两个标签。
  • 注意数据类型匹配:若栅格为浮点型,No Data值需以double类型读写;若为整数型,读取时需做对应类型转换。

内容的提问来源于stack exchange,提问作者philologon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:42:49