使用 "LibTiff.Net" 创建 Geotiff,并添加地理信息
Create Geotiff using "LibTiff.Net", and add geographic information
我正在尝试使用 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"方法的说明,方法returns"true"如果标签值设置成功。
但是,就我而言,尝试添加上述 2 个标签时,该方法从不 returns。
(可以添加其他标签没有问题。)
我已经使用其他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
//........
//
}
}
LibTiff.Net 无法立即写入 TiffTag.GEOTIFF_MODELTIEPOINTTAG
和 TiffTag.GEOTIFF_MODELPIXELSCALETAG
。库可以开箱即用的所有标签都列在 Tiff_DirInfo.cs 文件中。
SetField
方法 returns false
当您尝试写入未知标记时。该库还会向控制台发出一条错误消息。
您可以使用与本示例中类似的代码教图书馆如何编写这些 GEOTIFF 标签
我终于可以将地理信息添加到我的 tiff 图像中,如下所示:
为"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);
}
设置#1中定义的标签扩展方法
注意:此方法必须调用"BEFORE"打开或创建tiff图像才能生效。
Tiff.SetTagExtender(TagExtender);
打开tiff图片:
this.tiff = Tiff.Open(fileName, "w");
添加标签(+需要基本标签):
棘手的部分是值(双精度数组)必须转换为对象。
否则,"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);
做一些与像素值相关的事情。
完成!
我正在尝试使用 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"方法的说明,方法returns"true"如果标签值设置成功。
但是,就我而言,尝试添加上述 2 个标签时,该方法从不 returns。
(可以添加其他标签没有问题。)
我已经使用其他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
//........
//
}
}
LibTiff.Net 无法立即写入 TiffTag.GEOTIFF_MODELTIEPOINTTAG
和 TiffTag.GEOTIFF_MODELPIXELSCALETAG
。库可以开箱即用的所有标签都列在 Tiff_DirInfo.cs 文件中。
SetField
方法 returns false
当您尝试写入未知标记时。该库还会向控制台发出一条错误消息。
您可以使用与本示例中类似的代码教图书馆如何编写这些 GEOTIFF 标签
我终于可以将地理信息添加到我的 tiff 图像中,如下所示:
为"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); }
设置#1中定义的标签扩展方法
注意:此方法必须调用"BEFORE"打开或创建tiff图像才能生效。Tiff.SetTagExtender(TagExtender);
打开tiff图片:
this.tiff = Tiff.Open(fileName, "w");
添加标签(+需要基本标签):
棘手的部分是值(双精度数组)必须转换为对象。
否则,"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);
做一些与像素值相关的事情。
完成!