项目里面要用到降雨的数据,正好是.NC格式的,以前也没用过,正好记录下,大家也可以参考下,首先是arcgis是如何处理NC数据的,在arcgis软件里面有个多维工具箱,我用的是汉化版本的,英文版应该叫Multidimension Tools,在这个工具箱下面有个——创建NetCDF栅格图层,双击这个工具,就可以看见如下这个界面:
第一个你的NC文件,这个文件你可以直接拖进来就行,但是有个小问题,你的NC文件的路径不要出现中文的字符串,很多人在拖进来之后发现除了第一个框有东西,下面的几个文本框是没有东西的,就是因为你的数据存储路径有中文的字符串导致的,正常你把数据拖进来,这几个文本框就会有默认的东西,变量,维度,输出栅格图层这些,当然在“变量”本文框里,你是可以选择别的变量的,我这个是降雨的数据,我这里选择的是apcp_10min,就是10分钟一次的意思,里面还有1小时,3小时,6小时等。下面的是“维度”,有x维度,y维度,这两个文本框要跟你的NC格式数据的xy(有的是经纬度)对应上,之后是“输出栅格图层”名称,这个就随意,剩下的都是可选的就不说了,之后点击“确定”按钮,这个数据就如图:
这个数据其中的一个,NC格式的数据是多维的,这个时候你可以打开图层的“图层属性”,如下,在纬度值有个维度“first _hour_time”,后边的值有0123456,上面展示的是默认的值,是0,你可以选择1或者2分别查看,数据都是不同的,因为我这个是降雨的数据,间隔是10分钟,0就是开始的时候,1就是间隔10分钟之后的数据,2就是再过了10分钟的数据,以此类推,如图:
在选择2的时候,如图:
这个NC的数据就是这么查看,但是如果你想要这份数据还需要一步,就是导出到本地,目录树上,右键点击数据,选择——导出数据,如图,选择导出的格式,填写名称就可以了,就可以导出到本地了。
上面就是通过arcgis软件来处理NC数据,QGIS软件也是可以处理的,貌似比arcgis要方便些,但是我对QGIS不是太熟悉就不说了,下面我用代码对NC数据进行读取,我用的是C# ,Arcengine的形式,代码:
/// <summary>
/// 读取nc数据
/// </summary>
private void Open_NetCDF()
{
try
{
IWorkspaceFactory wsf = new NetCDFWorkspaceFactoryClass();
// string file = filepath + filename;
string nc = @“C:\Users\Desktop\data\059\01.nc”;
string filePath = System.IO.Path.GetDirectoryName(nc);
string ncName = System.IO.Path.GetFileNameWithoutExtension(nc);
//string
IWorkspaceFactory pWKSF = new RasterWorkspaceFactoryClass();
string outputName = Application.StartupPath + @"\temp\cdf.tif";
string fileName = System.IO.Path.GetDirectoryName(outputName);
IWorkspace pWorkspace = pWKSF.OpenFromFile(filePath, 0);
//保存栅格数据的工作空间
IWorkspace pWorkspaceRaster = pWKSF.OpenFromFile(fileName, 0);
INetCDFWorkspace netws = (INetCDFWorkspace)wsf.OpenFromFile(nc, 0);
IMDRasterDatasetView mdrasview = new NetCDFRasterDatasetNameClass();
//对应arcgis里面的x维度,y维度,变量
rasterView.XDimension = "x";
rasterView.YDimension = "y";
rasterView.Variable = "apcp_10min";
IMDWorkspace mdwksp = netws as IMDWorkspace;
IRasterDataset rasterds = mdwksp.CreateView("cdfRaster", (IMDDatasetView)mdrasview) as IRasterDataset;
IRasterLayer rl = new RasterLayerClass();
rl.CreateFromDataset(rasterds);
//rl接口可以转到ISaveAs接口,就可以保存到本地了,下面的代码我就不写了。
}
catch (Exception ex)
{
}
}
上面的代码就可以读取NC数据,但是上面的代码只可以读取位置“0”的数据,就是维度值“first_hour_time”,值等于0的时候的数据,如果我想取位置是3或者4的时候,还需要加一段代码,这个问题也困扰我几天,代码不多,但是就是好使啊,下面是核心的代码:
IMDRasterDatasetView rasterView = new NetCDFRasterDatasetNameClass();
rasterView.XDimension = "x";
rasterView.YDimension = "y";
rasterView.Variable = "apcp_10min";
IMDDatasetView datasetView = rasterView as IMDDatasetView;
IMDWorkspace kk = netws as IMDWorkspace;
IDataset result = kk.CreateView("sdf", datasetView);
datasetView = result.FullName as IMDDatasetView;
datasetView.SelectDimensionByValue("first_hour_time", 3);
IDataset result1 = kk.CreateView("sdf", datasetView);
IRasterDataset rasterDataset = result1 as IRasterDataset;
IRasterLayer rl = new RasterLayerClass();
rl.CreateFromDataset(rasterDataset);
加了这几句,其实就是选择了维度值,然后再重新创建了视图,
datasetView = result.FullName as IMDDatasetView;
datasetView.SelectDimensionByValue("first_hour_time", 3);
IDataset result1 = kk.CreateView("sdf", datasetView);
这样就可以按照特定的维度值来选择数据了。