This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
Tom Rink wrote:
Hi John, John Caron wrote:Tom Rink wrote:Hi, How can skip or stride reading be done in the Java implementation of NetCDF? Is there an equivalent operation? Tom RinkHi Tom:I seem to have overlooked implementing a stride-based read, probably because the original (version 1) library doesnt have one. I will add this to the to-do list.Meanwhile, you can get a strided subset of an Array, which will be equivilent except that you probably have to read more than you need:Suppose you have a 3D Array, and you want to access it with stride 2, 1, and 3 in the three dimensions. The following will give you a logical view of the data with those strides, using the same backing data as the original:Array data = var.read(); int[] shape = data.getShape(); Array dataS;Range[] ranges = new Range[] { new Range(0,shape[0]-1, 2), null, new Range(0,shape[2]-1, 3) };try { dataS = data.section( ranges); } catch (InvalidRangeException e) { System.out.println("testStride failed == "+ e); }Thanks for the work-around, but the read() in this case would be much too much: I have MODIS on a remote server that I'm accessing via DODS and I want to produce a low-res image of the entire swath so the user can decide what channels or regions are important,then subsetting/slicing can be used to focus on the point of interest. For now, I'll have to sub-sample on the client, Is there any way to know when the stride capability will be implemened? Thanks again for you help, Tom
ah! a DODS file. thats much easier. I just put out an experimental version that has this method in DODSVariable: /*** Read data from the DODS dataset with strides, and return a memory resident Array. * This Array has the same element type as the IOArray, and the requested shape.
* <p>* <code>assert(origin[ii] + shape[ii]*stride[i] <= Variable.shape[ii]); </code>
* <p> * @param origin int array specifying the starting index.* @param shape int array specifying the extents in each dimension. This becomes the shape of the returned Array.
* @param stride int array specifying the stride in each dimension. * @return the requested data in a memory-resident Array */public Array read(int [] origin, int [] shape, int stride[]) throws IOException, InvalidRangeException;
its in ftp://ftp.unidata.ucar.edu/pub/netcdf-java/v2.1/netcdfAll-05.jarive tested it a bit, i would appreciate it if youd try it and check the results and let me know if you see any problems.