@@ -119,8 +119,37 @@ def execute(self, **kwargs):
119119 "missing_value" ,
120120 ):
121121 setattr (out_dimension_variable , attribute , getattr (in_dimension_variable , attribute ))
122+
123+ for ncattr in in_dimension_variable .ncattrs ():
124+ out_dimension_variable .setncattr (ncattr , in_dimension_variable .getncattr (ncattr ))
125+
122126 out_dimension_variable [:] = in_dimension_variable [:]
123127
128+ # Discover CRS metadata (ESRI and CF)
129+ esri_pe = None
130+ grid_mapping = None
131+ for variable in dim_dataset .variables .values ():
132+ if "esri_pe_string" in variable .ncattrs ():
133+ esri_pe = variable .getncattr ("esri_pe_string" )
134+ if "grid_mapping" in variable .ncattrs ():
135+ grid_mapping_name = variable .getncattr ("grid_mapping" )
136+ if grid_mapping_name in dim_dataset .variables :
137+ grid_mapping = grid_mapping_name
138+ grid_mapping_in = dim_dataset .variables [grid_mapping ]
139+
140+ for dimension in grid_mapping_in .dimensions :
141+ if dimension not in dataset .dimensions :
142+ dataset .createDimension (dimension , dim_dataset .dimensions [dimension ].size )
143+
144+ grid_mapping_out = dataset .createVariable (
145+ grid_mapping , grid_mapping_in .dtype , grid_mapping_in .dimensions
146+ )
147+
148+ for ncattr in grid_mapping_in .ncattrs ():
149+ grid_mapping_out .setncattr (ncattr , grid_mapping_in .getncattr (ncattr ))
150+
151+ break
152+
124153 mask = numpy .copy (arrays [0 ].mask )
125154 for arr in arrays [1 :]:
126155 mask |= arr .mask
@@ -136,4 +165,10 @@ def execute(self, **kwargs):
136165 )
137166 variable [:] = numpy .ma .MaskedArray (command .result .data , mask )
138167
168+ # Apply CRS metadata
169+ if esri_pe :
170+ variable .setncattr ("esri_pe_string" , esri_pe )
171+ if grid_mapping :
172+ variable .setncattr ("grid_mapping" , grid_mapping )
173+
139174 return True
0 commit comments