gpt4 book ai didi

c# - 使用 "LibTiff.Net"创建 Geotiff,并添加地理信息

转载 作者:行者123 更新时间:2023-11-30 14:45:46 25 4
gpt4 key购买 nike

我正在尝试使用 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
//........
//
}
}

最佳答案

我终于可以将地理信息添加到我的 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中定义的标签扩展方法。
    注意:此方法必须在打开或创建 tiff 图像之前调用才能生效。

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

    this.tiff = Tiff.Open(fileName, "w");
  4. 添加标签(+必需的基本标签):
    棘手的部分是值( double 组)必须转换为对象。
    否则,“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. 完成!

关于c# - 使用 "LibTiff.Net"创建 Geotiff,并添加地理信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52438898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com