@@ -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