c#中使用NetCDF存储二维数据的读写操作简单应用

 
  
ExpandedBlockStart.gif
  1  public  static  class NetCDF
  2     {
  3         [DllImport( " netcdf4.dll ")]
  4          public  static  extern  int nc_put_att_uchar( int ncid,  int varid,  string name, NcType xtype,  int len,  byte[] op);
  5         [DllImport( " netcdf4.dll ")]
  6          public  static  extern  int nc_get_att_uchar( int ncid,  int varid,  string name,  byte[] op);
  7 
  8         [DllImport( " netcdf4.dll ")]
  9          public  static  extern  int nc_get_var_uchar( int ncid,  int varid,  byte[] ip);
 10         [DllImport( " netcdf4.dll ")]
 11          public  static  extern  int nc_get_var_text( int ncid,  int varid, StringBuilder ip);
 12       
 13 
 14         [DllImport( " netcdf4.dll ")]
 15          public  static  extern  int nc_open( string path, CreateMode mode,  out  int ncidp);
 16         [DllImport( " netcdf4.dll ")]
 17          public  static  extern  int nc_create( string path, CreateMode mode,  out  int ncidp);
 18         [DllImport( " netcdf4.dll ")]
 19          public  static  extern  int nc_close( int ncidp);
 20         [DllImport( " netcdf4.dll ")]
 21          public  static  extern  int nc_sync( int ncid);
 22         [DllImport( " netcdf4.dll ")]
 23          public  static  extern  int nc_enddef( int ncid);
 24         [DllImport( " netcdf4.dll ")]
 25          public  static  extern  int nc_redef( int ncid);
 26         [DllImport( " netcdf4.dll ")]
 27          public  static  extern  string nc_strerror( int ncerror);
 28 
 29         [DllImport( " netcdf4.dll ")]
 30          public  static  extern  int nc_inq( int ncid,  out  int ndims,  out  int nvars,  out  int ngatts,  out  int unlimdimid);
 31 
 32         [DllImport( " netcdf4.dll ")]
 33          public  static  extern  int nc_def_var( int ncid,  string name, NcType xtype,  int ndims,  int[] dimids,  out  int varidp);
 34         [DllImport( " netcdf4.dll ")]
 35          public  static  extern  int nc_inq_var( int ncid,  int varid, StringBuilder name,  out NcType type,  out  int ndims,  int[] dimids,  out  int natts);
 36         [DllImport( " netcdf4.dll ")]
 37          public  static  extern  int nc_inq_varids( int ncid,  out  int nvars,  int[] varids);
 38         [DllImport( " netcdf4.dll ")]
 39          public  static  extern  int nc_inq_vartype( int ncid,  int varid,  out NcType xtypep);
 40         [DllImport( " netcdf4.dll ")]
 41          public  static  extern  int nc_inq_varnatts( int ncid,  int varid,  out  int nattsp);
 42         [DllImport( " netcdf4.dll ")]
 43          public  static  extern  int nc_inq_varid( int ncid,  string name,  out  int varidp);
 44 
 45         [DllImport( " netcdf4.dll ")]
 46          public  static  extern  int nc_inq_ndims( int ncid,  out  int ndims);
 47         [DllImport( " netcdf4.dll ")]
 48          public  static  extern  int nc_inq_nvars( int ncid,  out  int nvars);
 49         [DllImport( " netcdf4.dll ")]
 50          public  static  extern  int nc_inq_varname( int ncid,  int varid, StringBuilder name);
 51         [DllImport( " netcdf4.dll ")]
 52          public  static  extern  int nc_inq_varndims( int ncid,  int varid,  out  int ndims);
 53         [DllImport( " netcdf4.dll ")]
 54          public  static  extern  int nc_inq_vardimid( int ncid,  int varid,  int[] dimids);
 55         [DllImport( " netcdf4.dll ")]
 56          public  static  extern  int nc_inq_var_fill( int ncid,  int varid,  out  int no_fill,  out  object fill_value);
 57 
 58 
 59         [DllImport( " netcdf4.dll ")]
 60          public  static  extern  int nc_inq_natts( int ncid,  out  int ngatts);
 61         [DllImport( " netcdf4.dll ")]
 62          public  static  extern  int nc_inq_unlimdim( int ncid,  out  int unlimdimid);
 63         [DllImport( " netcdf4.dll ")]
 64          public  static  extern  int nc_inq_format( int ncid,  out  int format);
 65 
 66         [DllImport( " netcdf4.dll ")]
 67          public  static  extern  int nc_inq_attname( int ncid,  int varid,  int attnum, StringBuilder name);
 68         [DllImport( " netcdf4.dll ")]
 69          public  static  extern  int nc_inq_att( int ncid,  int varid,  string name,  out NcType type,  out  int length);
 70         [DllImport( " netcdf4.dll ")]
 71          public  static  extern  int nc_get_att_text( int ncid,  int varid,  string name, StringBuilder value);
 72         [DllImport( " netcdf4.dll ")]
 73          public  static  extern  int nc_get_att_schar( int ncid,  int varid,  string name,  sbyte[] data);
 74         [DllImport( " netcdf4.dll ")]
 75          public  static  extern  int nc_get_att_short( int ncid,  int varid,  string name,  short[] data);
 76         [DllImport( " netcdf4.dll ")]
 77          public  static  extern  int nc_get_att_int( int ncid,  int varid,  string name,  int[] data);
 78         [DllImport( " netcdf4.dll ")]
 79          public  static  extern  int nc_get_att_float( int ncid,  int varid,  string name,  float[] data);
 80         [DllImport( " netcdf4.dll ")]
 81          public  static  extern  int nc_get_att_double( int ncid,  int varid,  string name,  double[] data);
 82         [DllImport( " netcdf4.dll ")]
 83          public  static  extern  int nc_get_att_long( int ncid,  int varid,  string name,  long[] data);
 84         [DllImport( " netcdf4.dll ")]
 85          public  static  extern  int nc_get_att_longlong( int ncid,  int varid,  string name,  long[] data);
 86 
 87         [DllImport( " netcdf4.dll ")]
 88          public  static  extern  int nc_put_att_text( int ncid,  int varid,  string name,  int len,  string tp);
 89         [DllImport( " netcdf4.dll ")]
 90          public  static  extern  int nc_put_att_double( int ncid,  int varid,  string name, NcType type,  int len,  double[] tp);
 91         [DllImport( " netcdf4.dll ")]
 92          public  static  extern  int nc_put_att_int( int ncid,  int varid,  string name, NcType type,  int len,  int[] tp);
 93         [DllImport( " netcdf4.dll ")]
 94          public  static  extern  int nc_put_att_short( int ncid,  int varid,  string name, NcType type,  int len,  short[] tp);
 95         [DllImport( " netcdf4.dll ")]
 96          public  static  extern  int nc_put_att_float( int ncid,  int varid,  string name, NcType type,  int len,  float[] tp);
 97         [DllImport( " netcdf4.dll ")]
 98          public  static  extern  int nc_put_att_byte( int ncid,  int varid,  string name, NcType type,  int len,  sbyte[] tp);
 99         [DllImport( " netcdf4.dll ")]
100          public  static  extern  int nc_put_att_long( int ncid,  int varid,  string name, NcType type,  int len,  long[] tp);
101         [DllImport( " netcdf4.dll ")]
102          public  static  extern  int nc_put_att_longlong( int ncid,  int varid,  string name, NcType type,  int len,  long[] tp);
103 
104         [DllImport( " netcdf4.dll ")]
105          public  static  extern  int nc_def_dim( int ncid,  string name,  int len,  out  int dimidp);
106         [DllImport( " netcdf4.dll ")]
107          public  static  extern  int nc_inq_dim( int ncid,  int dimid, StringBuilder name,  out  int length);
108         [DllImport( " netcdf4.dll ")]
109          public  static  extern  int nc_inq_dimname( int ncid,  int dimid, StringBuilder name);
110         [DllImport( " netcdf4.dll ")]
111          public  static  extern  int nc_inq_dimid( int ncid,  string name,  out  int dimid);
112         [DllImport( " netcdf4.dll ")]
113          public  static  extern  int nc_inq_dimlen( int ncid,  int dimid,  out  int length);
114 
115 
116         [DllImport( " netcdf4.dll ")]
117          public  static  extern  int nc_get_var_text( int ncid,  int varid,  byte[] data);
118         [DllImport( " netcdf4.dll ")]
119          public  static  extern  int nc_get_var_schar( int ncid,  int varid,  sbyte[] data);
120         [DllImport( " netcdf4.dll ")]
121          public  static  extern  int nc_get_var_short( int ncid,  int varid,  short[] data);
122         [DllImport( " netcdf4.dll ")]
123          public  static  extern  int nc_get_var_int( int ncid,  int varid,  int[] data);
124         [DllImport( " netcdf4.dll ")]
125          public  static  extern  int nc_get_var_long( int ncid,  int varid,  long[] data);
126         [DllImport( " netcdf4.dll ")]
127          public  static  extern  int nc_get_var_float( int ncid,  int varid,  float[,] data);
128         [DllImport( " netcdf4.dll ")]
129          public  static  extern  int nc_get_var_double( int ncid,  int varid,  double[] data);
130 
131         [DllImport( " netcdf4.dll ")]
132          public  static  extern  int nc_put_var_ubyte( int ncid,  int varid,  byte[,] data);
133         [DllImport( " netcdf4.dll ")]
134          public  static  extern  int nc_put_var_int( int ncid,  int varid,  int[,] data);
135         [DllImport( " netcdf4.dll ")]
136          public  static  extern  int nc_put_var_text( int ncid,  int varid,  string op);
137         [DllImport( " netcdf4.dll ")]
138          public  static  extern  int nc_put_var_uchar( int ncid,  int varid,  out  byte[] op);
139         [DllImport( " netcdf4.dll ")]
140          public  static  extern  int nc_put_var_float( int ncid,  int varid,  float[,] data);
141         [DllImport( " netcdf4.dll ")]
142          public  static  extern  int nc_put_var_long( int ncid,  int varid,  long[] data);
143 
144 
145         [DllImport( " netcdf4.dll ")]
146          public  static  extern  int nc_put_vara_double( int ncid,  int varid,  int[] start,  int[] count,  double[] dp);
147         [DllImport( " netcdf4.dll ")]
148          public  static  extern  int nc_put_vara_float( int ncid,  int varid,  int[] start,  int[] count,  float[] fp);
149         [DllImport( " netcdf4.dll ")]
150          public  static  extern  int nc_put_vara_short( int ncid,  int varid,  int[] start,  int[] count,  short[] sp);
151         [DllImport( " netcdf4.dll ")]
152          public  static  extern  int nc_put_vara_int( int ncid,  int varid,  int[] start,  int[] count,  int[] ip);
153         [DllImport( " netcdf4.dll ")]
154          public  static  extern  int nc_put_vara_long( int ncid,  int varid,  int[] start,  int[] count,  long[] lp);
155         [DllImport( " netcdf4.dll ")]
156          public  static  extern  int nc_put_vara_ubyte( int ncid,  int varid,  int[] start,  int[] count,  byte[] bp);
157         [DllImport( " netcdf4.dll ")]
158          public  static  extern  int nc_put_vara_schar( int ncid,  int varid,  int[] start,  int[] count,  sbyte[] cp);
159         [DllImport( " netcdf4.dll ")]
160          public  static  extern  int nc_put_vara_string( int ncid,  int varid,  int[] start,  int[] count,  string[] sp);
161 
162 
163         [DllImport( " netcdf4.dll ")]
164          public  static  extern  int nc_get_vara_text( int ncid,  int varid,  int[] start,  int[] count,  byte[] data);
165         [DllImport( " netcdf4.dll ")]
166          public  static  extern  int nc_get_vara_schar( int ncid,  int varid,  int[] start,  int[] count,  sbyte[] data);
167         [DllImport( " netcdf4.dll ")]
168          public  static  extern  int nc_get_vara_short( int ncid,  int varid,  int[] start,  int[] count,  short[] data);
169         [DllImport( " netcdf4.dll ")]
170          public  static  extern  int nc_get_vara_ubyte( int ncid,  int varid,  int[] start,  int[] count,  byte[] data);
171         [DllImport( " netcdf4.dll ")]
172          public  static  extern  int nc_get_vara_long( int ncid,  int varid,  int[] start,  int[] count,  long[] data);
173         [DllImport( " netcdf4.dll ")]
174          public  static  extern  int nc_get_vara_int( int ncid,  int varid,  int[] start,  int[] count,  int[] data);
175         [DllImport( " netcdf4.dll ")]
176          public  static  extern  int nc_get_vara_float( int ncid,  int varid,  int[] start,  int[] count,  float[] data);
177         [DllImport( " netcdf4.dll ")]
178          public  static  extern  int nc_get_vara_double( int ncid,  int varid,  int[] start,  int[] count,  double[] data);
179         [DllImport( " netcdf4.dll ")]
180          public  static  extern  int nc_get_vara_string( int ncid,  int varid,  int[] start,  int[] count,  string[] data);
181    
182          /// <summary>
183           /// 'size' argument to ncdimdef for an unlimited dimension
184           /// </summary>
185           public  const  int NC_UNLIMITED =  0;
186 
187          /// <summary>
188           /// attribute id to put/get a global attribute
189           /// </summary>
190           public  const  int NC_GLOBAL = - 1;
191 
192          /// <summary>
193           /// The netcdf external data types
194           /// </summary>
195           public  enum NcType :  int
196         {
197              /// <summary> signed 1 byte intege </summary>
198              NC_BYTE =  1,
199              /// <summary> ISO/ASCII character </summary>
200              NC_CHAR =  2,
201              /// <summary> signed 2 byte integer </summary>
202              NC_SHORT =  3,
203              /// <summary> signed 4 byte integer </summary>
204              NC_INT =  4,
205              /// <summary> single precision floating point number </summary>
206              NC_FLOAT =  5,
207              /// <summary> double precision floating point number </summary>
208              NC_DOUBLE =  6,
209              /// <summary> signed 8-byte int </summary>
210              NC_INT64 =  10,
211              /// <summary> string </summary>
212              NC_STRING =  12
213         }
214 
215          public  static Type GetCLRType(NcType ncType)
216         {
217              switch (ncType)
218             {
219                  case NcType.NC_BYTE:
220                  return  typeof( byte);
221                  case NcType.NC_CHAR:
222                  return  typeof( sbyte);
223                  case NcType.NC_SHORT:
224                  return  typeof( short);
225                  case NcType.NC_INT:
226                  return  typeof( int);
227                  case NcType.NC_INT64:
228                  return  typeof( long);
229                  case NcType.NC_FLOAT:
230                  return  typeof( float);
231                  case NcType.NC_DOUBLE:
232                  return  typeof( double);
233                  case NcType.NC_STRING:
234                  return  typeof( string);
235                  default:
236                  throw  new ApplicationException( " Unknown nc type ");
237             }
238         }
239 
240          public  static NcType GetNcType(Type type)
241         {
242              switch (Type.GetTypeCode(type))
243             {
244                  case TypeCode.Double:
245                  return NcType.NC_DOUBLE;
246 
247                  case TypeCode.Single:
248                  return NcType.NC_FLOAT;
249 
250                  case TypeCode.Int64:
251                  return NcType.NC_INT64;
252 
253                  case TypeCode.Int32:
254                  return NcType.NC_INT;
255 
256                  case TypeCode.Int16:
257                  return NcType.NC_SHORT;
258 
259                  case TypeCode.Byte:
260                  return NcType.NC_BYTE;
261 
262                  case TypeCode.SByte:
263                  return NcType.NC_CHAR;
264 
265                  case TypeCode.String:
266                  return NcType.NC_STRING;
267 
268                  case TypeCode.DateTime:
269                  return NcType.NC_INT64;
270 
271 
272                  default:
273                  throw  new NotSupportedException( " Not supported type of data. ");
274             }
275         }
276 
277          public  enum CreateMode :  int
278         {
279             NC_NOWRITE =  0,
280              /// <summary> read & write </summary>
281              NC_WRITE =  0x0001,
282             NC_CLOBBER =  0,
283              /// <summary> Don't destroy existing file on create </summary>
284              NC_NOCLOBBER =  0x0004,
285              /// <summary> argument to ncsetfill to clear NC_NOFILL </summary>
286              NC_FILL =  0,
287              /// <summary> Don't fill data section an records </summary>
288              NC_NOFILL =  0x0100,
289              /// <summary> Use locking if available </summary>
290              NC_LOCK =  0x0400,
291              /// <summary> Share updates, limit cacheing </summary>
292              NC_SHARE =  0x0800,
293             NC_64BIT_OFFSET =  0x0200,
294              /// <summary> Enforce strict netcdf-3 rules </summary>
295              NC_CLASSIC =  0x0100,
296              /// <summary> causes netCDF to create a HDF5/NetCDF-4 file </summary>
297              NC_NETCDF4 =  0x1000
298         }
299 
300          public  enum ResultCode :  int
301         {
302              /// <summary> No Error </summary>
303              NC_NOERR =  0,
304              /// <summary> Invalid dimension id or name </summary>
305              NC_EBADDIM = - 46,
306              /// <summary> Attribute not found </summary>
307              NC_ENOTATT = - 43,
308         }
309 
310          /// <summary>
311           ///     Default fill values, used unless _FillValue attribute is set.
312           /// These values are stuffed into newly allocated space as appropriate.
313           /// The hope is that one might use these to notice that a particular datum
314           /// has not been set.
315           /// </summary>
316           public  static  class FillValues
317         {
318              public  const  byte NC_FILL_BYTE =  255;
319              public  const  char NC_FILL_CHAR = ( char) 0;
320              public  const  short NC_FILL_SHORT = - 32767;
321              public  const  int NC_FILL_INT = - 2147483647;
322              public  const  float NC_FILL_FLOAT =  9.96921E+36f;     /*  near 15 * 2^119  */
323              public  const  double NC_FILL_DOUBLE =  9.969209968386869E+36;
324         }
325 
326 
327          /// <summary> These maximums are enforced by the interface, to facilitate writing
328           /// applications and utilities.  However, nothing is statically allocated to
329           /// these sizes internally. </summary>
330           public  enum Limits
331         {
332              /// <summary> max dimensions per file  </summary>
333              NC_MAX_DIMS =  10,
334              /// <summary> max global or per variable attributes  </summary>
335              NC_MAX_ATTRS =  2000,
336              /// <summary> max variables per file </summary>
337              NC_MAX_VARS =  2000,
338              /// <summary> max length of a name  </summary>
339              NC_MAX_NAME =  128,
340              /// <summary> max per variable dimensions  </summary>
341              NC_MAX_VAR_DIMS =  10
342         }
343     }
View Code
  1 /// <summary>
  2     /// 二维网格数据文件创建、读、写
  3     /// </summary>
  4     class TwoDimDB : IDataBase
  5     {
  6         public TwoDimDB(string filename)
  7         {
  8             dbfile = filename;
  9         }
 10 
 11         public override bool Create(string[] varname, string xdimname, string ydimname, long[] xdim, long[] ydim)
 12         {
 13             try
 14             {
 15                 int ndims = 2;
 16                 int ncid, res, varid;
 17                 int x_dimid, y_dimid;
 18                 int[] dimids = new int[ndims];
 19 
 20                 //创建文件
 21                 res = NetCDF.nc_create(dbfile, NetCDF.CreateMode.NC_NETCDF4, out ncid);
 22                 if (res != 0) return false;
 23 
 24                 int NX = xdim.Length;
 25                 int NY = ydim.Length;
 26                 int[,] datas = new int[NX, NY];
 27 
 28                 //定义维度
 29                 res = NetCDF.nc_def_dim(ncid, xdimname, NX, out x_dimid);
 30                 if (res != 0) return false;
 31                 res = NetCDF.nc_def_dim(ncid, ydimname, NY, out y_dimid);
 32                 if (res != 0) return false;
 33 
 34                 res = NetCDF.nc_put_att_longlong(ncid, NetCDF.NC_GLOBAL, xdimname, NetCDF.NcType.NC_INT64, xdim.Length, xdim);
 35                 if (res != 0) return false;
 36                 res = NetCDF.nc_put_att_longlong(ncid, NetCDF.NC_GLOBAL, ydimname, NetCDF.NcType.NC_INT64, ydim.Length, ydim);
 37                 if (res != 0) return false;
 38 
 39                 dimids[0] = x_dimid;
 40                 dimids[1] = y_dimid;
 41 
 42                 //定义变量
 43                 if (varname != null)
 44                 {
 45                     foreach (var vn in varname)
 46                     {
 47                         res = NetCDF.nc_def_var(ncid, vn, NetCDF.NcType.NC_FLOAT, 2, dimids, out varid);
 48                         if (res != 0) continue;
 49 
 50                         res = NetCDF.nc_enddef(ncid);
 51                         if (res != 0) continue;
 52 
 53                         NetCDF.nc_put_var_int(ncid, varid, datas);
 54                         if (res != 0) continue;
 55                     }
 56                 }
 57 
 58                 //关闭文件
 59                 res = NetCDF.nc_close(ncid);
 60                 if (res == 0) return true;
 61             }
 62             catch (Exception ex)
 63             {
 64 
 65             }
 66             return false;
 67         }
 68 
 69         public override bool Write(string[] varName, string dimName, long dimValue, int[][] value, bool isXdim = false)
 70         {
 71             try
 72             {
 73                 int ncid, res, varid;
 74 
 75                 //创建文件
 76                 res = NetCDF.nc_open(dbfile, NetCDF.CreateMode.NC_WRITE, out ncid);
 77                 if (res != 0) return false;
 78 
 79                 #region GetDimIndex
 80 
 81                 int dimIdx = 0;
 82                 NetCDF.NcType dimXTtype;
 83                 int dimAttLen = 0;
 84 
 85                 res = NetCDF.nc_inq_att(ncid, NetCDF.NC_GLOBAL, dimName, out dimXTtype, out dimAttLen);
 86                 if (res != 0) return false;
 87                 long[] xdimValue = new long[dimAttLen];
 88                 res = NetCDF.nc_get_att_longlong(ncid, NetCDF.NC_GLOBAL, dimName, xdimValue);
 89                 dimIdx = Array.IndexOf(xdimValue, dimValue);
 90                 if (dimIdx == -1) dimIdx = 0;
 91 
 92                 #endregion
 93 
 94                 int xdimBeginIndex = isXdim ? dimIdx : 0;
 95                 int ydimBeginIndex = !isXdim ? dimIdx : 0;
 96 
 97                 int xdimNumber = !isXdim ? value.Length : 1;
 98                 int ydimNumber = isXdim ? value.Length : 1;
 99 
100                 //定义变量    
101                 if (varName != null)
102                 {
103                     for (int i = 0; i < varName.Length; i++)
104                     {
105                         res = NetCDF.nc_inq_varid(ncid, varName[i], out varid);
106                         if (res != 0) continue;
107 
108                         var origin = new int[] { xdimBeginIndex, ydimBeginIndex };//第一维的1开始,第二维从0开始
109                         var size = new int[] { xdimNumber, ydimNumber };//数量分别为1,2
110 
111                         NetCDF.nc_put_vara_int(ncid, varid, origin, size, value[i]);
112                         if (res != 0) return false;
113                     }
114                 }
115 
116                 //关闭文件
117                 res = NetCDF.nc_close(ncid);
118                 if (res == 0) return true;
119             }
120             catch (Exception ex)
121             {
122 
123             }
124             return false;
125         }
126 
127         public override int[][] Read(string[] varname, string xdimname, string ydimname, long? xdimValue = null, long? ydimValue = null)
128         {
129             long[] xDimValue;
130             long[] yDimValue;
131             Dictionary<long, int[][]> dic = new Dictionary<long, int[][]>();
132             try
133             {
134                 int ndims = 2;
135                 int ncid, res, varid;
136                 int[] dimids = new int[ndims];
137 
138                 //打开文件
139                 res = NetCDF.nc_open(dbfile, NetCDF.CreateMode.NC_NOWRITE, out ncid);
140                 if (res != 0) return null;
141 
142                 #region XDimIndex
143 
144                 int xDimIdx = 0;
145                 NetCDF.NcType xDimxtype;
146                 int xDimAttlen = 0;
147 
148                 res = NetCDF.nc_inq_att(ncid, NetCDF.NC_GLOBAL, xdimname, out xDimxtype, out xDimAttlen);
149                 if (res != 0) return null;
150                 xDimValue = new long[xDimAttlen];
151 
152                 res = NetCDF.nc_get_att_longlong(ncid, NetCDF.NC_GLOBAL, xdimname, xDimValue);
153                 if (xdimValue != null)
154                 {
155                     xDimIdx = Array.IndexOf(xDimValue, xdimValue);
156                     if (xDimIdx == -1) xDimIdx = 0;
157                 }
158                 #endregion
159 
160                 #region YDimIndex
161 
162                 int yDimIdx = 0;
163                 NetCDF.NcType yDimxtype;
164                 int yDimAttlen = 0;
165 
166                 res = NetCDF.nc_inq_att(ncid, NetCDF.NC_GLOBAL, ydimname, out yDimxtype, out yDimAttlen);
167                 if (res != 0) return null;
168                 yDimValue = new long[yDimAttlen];
169                 res = NetCDF.nc_get_att_longlong(ncid, NetCDF.NC_GLOBAL, ydimname, yDimValue);
170                 if (ydimValue != null)
171                 {
172                     yDimIdx = Array.IndexOf(yDimValue, ydimValue);
173                     if (yDimIdx == -1) yDimIdx = 0;
174                 }
175 
176                 #endregion
177 
178                 int NX = xDimValue.Length;
179                 int NY = yDimValue.Length;
180 
181                 int xdimCount = NX - xDimIdx;
182                 int ydimCount = NY - yDimIdx;
183                 int resCount = xdimCount * ydimCount;
184                 if (xdimValue == null)
185                 {
186                     resCount = xdimCount;
187                     xdimCount = NX;
188                     ydimCount = 1;
189                 }
190                 if (ydimValue == null)
191                 {
192                     resCount = ydimCount;
193                     xdimCount = 1;
194                     ydimCount = NY - yDimIdx;
195                 }
196 
197                 int[] origin = new int[] { xDimIdx, yDimIdx };//第一维的1开始,第二维从0开始
198                 int[] size = new int[] { xdimCount, ydimCount };//数量分别为1,2
199 
200                 int[][] result = new int[varname.Length + 1][];
201                
202                 for (int i = 0; i < varname.Length; i++)
203                 {
204                     res = NetCDF.nc_inq_varid(ncid, varname[i], out varid);
205                     if (res != 0) continue;
206 
207                     result[i+1] = new int[resCount];
208                     NetCDF.nc_get_vara_int(ncid, varid, origin, size, result[i + 1]);
209                     if (res != 0) continue;
210                 }
211                 
212 
213                 res = NetCDF.nc_close(ncid);
214                 if (res == 0) return result;
215             }
216             catch (Exception ex)
217             {
218 
219             }
220             finally
221             {
222                 xDimValue = null;
223                 yDimValue = null;
224                 GC.Collect();
225             }
226             return null;
227         }
228     }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值