Как читать файл GeoTIFF из C #

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

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

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

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

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

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

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


РЕДАКТИРОВАТЬ

хорошо, я получил libtiff , и вот что я сделал,

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 бит с подписью»

5
задан Viliam Simko 5 October 2016 в 22:01
поделиться