我已经获得了某些地区的数字高程图(地球高度图)。我的目标是创建逼真的地形。
地形生成没问题。我已经练习过使用 VC# & XNA 框架。
问题是那些高度图文件是 GeoTIFF 格式,我不知道如何阅读。我以前也没有阅读任何图像文件的经验,因此我可以使用互联网上关于阅读 GeoTIFF 文件的小技巧进行一些实验。到目前为止,我一直没有成功。
- 我拥有的 geoTIFF 文件是 3601 x 3601 文件。
- 每个文件有两个版本,一个十进制和数字文件。
- 每个文件都有地理坐标的每秒经度和纬度的数据以及高度图,即 Lon、Lat、距海平面的高度
如何阅读这些文件:)
我拥有的文件来自 ASTER G-DEM Version-2链接到官方描述根据他们 GeoTIFF 是非常标准的,这是因为我下载的一些 GeoTIFF Visualizer 正在向我显示正确的数据。
我将使用 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 位”