ある地域の数値標高図(地球の高さ図)を取得しました。私の目的は、リアルな地形を作成することでした。
地形生成は問題ありません。私は 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を使用する必要があると思います