您的位置:首页 > 编程语言 > C#

基于gdal用c#读取hdf4文件

2015-11-03 11:24 519 查看
编译GDAL 参考 http://blog.csdn.net/wangpei421/article/details/8217513
我只需要集成HDF,按照上述方法编译成功,但是调用时出现了问题:

问题1. 遇到安全透明代码无法调用本机代码的问题,后来发现时由于编译GDAL时对nmake.opt文件中MSVC_VER 没有做修改,因为我是用VS2010的,所以修改成MSVC_VER=1600,重新编译就好了。

问题2.OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常的问题,解决办法是把gdal及其依赖的dll都拷贝到C#程序的输出目录下。因为涉及到的dll很多,我用了比较笨的办法,把显然不会用到的去除,在可能用到的DLL中逐个尝试,留下了有用的。

C# 读取HDF4数据集数据

namespace ReadHDF4
{
class
Program
{
static
void Main(string[]args)
{
OSGeo.GDAL.Gdal.AllRegister();//注册所有的格式驱动
OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");//支持中文路径和名称
stringhdfFileName =
@"D:\NOAA16_AVHRR_20030301_SNC_Td.hdf";
//打开hdf文件
DatasetdsFile =
Gdal.Open(hdfFileName, Access.GA_ReadOnly);
if(dsFile ==
null)
{
Console.WriteLine("不能打开该文件,请检查文件是否存在");
return;
}

//获取存储的子数据集的路径描述信息数据列表
/*数据集信息按顺序按对排列:
*SUBDATASET_1_NAME=HDF4_SDS:UNKNOWN:\"D:\\NOAA16_AVHRR_20030301_SNC_Td.hdf\":0
* SUBDATASET_1_DESC=[5000x8000]10Day_CMG_Max_Snow_Cover (8-bit unsigned integer)
*SUBDATASET_2_NAME=HDF4_SDS:UNKNOWN:\"D:\\NOAA16_AVHRR_20030301_SNC_Td.hdf\":1
* SUBDATASET_2_DESC=[5000x8000]10Day_CMG_Max_Snow_Cover_Date (8-bit unsigned integer)
*/
string[]subDataSets = dsFile.GetMetadata("SUBDATASETS");
dsFile.Dispose();

stringdsName =
"10Day_CMG_Max_Snow_Cover";
//根据数据集名称获取数据集名称信息
stringdataSetInfo =
"";
for(int i=0; i<subDataSets.Length; i++){
string[]descInfo = subDataSets[i].Split(' ');
if(descInfo.Length>1)
{
foreach(string sindescInfo)
{
if (s.Equals(dsName))
{
dataSetInfo =subDataSets[i - 1];
}

}
}
}

//取”SUBDATASET_1_NAME=”后面的内容,并去除“””
dataSetInfo = dataSetInfo.Split('=')[1].Replace("\"","");
//根据SUBDATASET_1_NAME打开数据集
Datasetds =
Gdal.Open(dataSetInfo, Access.GA_ReadOnly);
if(ds==
null){
Console.WriteLine("不能打开该数据集,请检查数据集是否存在!");
return;
}
//读取数据集信息
Banddemband = ds.GetRasterBand(1);
int[]databuf =
new int[5000* 8000];
demband.ReadRaster(0, 0,ds.RasterXSize, ds.RasterYSize, databuf, ds.RasterXSize, ds.RasterYSize, 0, 0);//读取数据
Console.WriteLine(databuf[8000*33+460]);

//读取属性值
stringattr = ds.GetMetadataItem("units",null);
ds.Dispose();
Console.ReadLine();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: