arcgis读取NetCDF格式的数据(c#读取数据)

项目里面要用到降雨的数据,正好是.NC格式的,以前也没用过,正好记录下,大家也可以参考下,首先是arcgis是如何处理NC数据的,在arcgis软件里面有个多维工具箱,我用的是汉化版本的,英文版应该叫Multidimension Tools,在这个工具箱下面有个——创建NetCDF栅格图层,双击这个工具,就可以看见如下这个界面:

arcgis读取NetCDF格式的数据(c#读取数据)_第1张图片

 第一个你的NC文件,这个文件你可以直接拖进来就行,但是有个小问题,你的NC文件的路径不要出现中文的字符串,很多人在拖进来之后发现除了第一个框有东西,下面的几个文本框是没有东西的,就是因为你的数据存储路径有中文的字符串导致的,正常你把数据拖进来,这几个文本框就会有默认的东西,变量,维度,输出栅格图层这些,当然在“变量”本文框里,你是可以选择别的变量的,我这个是降雨的数据,我这里选择的是apcp_10min,就是10分钟一次的意思,里面还有1小时,3小时,6小时等。下面的是“维度”,有x维度,y维度,这两个文本框要跟你的NC格式数据的xy(有的是经纬度)对应上,之后是“输出栅格图层”名称,这个就随意,剩下的都是可选的就不说了,之后点击“确定”按钮,这个数据就如图:

arcgis读取NetCDF格式的数据(c#读取数据)_第2张图片

 这个数据其中的一个,NC格式的数据是多维的,这个时候你可以打开图层的“图层属性”,如下,在纬度值有个维度“first _hour_time”,后边的值有0123456,上面展示的是默认的值,是0,你可以选择1或者2分别查看,数据都是不同的,因为我这个是降雨的数据,间隔是10分钟,0就是开始的时候,1就是间隔10分钟之后的数据,2就是再过了10分钟的数据,以此类推,如图:

arcgis读取NetCDF格式的数据(c#读取数据)_第3张图片

在选择2的时候,如图:

arcgis读取NetCDF格式的数据(c#读取数据)_第4张图片

 这个NC的数据就是这么查看,但是如果你想要这份数据还需要一步,就是导出到本地,目录树上,右键点击数据,选择——导出数据,如图,选择导出的格式,填写名称就可以了,就可以导出到本地了。

arcgis读取NetCDF格式的数据(c#读取数据)_第5张图片

 上面就是通过arcgis软件来处理NC数据,QGIS软件也是可以处理的,貌似比arcgis要方便些,但是我对QGIS不是太熟悉就不说了,下面我用代码对NC数据进行读取,我用的是C# ,Arcengine的形式,代码:

   ///


        /// 读取nc数据
        ///

        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);

这样就可以按照特定的维度值来选择数据了。

 

你可能感兴趣的:(GIS开发,Engine开发,C#语法,arcgis,c#)