Skip to content

Commit 536d1e8

Browse files
Update launch configuration for GeoZarr conversion and enhance grid_mapping handling in overview dataset
1 parent 45f6119 commit 536d1e8

File tree

2 files changed

+53
-13
lines changed

2 files changed

+53
-13
lines changed

.vscode/launch.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,15 @@
6060
},
6161
{
6262
// eopf_geozarr convert https://objectstore.eodc.eu:2222/e05ab01a9d56408d82ac32d69a5aae2a:sample-data/tutorial_data/cpm_v253/S2B_MSIL1C_20250113T103309_N0511_R108_T32TLQ_20250113T122458.zarr /tmp/tmp7mmjkjk3/s2b_subset_test.zarr --groups /measurements/reflectance/r10m --spatial-chunk 512 --min-dimension 128 --tile-width 256 --max-retries 2 --verbose
63-
"name": "Convert to GeoZarr S2L1C (S3)",
63+
"name": "Convert to GeoZarr S2L2A (S3)",
6464
"type": "debugpy",
6565
"request": "launch",
6666
"module": "eopf_geozarr",
6767
"args": [
6868
"convert",
69-
"https://objects.eodc.eu/e05ab01a9d56408d82ac32d69a5aae2a:202507-s02msil1c/25/products/cpm_v256/S2A_MSIL1C_20250725T091041_N0511_R050_T34SGE_20250725T101000.zarr",
70-
"s3://esa-zarr-sentinel-explorer-fra/tests-output/eopf_geozarr/S2A_MSIL1C_20250725T091041_N0511_R050_T34SGE_20250725T101000.zarr",
71-
"--groups", "/measurements/reflectance/r10m", "/measurements/reflectance/r20m", "/measurements/reflectance/r60m", "/quality/l1c_quicklook/r10m",
69+
"https://objects.eodc.eu/e05ab01a9d56408d82ac32d69a5aae2a:202507-s02msil2a/04/products/cpm_v256/S2A_MSIL2A_20250704T094051_N0511_R036_T33SWB_20250704T115824.zarr",
70+
"s3://esa-zarr-sentinel-explorer-fra/tests-output/eopf_geozarr/S2A_MSIL2A_20250704T094051_N0511_R036_T33SWB_20250704T115824.zarr",
71+
"--groups", "/measurements/reflectance/r10m", "/measurements/reflectance/r20m", "/measurements/reflectance/r60m", "/quality/l2a_quicklook/r10m",
7272
"--spatial-chunk", "1024",
7373
"--min-dimension", "256",
7474
"--tile-width", "256",

eopf_geozarr/conversion/geozarr.py

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -999,7 +999,17 @@ def create_overview_dataset_all_vars(
999999
}
10001000

10011001
# Find the grid_mapping variable name from the source dataset
1002+
# Check both dataset attributes and individual variable attributes
10021003
grid_mapping_var_name = ds.attrs.get("grid_mapping", None)
1004+
if not grid_mapping_var_name and data_vars:
1005+
# Try to find grid_mapping from the first data variable
1006+
first_var = data_vars[0]
1007+
if first_var in ds and "grid_mapping" in ds[first_var].attrs:
1008+
grid_mapping_var_name = ds[first_var].attrs["grid_mapping"]
1009+
1010+
# If still not found, use default name
1011+
if not grid_mapping_var_name:
1012+
grid_mapping_var_name = "spatial_ref"
10031013

10041014
# Downsample all data variables
10051015
for var in data_vars:
@@ -1026,34 +1036,64 @@ def create_overview_dataset_all_vars(
10261036
attrs = {
10271037
"standard_name": ds[var].attrs.get("standard_name", "toa_bidirectional_reflectance"),
10281038
"_ARRAY_DIMENSIONS": dims,
1039+
"grid_mapping": grid_mapping_var_name, # Ensure all data variables have grid_mapping
10291040
}
10301041

1031-
if grid_mapping_var_name:
1032-
attrs["grid_mapping"] = grid_mapping_var_name
1033-
10341042
overview_data_vars[var] = (dims, downsampled_data, attrs)
10351043

10361044
# Create overview dataset
10371045
overview_ds = xr.Dataset(overview_data_vars, coords=overview_coords)
10381046

1039-
# Add the grid_mapping variable if it exists in the source
1040-
if grid_mapping_var_name and grid_mapping_var_name in ds:
1041-
# Copy the grid_mapping variable but update GeoTransform for this level
1047+
# Ensure the grid_mapping variable is properly added to the overview dataset
1048+
# First, try to find it in the source dataset
1049+
if grid_mapping_var_name in ds:
1050+
# Copy the existing grid_mapping variable and update its attributes
10421051
grid_mapping_attrs = ds[grid_mapping_var_name].attrs.copy()
1043-
1052+
10441053
# Update GeoTransform for this overview level
10451054
transform_gdal = overview_transform.to_gdal()
10461055
transform_str = " ".join([str(i) for i in transform_gdal])
10471056
grid_mapping_attrs["GeoTransform"] = transform_str
1057+
grid_mapping_attrs["_ARRAY_DIMENSIONS"] = [] # Required for auxiliary variables
1058+
1059+
# Create the grid_mapping variable
1060+
overview_ds[grid_mapping_var_name] = xr.DataArray(
1061+
data=ds[grid_mapping_var_name].values, # Copy the original data
1062+
attrs=grid_mapping_attrs,
1063+
)
1064+
else:
1065+
# Create a new grid_mapping variable if it doesn't exist in source
1066+
print(f" Creating new grid_mapping variable '{grid_mapping_var_name}' for overview level {level}")
1067+
1068+
# Update GeoTransform for this overview level
1069+
transform_gdal = overview_transform.to_gdal()
1070+
transform_str = " ".join([str(i) for i in transform_gdal])
1071+
1072+
# Create grid_mapping attributes based on the CRS
1073+
grid_mapping_attrs = {
1074+
"_ARRAY_DIMENSIONS": [], # Required for auxiliary variables
1075+
"GeoTransform": transform_str,
1076+
}
1077+
1078+
# Add CRS-specific attributes
1079+
if native_crs:
1080+
if native_crs.to_epsg():
1081+
grid_mapping_attrs["spatial_ref"] = native_crs.to_wkt()
1082+
grid_mapping_attrs["crs_wkt"] = native_crs.to_wkt()
1083+
else:
1084+
grid_mapping_attrs["spatial_ref"] = native_crs.to_wkt()
1085+
grid_mapping_attrs["crs_wkt"] = native_crs.to_wkt()
10481086

10491087
# Create the grid_mapping variable
10501088
overview_ds[grid_mapping_var_name] = xr.DataArray(
10511089
data=np.array(b"", dtype="S1"), # Empty scalar
10521090
attrs=grid_mapping_attrs,
10531091
)
1054-
overview_ds.attrs["grid_mapping"] = grid_mapping_var_name
10551092

1056-
# Set CRS using rioxarray (this doesn't affect GeoZarr compliance)
1093+
# Set dataset-level grid_mapping attribute
1094+
overview_ds.attrs["grid_mapping"] = grid_mapping_var_name
1095+
1096+
# Set CRS using rioxarray to ensure proper CRS handling
10571097
overview_ds = overview_ds.rio.write_crs(native_crs)
10581098

10591099
return overview_ds

0 commit comments

Comments
 (0)