Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)