c#中使用NetCDF存储二维数据的读写操作简单应用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.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 }
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 }
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 }
dll file:https://github.com/isanyeba/NetCDF/blob/master/netcdf4_dll.rar