View Code1 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 }
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 }