博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#中使用NetCDF存储二维数据的读写操作简单应用
阅读量:6720 次
发布时间:2019-06-25

本文共 23324 字,大约阅读时间需要 77 分钟。

 
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 ///   2     /// 二维网格数据文件创建、读、写  3     ///   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,2110 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
dic = new Dictionary
();132 try133 {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 XDimIndex143 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 #endregion159 160 #region YDimIndex161 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 #endregion177 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,2199 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 finally221 {222 xDimValue = null;223 yDimValue = null;224 GC.Collect();225 }226 return null;227 }228 }

 

转载地址:http://trcmo.baihongyu.com/

你可能感兴趣的文章
list操作 foreach和for的区别
查看>>
Mem, MyString
查看>>
分页存储过程
查看>>
头条的用户内容推荐
查看>>
mongo 手册阅读笔记
查看>>
Domino管理员29个问题
查看>>
9号团队-团队任务4:每日立会(2018-11-29)
查看>>
超高性能的json序列化之MVC中使用Json.Net
查看>>
几款前端性能检测工具
查看>>
(实用)CentOS 6.3更新内置Python2.6
查看>>
对啊英语音标---三、长元音的发音字母组合怎样记
查看>>
新东方雅思词汇---7.4、cap
查看>>
英语每日写作---1、但是,人们在吹口哨时做得更好
查看>>
js进阶 11-16 jquery如何查找元素的父亲、祖先和子代、后代
查看>>
jquery-11 留言板如何实现
查看>>
Java爬虫
查看>>
20145328《信息安全系统设计基础》实验一 开发环境的熟悉
查看>>
学渣的逆袭(各种暴力~)
查看>>
Java多线程技术学习笔记(一)
查看>>
12 款优秀的 JavaScript MVC 框架评估(转)
查看>>