Как прочитать файл GeoTIFF из C # - PullRequest
5 голосов
/ 08 февраля 2012

Я приобрел Цифровые Карты Высот (Карта Высоты Земли) некоторой области. Моей целью было создание реалистичных ландшафтов.

Поколение ландшафта не проблема. Я практиковал это, используя VC # & XNA Framework.

Проблема в том, что эти файлы карт высот находятся в формате GeoTIFF, который я не знаю, как читать. Также у меня нет предыдущего опыта чтения каких-либо графических файлов, чтобы я мог что-то экспериментировать, используя в Интернете маленькие подсказки о чтении файлов GeoTIFF. До сих пор я был неудачным.

  • У меня есть файлы geoTIFF размером 3601 x 3601.
  • Каждый файл имеет две версии, десятичные и числовые файлы.
  • Каждый файл содержит данные о каждой секунде долготы и широты Geo-Coords вместе с картой высот, т.е. Lon, Lat, высота от уровня моря

Как читать эти файлы:)

Файлы, которые я имею, взяты из ASTER G-DEM Version-2 ССЫЛКА НА ОФИЦИАЛЬНОЕ ОПИСАНИЕ в соответствии с ними GeoTIFF довольно стандартен, потому что некоторые визуализаторы GeoTIFF, которые я загружал, показывают мне правильные данные.

Я собираюсь использовать C #. Буду признателен, если мы поговорим об этом языке.


E D I T

хорошо, у меня есть либтиф и вот что я сделал,

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());
  }
}

, где я отображаю окно сообщения, я отображаю соответствующие значения, Правильно ли я делаю , я спрашиваю, потому что это мой первый опыт работы с изображениями и 8 \ 16-битной проблемой. Я думаю, что в отличие от официальных руководств libtiff, я должен использовать short вместо ushort , потому что я использую "GeoTIFF, подписанные 16 битов"

Ответы [ 3 ]

9 голосов
/ 09 марта 2012

Существует несколько SDK, которые можно использовать из C # для чтения файлов GeoTIFF:

ОБНОВЛЕНИЕ:

Спецификацию для GeoTIFF можно найти здесь - мнепохоже, что GeoTIFF могут содержать разные «подтипы» информации, которые, в свою очередь, должны интерпретироваться соответствующим образом ...

2 голосов
/ 11 декабря 2015

Вот парень, который сделал это без GDAL: http://build -failed.blogspot.com.au / 2014/12 / processing-geotiff-files-in-net-without.html

GDAL доступен в NuGet, однако.

0 голосов
/ 08 июля 2015

Если GeoTIFF содержит плитки, вам нужен другой подход. Вот как читать GeoTiff, который содержит 32-битные числа с плавающей запятой и данные о высоте:

  int buffersize = 1000000;
  using (Tiff tiff = Tiff.Open(geotifffile, "r"))
  {
    int nooftiles = tiff.GetField(TiffTag.TILEBYTECOUNTS).Length;
    int width = tiff.GetField(TiffTag.TILEWIDTH)[0].ToInt();
    int height = tiff.GetField(TiffTag.TILELENGTH)[0].ToInt();
    byte[] buffer = new byte[buffersize];

    for (int i = 0; i < nooftiles; i++)
    {
      int size = tiff.ReadEncodedTile(i, buffer, 0, buffersize);
      float[,] data = new float[width, height];
      Buffer.BlockCopy(buffer, 0, data, 0, size); // Convert byte array to x,y array of floats (height data)
      // Do whatever you want with the height data (calculate hillshade images etc.)
    }
  }
...