-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathNetCDFBuilderTest.java
More file actions
120 lines (109 loc) · 5.69 KB
/
NetCDFBuilderTest.java
File metadata and controls
120 lines (109 loc) · 5.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package tw.fondus.commons.nc;
import org.joda.time.DateTime;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import tw.fondus.commons.nc.util.NetCDFUtils;
import tw.fondus.commons.nc.util.key.DimensionName;
import tw.fondus.commons.nc.util.key.GlobalAttribute;
import tw.fondus.commons.nc.util.key.VariableAttribute;
import tw.fondus.commons.nc.util.key.VariableName;
import ucar.ma2.Array;
import ucar.ma2.ArrayDouble;
import ucar.ma2.ArrayFloat;
import ucar.ma2.DataType;
import ucar.ma2.InvalidRangeException;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* The unit test of use builder to construct NetCDF.
*
* @author Brad Chen
*
*/
public class NetCDFBuilderTest {
private static Map<String, Array> valueMap;
@BeforeAll
public static void prepareData() throws IOException {
Files.deleteIfExists( Paths.get( "src/test/resources/test.nc" ) );
int tSize = 10;
int ySize = 10;
int xSize = 10;
ArrayDouble.D1 y = NetCDFUtils.create1DArrayDouble( IntStream.range( 0, ySize ).mapToObj( BigDecimal::new ).collect( Collectors.toList() ) );
ArrayDouble.D1 x = NetCDFUtils.create1DArrayDouble( IntStream.range( 0, xSize ).mapToObj( BigDecimal::new ).collect( Collectors.toList() ) );
ArrayDouble.D1 times = NetCDFUtils.empty1DArrayDouble( tSize );
// Time
DateTime createTime = new DateTime();
IntStream.range( 0, tSize ).forEach( i -> {
long time = createTime.plusHours( i ).getMillis() / (60 * 1000); // milliseconds to minute
times.set( i, time );
} );
// Rainfall
List<List<BigDecimal>> values = new ArrayList<>();
IntStream.range( 0, tSize ).forEach( t -> {
values.add( new ArrayList<>() );
IntStream.range( 0, ySize ).forEach( j ->
IntStream.range( 0, xSize ).forEach( i ->
values.get( t ).add( BigDecimal.valueOf( Math.random() ) )
)
);
} );
ArrayFloat.D3 rainfall = NetCDFUtils.create3DArrayFloat( values, ySize, xSize );
valueMap = new HashMap<>();
valueMap.put( DimensionName.X, x );
valueMap.put( DimensionName.Y, y );
valueMap.put( DimensionName.TIME, times );
valueMap.put( "rainfall", rainfall );
}
@Test
public void test() throws IOException, InvalidRangeException {
DateTime createTime = new DateTime();
NetCDFBuilder.create( Paths.get( "src/test/resources/test.nc" ) )
.addGlobalAttribute( GlobalAttribute.CONVENTIONS, "CF-1.6" )
.addGlobalAttribute( GlobalAttribute.TITLE, "Test Data" )
.addGlobalAttribute( GlobalAttribute.INSTITUTION, "FondUS" )
.addGlobalAttribute( GlobalAttribute.SOURCE, "Export NETCDF-CF_GRID from FEWS-Taiwan" )
.addGlobalAttribute( GlobalAttribute.HISTORY, createTime.toString() + " GMT: exported from FEWS-Taiwan" )
.addGlobalAttribute( GlobalAttribute.REFERENCES, "http://www.delft-fews.com" )
.addGlobalAttribute( GlobalAttribute.METADATA_CONVENTIONS, "Unidata Dataset Discovery v1.0" )
.addGlobalAttribute( GlobalAttribute.SUMMARY, "Data exported from FEWS-Taiwan" )
.addGlobalAttribute( GlobalAttribute.DATE_CREATE, createTime.toString() + " GMT" )
.addDimension( DimensionName.TIME, 10 )
.addDimension( DimensionName.Y, 10 )
.addDimension( DimensionName.X, 10 )
.addVariable( VariableName.TIME, DataType.DOUBLE, DimensionName.TIME )
.addVariableAttribute( VariableName.TIME, VariableAttribute.KEY_NAME, "time" )
.addVariableAttribute( VariableName.TIME, VariableAttribute.KEY_NAME_LONG, "time" )
.addVariableAttribute( VariableName.TIME, VariableAttribute.KEY_UNITS, VariableAttribute.UNITS_TIME_MINUTES )
.addVariableAttribute( VariableName.TIME, VariableAttribute.KEY_AXIS, VariableAttribute.AXIS_TIME )
.addVariable( VariableName.Y, DataType.DOUBLE, DimensionName.Y )
.addVariableAttribute( VariableName.Y, VariableAttribute.KEY_NAME, VariableAttribute.COORDINATES_Y_WGS84 )
.addVariableAttribute( VariableName.Y, VariableAttribute.KEY_NAME_LONG, VariableAttribute.NAME_Y_WGS84 )
.addVariableAttribute( VariableName.Y, VariableAttribute.KEY_UNITS, VariableAttribute.UNITS_Y_WGS84 )
.addVariableAttribute( VariableName.Y, VariableAttribute.KEY_AXIS, VariableAttribute.AXIS_Y )
.addVariableAttribute( VariableName.Y, VariableAttribute.KEY_MISSING, VariableAttribute.MISSING_COORDINATES )
.addVariable( VariableName.X, DataType.DOUBLE, DimensionName.X )
.addVariableAttribute( VariableName.X, VariableAttribute.KEY_NAME, VariableAttribute.COORDINATES_X_WGS84 )
.addVariableAttribute( VariableName.X, VariableAttribute.KEY_NAME_LONG, VariableAttribute.NAME_X_WGS84 )
.addVariableAttribute( VariableName.X, VariableAttribute.KEY_UNITS, VariableAttribute.UNITS_X_WGS84 )
.addVariableAttribute( VariableName.X, VariableAttribute.KEY_AXIS, VariableAttribute.AXIS_X )
.addVariableAttribute( VariableName.X, VariableAttribute.KEY_MISSING, VariableAttribute.MISSING_COORDINATES )
.addVariable( "rainfall", DataType.FLOAT, DimensionName.TIME, DimensionName.Y, DimensionName.X )
.addVariableAttribute( "rainfall", VariableAttribute.KEY_NAME_LONG, "Rainfall" )
.addVariableAttribute( "rainfall", VariableAttribute.KEY_UNITS, "mm" )
.addVariableAttribute( "rainfall", VariableAttribute.KEY_MISSING, VariableAttribute.MISSING.doubleValue() )
.build() // Finished NetCDF file structures define mode
.writeValues( VariableName.TIME, valueMap.get( DimensionName.TIME ) )
.writeValues( VariableName.Y, valueMap.get( DimensionName.Y ) )
.writeValues( VariableName.X, valueMap.get( DimensionName.X ) )
.writeValues( "rainfall", valueMap.get( "rainfall" ) )
.close(); // close IO
}
}