@@ -999,7 +999,17 @@ def create_overview_dataset_all_vars(
999
999
}
1000
1000
1001
1001
# Find the grid_mapping variable name from the source dataset
1002
+ # Check both dataset attributes and individual variable attributes
1002
1003
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"
1003
1013
1004
1014
# Downsample all data variables
1005
1015
for var in data_vars :
@@ -1026,34 +1036,64 @@ def create_overview_dataset_all_vars(
1026
1036
attrs = {
1027
1037
"standard_name" : ds [var ].attrs .get ("standard_name" , "toa_bidirectional_reflectance" ),
1028
1038
"_ARRAY_DIMENSIONS" : dims ,
1039
+ "grid_mapping" : grid_mapping_var_name , # Ensure all data variables have grid_mapping
1029
1040
}
1030
1041
1031
- if grid_mapping_var_name :
1032
- attrs ["grid_mapping" ] = grid_mapping_var_name
1033
-
1034
1042
overview_data_vars [var ] = (dims , downsampled_data , attrs )
1035
1043
1036
1044
# Create overview dataset
1037
1045
overview_ds = xr .Dataset (overview_data_vars , coords = overview_coords )
1038
1046
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
1042
1051
grid_mapping_attrs = ds [grid_mapping_var_name ].attrs .copy ()
1043
-
1052
+
1044
1053
# Update GeoTransform for this overview level
1045
1054
transform_gdal = overview_transform .to_gdal ()
1046
1055
transform_str = " " .join ([str (i ) for i in transform_gdal ])
1047
1056
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 ()
1048
1086
1049
1087
# Create the grid_mapping variable
1050
1088
overview_ds [grid_mapping_var_name ] = xr .DataArray (
1051
1089
data = np .array (b"" , dtype = "S1" ), # Empty scalar
1052
1090
attrs = grid_mapping_attrs ,
1053
1091
)
1054
- overview_ds .attrs ["grid_mapping" ] = grid_mapping_var_name
1055
1092
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
1057
1097
overview_ds = overview_ds .rio .write_crs (native_crs )
1058
1098
1059
1099
return overview_ds
0 commit comments