From a0b2b7bc44bf2bab715ae8ac2bfd2f90251b536b Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Wed, 8 Aug 2018 00:19:38 +0200 Subject: [PATCH] Band names and description are now correctly saved in ENVI format. --- geoarray/baseclasses.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/geoarray/baseclasses.py b/geoarray/baseclasses.py index 5000849..c99d019 100644 --- a/geoarray/baseclasses.py +++ b/geoarray/baseclasses.py @@ -884,6 +884,8 @@ class GeoArray(object): if not os.path.isdir(os.path.dirname(out_path)): os.makedirs(os.path.dirname(out_path)) + envi_metadict = self.metadata.to_ENVI_metadict() + if self.is_inmem: ds_inmem = get_GDAL_ds_inmem(self.arr, self.geotransform, self.projection, self.nodata) # expects rows,columns,bands @@ -895,12 +897,16 @@ class GeoArray(object): # set metadata # NOTE: The dataset has to be written BEFORE metadata are added. Otherwise, metadata are not written. if fmt == 'ENVI': - envi_metadict = self.metadata.to_ENVI_metadict() ds_out.SetMetadata(envi_metadict, 'ENVI') if 'band_names' in envi_metadict: - ds_out.SetMetadata({'Band_%s' % str(bidx + 1): self.metadata.band_meta['band_names'][bidx] - for bidx in range(self.bands)}) + for bidx in range(self.bands): + band = ds_out.GetRasterBand(bidx + 1) + band.SetDescription(self.metadata.band_meta['band_names'][bidx]) + del band + + if 'description' in envi_metadict: + ds_out.SetDescription(envi_metadict['description']) ds_out.FlushCache() gdal.Unlink(out_path + '.aux.xml') @@ -910,12 +916,18 @@ class GeoArray(object): if self.metadata.global_meta: ds_out.SetMetadata(self.metadata.global_meta) + if 'description' in envi_metadict: + ds_out.SetDescription(envi_metadict['description']) + # set band domain metadata for bidx in range(self.bands): band = ds_out.GetRasterBand(bidx + 1) meta2write = dict((k, repr(v)) for k, v in self.metadata.band_meta.items() if v is not np.nan) - band.SetMetadata(meta2write) + + if 'band_names' in envi_metadict: + band.SetDescription(self.metadata.band_meta['band_names'][bidx]) + band.FlushCache() del band @@ -935,6 +947,15 @@ class GeoArray(object): gdal_Translate(out_path, src_ds, format=fmt, creationOptions=creationOptions) del src_ds + # add band names + if 'band_names' in envi_metadict: + ds_out = gdal.Open(out_path) + + for bidx in range(self.bands): + band = ds_out.GetRasterBand(bidx + 1) + band.SetDescription(self.metadata.band_meta['band_names'][bidx]) + del band + if not os.path.exists(out_path): raise Exception(gdal.GetLastErrorMsg()) -- GitLab