使用“ LibTiff.Net”创建Geotiff,并添加地理信息

时间:2018-09-21 07:41:39

标签: c# geotiff libtiff.net gis

我正在尝试使用Libtiff.Net创建Geotiff(高程DEM数据)文件。
问题是我从未成功添加以下两个标签:

TiffTag.GEOTIFF_MODELTIEPOINTTAG
TiffTag.GEOTIFF_MODELPIXELSCALETA

要添加标签,我编写了如下代码:

tiff.SetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG, 0.0, 0.0, 0.0, leftTopX, leftTopY, 0.0);
tiff.SetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG, pixelScaleX, pixelScaleY, 0.0);

根据对“ SetField”方法的描述,如果成功设置了标记值,则该方法返回“ true”。
但是,就我而言,尝试添加上述2个标记时该方法永远不会返回。
(可以添加其他标签,没有任何问题。)

我已经通过使用其他GIS软件(例如ArcGIS)来确认创建的Geotiff不包含地理信息。

我错过了什么还是做错了什么?
任何提示或答案将不胜感激!


为方便起见,到目前为止,我编写的代码如下:

public void WriteTiff()
{
   using (var tiff = Tiff.Open("C:\\test\\newCreated.tif", "w"))
   {
       if (tiff == null)
           return;

       int width = 100;
       int height = 100;
       int byteDepth = 4;
       int tileSize = 64;

       //Geo info to add
       double leftTopX = 10000;
       double leftTopY = 15000;
       double pixelScaleX = 1;
       double pixelScaleY = 1;

       //Set the basic tags
       tiff.SetField(TiffTag.IMAGEWIDTH, width);
       tiff.SetField(TiffTag.IMAGELENGTH, height);
       tiff.SetField(TiffTag.SAMPLESPERPIXEL, 1);
       tiff.SetField(TiffTag.BITSPERSAMPLE, 8 * byteDepth);
       tiff.SetField(TiffTag.ORIENTATION, Orientation.TOPLEFT);
       tiff.SetField(TiffTag.ROWSPERSTRIP, height);
       tiff.SetField(TiffTag.XRESOLUTION, 88);
       tiff.SetField(TiffTag.YRESOLUTION, 88);
       tiff.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH);
       tiff.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
       tiff.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK);
       tiff.SetField(TiffTag.COMPRESSION, Compression.NONE);
       tiff.SetField(TiffTag.FILLORDER, FillOrder.MSB2LSB);
       tiff.SetField(TiffTag.SOFTWARE, "MyLib");
       tiff.SetField(TiffTag.SAMPLEFORMAT, SampleFormat.IEEEFP);

       //Set the size of the tile
       tiff.SetField(TiffTag.TILEWIDTH, tileSize);
       tiff.SetField(TiffTag.TILELENGTH, tileSize);

       //set the geographics info
       //The following two lines never succeeded....
       tiff.SetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG, 0.0, 0.0, 0.0, leftTopX, leftTopY, 0.0);
       tiff.SetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG, pixelScaleX, pixelScaleY, 0.0);

       //Write the tile data here
       //........
       //
   }
}

2 个答案:

答案 0 :(得分:3)

我最终可以将地理信息添加到我的tiff图像中,如下所示:

  1. 定义“ Tiff.TagExtender”方法的方法。

    public void TagExtender(Tiff tiff)
    {
        TiffFieldInfo[] tiffFieldInfo = 
        {
            new TiffFieldInfo(TiffTag.GEOTIFF_MODELTIEPOINTTAG, 6, 6, TiffType.DOUBLE, FieldBit.Custom, false, true, "MODELTILEPOINTTAG"),
            new TiffFieldInfo(TiffTag.GEOTIFF_MODELPIXELSCALETAG, 3, 3, TiffType.DOUBLE, FieldBit.Custom, false, true, "MODELPIXELSCALETAG")
        };
    
        tiff.MergeFieldInfo(tiffFieldInfo, tiffFieldInfo.Length);
    }
    
  2. 设置#1中定义的标签扩展器方法。
    注意:必须将这种方法称为“ BEFORE”,才能打开或创建tiff图像才能生效。

    Tiff.SetTagExtender(TagExtender);
    
  3. 打开tiff图片:

    this.tiff = Tiff.Open(fileName, "w");
    
  4. 添加标签(+必需的基本标签):
    棘手的部分是必须将值(双精度数组)强制转换为对象。
    否则,“ SetField”方法可能会引发异常。

    double[] tiePoints = new double[] { 0, 0, 0, this.TopLeftX, this.TopLeftY, 0 };
    this.tiff.SetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG, 6, (object)tiePoints);
    double[] pixelScale = new double[] { this.PixelScaleX, this.PixelScaleY, 0 };
    this.tiff.SetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG, 3, (object)pixelScale);
    
  5. 做一些与像素值有关的事情。

  6. 完成!

答案 1 :(得分:2)

LibTiff.Net无法开箱即用地写入TiffTag.GEOTIFF_MODELTIEPOINTTAGTiffTag.GEOTIFF_MODELPIXELSCALETAG。 Tiff_DirInfo.cs文件中列出了库可以直接使用的所有标记。

当您尝试写入未知标签时,SetField方法将返回false。该库还会向控制台发出错误消息。

您可以通过使用类似于本示例中的代码的方法来教图书馆如何编写这些GEOTIFF标签

Add custom TIFF tags to an existing TIFF image