8

ある地域の数値標高図(地球の高さ図)を取得しました。私の目的は、リアルな地形を作成することでした。

地形生成は問題ありません。私は VC# と XNA フレームワークを使用してそれを実践しました。

問題は、これらの高さマップ ファイルが、読み方がわからない GeoTIFF 形式であることです。また、GeoTIFF ファイルの読み取りについてインターネットで入手できるちょっとしたヒントを使用して何かを実験できるように、画像ファイルを読み取った経験もありません。これまでのところ、私は成功していません。

  • 私が持っている geoTIFF ファイルは 3601 x 3601 ファイルです。
  • 各ファイルには、10 進数と num 値のファイルの 2 つのバージョンがあります。
  • 各ファイルには、地理座標の経度と緯度の毎秒のデータと、高さマップ、つまり経度、緯度、海面からの高さのデータが含まれています

これらのファイルの読み方:)

私が持っているファイルは、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 の公式チュートリアルとは異なり、使用している画像は「GeoTIFF、署名付き 16 ビット」であるため、ushortの代わりにshortを使用する必要があると思います

4

3 に答える 3

12

GeoTIFF ファイルを読み取るために C# から使用できる SDK がいくつかあります。

アップデート:

GeoTIFF の仕様はここにあります。GeoTIFF には、適切に解釈する必要があるさまざまな「サブタイプ」の情報を含めることができるようです...

于 2012-03-09T16:54:37.250 に答える
1

GeoTIFF にタイルが含まれている場合は、別のアプローチが必要です。これは、高さデータを持つ 32 ビット浮動小数点数を含む GeoTiff を読み取る方法です。

  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.)
    }
  }
于 2015-07-08T19:11:23.777 に答える