Skip to content

Commit 0064e10

Browse files
committed
Use shared dimensions for xarray-zarr datasets
Fixes #1445
1 parent aca2c81 commit 0064e10

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

cdm/zarr/src/main/java/ucar/nc2/iosp/zarr/ZarrHeader.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,8 @@ private void makeVariable(RandomAccessDirectoryItem item, long dataOffset, ZArra
268268
final Dimension.Builder dim = Dimension.builder(dname, shape[i]);
269269
dim.setIsVariableLength(false);
270270
dim.setIsUnlimited(false);
271-
dim.setIsShared(false);
271+
// if using named dimensions from _ARRAY_DIMENSIONS, mark the dimension as shared
272+
dim.setIsShared(hasNamedDimensions);
272273

273274
final Dimension dd = dim.build();
274275

@@ -283,6 +284,9 @@ private void makeVariable(RandomAccessDirectoryItem item, long dataOffset, ZArra
283284
if (dd.getLength() != prevd.getLength()) {
284285
throw new ZarrFormatException("Named dimension " + dname + " seen with inconsistent lengths.");
285286
}
287+
// replace newly created dimension with the previously added dimension
288+
dims.remove(dd);
289+
dims.add(prevd);
286290
} else {
287291
logger.trace("adding {} to group as a shared dimension", dname);
288292
parentGroup.addDimension(dd);

cdm/zarr/src/test/java/ucar/nc2/iosp/zarr/TestZarrIosp.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,4 +352,42 @@ public void testScalarGeozarrArray() throws IOException {
352352
assertThat(sArray).isInstanceOf(ArrayLong.D0.class);
353353
assertThat(sArray.getLong(0)).isEqualTo(0L);
354354
}
355+
356+
@Test
357+
public void testGeozarrSharedDimension() throws IOException {
358+
NetcdfFile ncfile = NetcdfFiles.open(SCALAR_GEOZARR_DATA);
359+
360+
Dimension xdim = ncfile.findDimension("x");
361+
assertThat(xdim).isNotNull();
362+
assertThat(xdim.isShared()).isTrue();
363+
364+
Dimension ydim = ncfile.findDimension("y");
365+
assertThat(ydim).isNotNull();
366+
assertThat(ydim.isShared()).isTrue();
367+
368+
Dimension tdim = ncfile.findDimension("time");
369+
assertThat(tdim).isNotNull();
370+
assertThat(tdim.isShared()).isTrue();
371+
372+
Variable temperature = ncfile.findVariable("temperature");
373+
assertThat(temperature != null).isTrue();
374+
ImmutableList<Dimension> dims = temperature.getDimensions();
375+
assertThat(dims.size()).isEqualTo(3);
376+
377+
for (Dimension dim : dims) {
378+
switch (dim.getName()) {
379+
case "x":
380+
assertThat(dim).isEqualTo(xdim);
381+
break;
382+
case "y":
383+
assertThat(dim).isEqualTo(ydim);
384+
break;
385+
case "time":
386+
assertThat(dim).isEqualTo(tdim);
387+
break;
388+
default:
389+
throw new IllegalArgumentException("Untested dimension " + dim);
390+
}
391+
}
392+
}
355393
}

0 commit comments

Comments
 (0)