如何从C#中读取GeoTIFF文件

Moo*_*oon 5 gis geotiff c#-4.0

我已经获得了一些地区的数字高程地图(地球高度图).我的目标是创造逼真的地形.

地形生成没问题.我已经使用VC#和XNA框架练习了这个.

问题是那些高度图文件是GeoTIFF格式,我不知道如何阅读.我以前也没有阅读任何图像文件的经验,这样我就可以使用互联网上有关读取GeoTIFF文件的小技巧来试验一些东西.到目前为止,我一直没有成功.

  • 我拥有的geoTIFF文件是3601 x 3601文件.
  • 每个文件都有两个版本,一个十进制和数值文件.
  • 每个文件都有Geo-Coords经度和纬度的每秒数据以及高度图,即Lon,Lat,海拔高度

如何阅读这些文件:)

我所拥有的文件来自ASTER G-DEM Version-2 LINK TO OFFICIAL DESCRIPTION根据它们GeoTIFF是非常标准的,因为我dwonloaded的一些GeoTIFF展示台向我展示了正确的数据.

我将使用C#.如果我们谈论这种语言,我将不胜感激.


编辑

好吧,我得到了诽谤,这就是我所做的,

using (Tiff tiff = Tiff.Open(@"Test\N41E071_dem.tif", r"))
{
  int width   = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
  int height  = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
  double dpiX = tiff.GetField(TiffTag.XRESOLUTION)[0].ToDouble();
  double dpiY = tiff.GetField(TiffTag.YRESOLUTION)[0].ToDouble(); 

  byte[] scanline        = new byte[tiff.ScanlineSize()]; 
  ushort[] scanline16Bit = new ushort[tiff.ScanlineSize() / 2];

  for (int i = 0; i < height; i++)
  {
    tiff.ReadScanline(scanline, i); //Loading ith Line                        
    MultiplyScanLineAs16BitSamples(scanline, scanline16Bit, 16,i);
  }
}

private static void MultiplyScanLineAs16BitSamples(byte[] scanline, ushort[] temp, ushort factor,int row)
{
  if (scanline.Length % 2 != 0)
  {
    // each two bytes define one sample so there should be even number of bytes
    throw new ArgumentException();
  }

  Buffer.BlockCopy(scanline, 0,   temp, 0, scanline.Length);

  for (int i = 0; i < temp.Length; i++)
  {                
    temp[i] *= factor;
    MessageBox.Show("Row:"+row.ToString()+"Column:"+(i/2).ToString()+"Value:"+temp[i].ToString());
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在显示消息框,我正在显示相应的值,我正在做对,我问这个因为这是我对图像和8\16位问题的处女经验.我认为与libtiff的官方教程不同,我应该使用short而不是ushort,因为我使用的图像是"GeoTIFF,16位有符号"

Yah*_*hia 10

有一些SDK可以从C#中读取以读取GeoTIFF文件:

更新:

GeoTIFF的规范可以在这里找到- 对我来说,似乎GeoTIFFs可以包含不同的"信息子类型",而这些信息又需要被恰当地解释......