从geotiff光栅文件

时间:2018-06-19 09:20:24

标签: geotiff libtiff.net

我正在使用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光栅文件中获取所有列值吗?

0 个答案:

没有答案