我正在使用libtiff.net,并且我的geotiff文件在转换为ASCII网格化XYZ(通过gdal_translate -of XYZ <input.tif> <output.xyz>
函数)后具有完全相同的格式。
<LONGITUDE> <LATITUDE> <VALUE1>
到目前为止,我正在关注教程here,虽然我可以通过关注博客帖子中的代码示例来获取经度和纬度:
using (Tiff tiff = Tiff.Open(filePath, "r"))
{
int height = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
FieldValue[] modelPixelScaleTag = tiff.GetField((TiffTag)33550);
FieldValue[] modelTiepointTag = tiff.GetField((TiffTag)33922);
byte[] modelPixelScale = modelPixelScaleTag[1].GetBytes();
double pixelSizeX = BitConverter.ToDouble(modelPixelScale, 0);
double pixelSizeY = BitConverter.ToDouble(modelPixelScale, 8)*-1;
byte[] modelTransformation = modelTiepointTag[1].GetBytes();
double originLon = BitConverter.ToDouble(modelTransformation, 24);
double originLat = BitConverter.ToDouble(modelTransformation, 32);
double startLat = originLat + (pixelSizeY/2.0);
double startLon = originLon + (pixelSizeX / 2.0);
var scanline = new byte[tiff.ScanlineSize()];
//TODO: Check if band is stored in 1 byte or 2 bytes.
//If 2, the following code would be required
//var scanline16Bit = new ushort[tiff.ScanlineSize() / 2];
//Buffer.BlockCopy(scanline, 0, scanline16Bit, 0, scanline.Length);
double currentLat = startLat;
double currentLon = startLon;
int count=0;
for (int i = 0; i < height; i++)
{
tiff.ReadScanline(scanline, i); //Loading ith Line
var latitude = currentLat + (pixelSizeY * i);
for (var j = 0; j < scanline.Length; j++)
{
var longitude = currentLon + (pixelSizeX*j);
object value = scanline[j];
count++;
}
}
}
为了获得scanline[j]
列,我可能需要对VALUE1
进行一些操作,但我不确定这是怎么可能的,不知道如何做到这一点?< / p>
此外,在我的<output.xyz>
文件中,我有100万个++数据点,但似乎我的count
只有四分之一。我不确定为什么会这样。
任何人都可以使用libtiff.net从geotiff光栅文件中获取所有列值吗?