文档库 最新最全的文档下载
当前位置:文档库 › geotiff

geotiff

代码编写:王洪杰 Email: imwhj@https://www.wendangku.net/doc/d715330777.html,
本人初次研究GDAL时写的读取GeoTIFF高程类,可完美运行
如果运行有错误请先确保GDAL库配置无误
写法、注释及数据类型等是个人偏好
可在本代码基础上修改读取其它精度的GeoTIFF格式文件
因个人工作需要,本类仅用于读取高程数据到二维矩阵中,未涉及坐标处理
本源码完全免费使用,如果你觉得不错可给本人邮箱发信说明一下

本源码上传日期 11:04 2013/12/6


有对C#+Direct3D、SlimDX开发三维程序的朋友请加QQ群 259284988



using OSGeo.GDAL;
namespace GdalReadTiff
{
///


/// 使用GDAL读取GeoTiff高程数据
///

/// 经过在float和double之间考虑,还是确定使用float。DEM要求精度不高。
/// 使用数据集Dataset ds;ds.ReadRaster的方式也可以读取数据,只是功能更多 2013.7.16
/// GetMinimum,GetMaximum基本上dem里直接都有,不过有时候不一定,所以需要ComputeRasterMinMax
/// ComputeRasterMinMax?也是遍历数据之后,GDAL会把最大最小值写入.aux.xml中,下次就不需要再统计一遍了。如果有这个.aux.xml文件,直接调用函数GDALRasterBand::GetMinimum()和GDALRasterBand::GetMaximum()就能获取到准确的结果 2013.7.19
/// 改写输出为二维数组,通过返回int来表示错误类型 2013.7.26
/// Band.ReadRaster还可以将DEM数据伸缩到指定尺寸后输出,本类增加后今天又取消这个功能 2013.7.28

internal class ReadTiff
{
private static float _NoDataVal; //无高程之值
private static float _Min, _Max; //最小最大值
private static int _BandWidth, _BandHeight; //宽高像素

///
/// 读取DEM数据到二维数组,成功返0,出错返>0数字代码
/// 1 = 打开DEM过程发生未知错误
/// 2 = GDAL运行库错误
/// 3 = DEM读取路径错误
/// 4 = DEM数据集错误
/// 5 = DEM数据驱动错误
/// 6 = DEM数据格式错误
/// 7 = DEM数据读取无效
///

public static int GetData(string strFilePath, out float[,] TiffData)
{
int OutWidth = 0;
int OutHeight = 0;

TiffData = null;

try
{
Gdal.AllRegister();
}
catch { return 2; }

Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); //支持中文

Dataset ds;
try
{
ds = Gdal.Open(strFilePath, Access.GA_ReadOnly);
}
catch { return 3; }

if (ds == null)
{ return 4; }

Driver drv = ds.GetDriver();
if (drv == null)
{ return 5; }

try

{
Band Band = ds.GetRasterBand(1);
OutWidth = _BandWidth = Band.XSize;
OutHeight = _BandHeight = Band.YSize;

//获取空高程值
double val; int hasval;
Band.GetNoDataValue(out val, out hasval);
if (hasval != 0)
{ _NoDataVal = (float)val; }
else
{ return 6; }

//获取最小最大值
double[] lim = new double[2];
https://www.wendangku.net/doc/d715330777.html,puteRasterMinMax(lim, 1); //最后的ApproxOK设为1,设为0效果一样
_Min = (float)lim[0];
_Max = (float)lim[1];

//获取DEM数值到一维数组
float[] data = new float[OutWidth * OutHeight];
CPLErr err = Band.ReadRaster(0, 0, OutWidth, OutHeight, data, OutWidth, OutHeight, 0, 0);
Band.Dispose();
if (err != CPLErr.CE_None)
{ return 7; }

//将一维数组变成二维数组
int c = 0;
TiffData = new float[OutWidth, OutHeight];
for (int y = 0; y < OutHeight; y++)
{
for (int x = 0; x < OutWidth; x++)
{

//如果像素没有高程值,自动使用最小值,这里未使用三元操作符
if (data[c] == _NoDataVal)
{
TiffData[x, y] = _Min;
}
else
{
TiffData[x, y] = data[c];
}
c++;
}
}
return 0;
}
catch
{
return 1;
}
}

//空高程值
public static float GetNoDataValue
{
get { return _NoDataVal; }
}

//最小值
public static float GetMinimum
{
get { return _Min; }
}

//最大值
public static float GetMaximum
{
get { return _Max; }
}

//数据宽
public static int BandWidth
{
get { return _BandWidth; }
}

//数据高
public static int BandHeight
{
get { return _BandHeight; }
}
}
}



相关文档
相关文档 最新文档