我试图读取具有4个参数(时间,深度,纬度,经度)的NetCDF文件,我想以恒定的时间和深度读取文件。
现在,我正在读取整个文件,然后在 4D网格中获取值,然后解析该网格以将恒定深度和时间的值转换为 2D阵列
Parameter Name
如果行//I have read the values of time and depth in TimeArr and depthArr respectively
int depthIndex = binarySearchInArray(depthArr, d);
int timeIndex = binarySearchInArray(timeArr, d);
ArrayFloat.D4 tempArr = (ArrayFloat.D4) v.read();
float[][] grid = new float[(int) latArr.getSize()][(int) lonArr.getSize()];
for (int i = 0; i < latArr.getSize(); i++) {
for (int j = 0; j < lonArr.getSize(); j++) {
grid[i][j] = tempArr.get(timeIndex, depthIndex, i, j);
}
}
return grid;
过大,则会花费很多时间。
另外,当我只需要一个尺寸时,读取所有尺寸是没有意义的。
是否可以直接沿2个维度(具有2个维度,时间和深度,保持不变)直接读取文件?
非常感谢您。
答案 0 :(得分:1)
一种可以读取所需数据的方法是在read(int[] origin, int[] shape)
上使用Variable
方法:
// define the indexes where you would like the array
// subset to start
int[] origin = new int[] {timeIndex, depthIndex, 0, 0};
// define the overall size of the read to be done, starting
// at origin
int[] size = new int[] {1, 1, latSize, lonSize};
// read the subset
Array data4D = v.read(origin, size);
// remove any dimensions of size 1
Array data2D = data4D.reduce();
其中latSize
和lonSize
分别是这些尺寸的大小。
有关更多信息以及其他一些方法,请参见netCDF-Java tutorial(特别是从变量中读取数据部分)。
干杯!