def load_hdf5_array(datafile, meta, band_specs): '''Return an ElmStore where each subdataset is a DataArray Parameters: :datafile: filename :meta: meta from earthio.load_hdf5_meta :band_specs: list of earthio.BandSpec objects, defaulting to reading all subdatasets as bands Returns: :es: An ElmStore ''' logger.debug('load_hdf5_array: {}'.format(datafile)) f = gdal.Open(datafile, GA_ReadOnly) sds = meta['sub_datasets'] band_metas = meta['band_meta'] band_order_info = [] for band_idx, (band_meta, sd) in enumerate(zip(band_metas, sds)): if band_specs: for idx, bs in enumerate(band_specs): if match_meta(band_meta, bs): band_order_info.append((idx, band_meta, sd, bs)) break else: band_order_info.append( (band_idx, band_meta, sd, 'band_{}'.format(band_idx))) if band_specs and len(band_order_info) != len(band_specs): raise ValueError( 'Number of bands matching band_specs {} was not equal ' 'to the number of band_specs {}'.format(len(band_order_info), len(band_specs))) band_order_info.sort(key=lambda x: x[0]) elm_store_data = OrderedDict() band_order = [] for _, band_meta, sd, band_spec in band_order_info: if isinstance(band_spec, BandSpec): name = band_spec.name reader_kwargs = { k: getattr(band_spec, k) for k in READ_ARRAY_KWARGS if getattr(band_spec, k) } else: reader_kwargs = {} name = band_spec reader_kwargs = window_to_gdal_read_kwargs(**reader_kwargs) attrs = copy.deepcopy(meta) attrs.update(copy.deepcopy(band_meta)) elm_store_data[name] = load_subdataset(sd[0], attrs, band_spec, **reader_kwargs) band_order.append(name) attrs = copy.deepcopy(attrs) attrs['band_order'] = band_order gc.collect() return ElmStore(elm_store_data, attrs=attrs)
def load_hdf4_array(datafile, meta, layer_specs=None): '''Return an xr.Dataset where each subdataset is a xr.DataArray Parameters: :datafile: filename :meta: meta from earthio.load_hdf4_meta :layer_specs: list of earthio.LayerSpec objects, defaulting to reading all subdatasets as layers Returns: :Elmstore: Elmstore of teh hdf4 data ''' import gdal from gdalconst import GA_ReadOnly from earthio.metadata_selection import match_meta logger.debug('load_hdf4_array: {}'.format(datafile)) f = gdal.Open(datafile, GA_ReadOnly) sds = meta['sub_datasets'] layer_metas = meta['layer_meta'] layer_order_info = [] if layer_specs: for layer_meta, s in zip(layer_metas, sds): #layer_meta['name'] = s[0] for idx, layer_spec in enumerate(layer_specs): if match_meta(layer_meta, layer_spec): layer_order_info.append((idx, layer_meta, s, layer_spec)) break layer_order_info.sort(key=lambda x: x[0]) if len(layer_order_info) != len(layer_specs): raise ValueError('No matching layers with ' 'layer_specs {} (meta = {})'.format( layer_specs, layer_meta)) else: layer_order_info = [(idx, layer_meta, s, 'layer_{}'.format(idx)) for idx, (layer_meta, s) in enumerate(zip(layer_metas, sds))] native_dims = ('y', 'x') elm_store_data = OrderedDict() layer_order = [] for _, layer_meta, s, layer_spec in layer_order_info: attrs = copy.deepcopy(meta) attrs.update(copy.deepcopy(layer_meta)) if isinstance(layer_spec, LayerSpec): name = layer_spec.name reader_kwargs = { k: getattr(layer_spec, k) for k in READ_ARRAY_KWARGS if getattr(layer_spec, k) } geo_transform = take_geo_transform_from_meta(layer_spec, **attrs) else: reader_kwargs = {} name = layer_spec geo_transform = None reader_kwargs = window_to_gdal_read_kwargs(**reader_kwargs) handle = gdal.Open(s[0], GA_ReadOnly) layer_meta.update(reader_kwargs) np_arr = handle.ReadAsArray(**reader_kwargs) out = _np_arr_to_coords_dims(np_arr, layer_spec, reader_kwargs, geo_transform=geo_transform, layer_meta=layer_meta, handle=handle) np_arr, coords, dims, attrs2 = out attrs.update(attrs2) elm_store_data[name] = xr.DataArray(np_arr, coords=coords, dims=dims, attrs=attrs) layer_order.append(name) del handle attrs = copy.deepcopy(attrs) attrs['layer_order'] = layer_order gc.collect() return xr.Dataset(elm_store_data, attrs=attrs)
def load_hdf4_array(datafile, meta, band_specs=None): '''Return an ElmStore where each subdataset is a DataArray Parameters: :datafile: filename :meta: meta from earthio.load_hdf4_meta :band_specs: list of earthio.BandSpec objects, defaulting to reading all subdatasets as bands Returns: :Elmstore: Elmstore of teh hdf4 data ''' from earthio import ElmStore from earthio.metadata_selection import match_meta logger.debug('load_hdf4_array: {}'.format(datafile)) f = gdal.Open(datafile, GA_ReadOnly) sds = meta['sub_datasets'] band_metas = meta['band_meta'] band_order_info = [] if band_specs: for band_meta, s in zip(band_metas, sds): for idx, band_spec in enumerate(band_specs): if match_meta(band_meta, band_spec): band_order_info.append((idx, band_meta, s, band_spec)) break band_order_info.sort(key=lambda x: x[0]) if not len(band_order_info): raise ValueError('No matching bands with ' 'band_specs {}'.format(band_specs)) else: band_order_info = [(idx, band_meta, s, 'band_{}'.format(idx)) for idx, (band_meta, s) in enumerate(zip(band_metas, sds))] native_dims = ('y', 'x') elm_store_data = OrderedDict() band_order = [] for _, band_meta, s, band_spec in band_order_info: attrs = copy.deepcopy(meta) attrs.update(copy.deepcopy(band_meta)) if isinstance(band_spec, BandSpec): name = band_spec.name reader_kwargs = { k: getattr(band_spec, k) for k in READ_ARRAY_KWARGS if getattr(band_spec, k) } geo_transform = take_geo_transform_from_meta(band_spec, **attrs) else: reader_kwargs = {} name = band_spec geo_transform = None reader_kwargs = window_to_gdal_read_kwargs(**reader_kwargs) dat0 = gdal.Open(s[0], GA_ReadOnly) band_meta.update(reader_kwargs) raster = raster_as_2d(dat0.ReadAsArray(**reader_kwargs)) if geo_transform is None: geo_transform = dat0.GetGeoTransform() attrs['geo_transform'] = geo_transform if hasattr(band_spec, 'store_coords_order'): if band_spec.stored_coords_order[0] == 'y': rows, cols = raster.shape else: rows, cols = raster.T.shape else: rows, cols = raster.shape coord_x, coord_y = geotransform_to_coords(cols, rows, geo_transform) canvas = Canvas(geo_transform=geo_transform, buf_xsize=cols, buf_ysize=rows, dims=native_dims, ravel_order='C', bounds=geotransform_to_bounds(cols, rows, geo_transform)) attrs['canvas'] = canvas elm_store_data[name] = xr.DataArray(raster, coords=[('y', coord_y), ('x', coord_x)], dims=native_dims, attrs=attrs) band_order.append(name) del dat0 attrs = copy.deepcopy(attrs) attrs['band_order'] = band_order gc.collect() return ElmStore(elm_store_data, attrs=attrs)
def load_hdf5_array(datafile, meta, layer_specs): '''Return an xr.Dataset where each subdataset is a xr.DataArray Parameters: :datafile: filename :meta: meta from earthio.load_hdf5_meta :layer_specs: list of earthio.LayerSpec objects, defaulting to reading all subdatasets as layers Returns: :dset: An xr.Dataset ''' import gdal from gdalconst import GA_ReadOnly logger.debug('load_hdf5_array: {}'.format(datafile)) f = gdal.Open(datafile, GA_ReadOnly) sds = meta['sub_datasets'] layer_metas = meta['layer_meta'] layer_order_info = [] for layer_idx, (layer_meta, sd) in enumerate(zip(layer_metas, sds)): if layer_specs: for idx, bs in enumerate(layer_specs): if match_meta(layer_meta, bs): layer_order_info.append((idx, layer_meta, sd, bs)) break else: layer_order_info.append( (layer_idx, layer_meta, sd, 'layer_{}'.format(layer_idx))) if layer_specs and len(layer_order_info) != len(layer_specs): raise ValueError( 'Number of layers matching layer_specs {} was not equal ' 'to the number of layer_specs {}'.format(len(layer_order_info), len(layer_specs))) layer_order_info.sort(key=lambda x: x[0]) elm_store_data = OrderedDict() layer_order = [] for _, layer_meta, sd, layer_spec in layer_order_info: if isinstance(layer_spec, LayerSpec): name = layer_spec.name reader_kwargs = { k: getattr(layer_spec, k) for k in READ_ARRAY_KWARGS if getattr(layer_spec, k) } else: reader_kwargs = {} name = layer_spec reader_kwargs = window_to_gdal_read_kwargs(**reader_kwargs) attrs = copy.deepcopy(meta) attrs.update(copy.deepcopy(layer_meta)) elm_store_data[name] = load_subdataset(sd[0], attrs, layer_spec, **reader_kwargs) layer_order.append(name) attrs = copy.deepcopy(attrs) attrs['layer_order'] = layer_order gc.collect() return xr.Dataset(elm_store_data, attrs=attrs)