Commit 8e4a0856 authored by jlaura's avatar jlaura Committed by GitHub
Browse files

Updates Indexing Issues (#34)

* Makes gdal an optional dependency

* Refactors all bae I/O into a single namespace.

* typos

* Fixes the gdal dependency test

* Adds tests for the JSON

* Tests fail without test data

* Updates for comments from @thareUSGS

* Adds ISIS3 V2 ControlNetwork Reader

* Adds hcube mixin object

* Updates to support tif M3, and fixes indexing issues
parent 7353260b
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
import numpy as np
import gdal

from ..utils.indexing import _LocIndexer, _iLocIndexer


class HCube(object):
    """
    A Mixin class for use with the io_gdal.GeoDataset class
@@ -27,7 +30,6 @@ class HCube(object):
    
    @tolerance.setter
    def tolerance(self, val):
        wv = self.wavelengths
        if isinstance(val, int):
            self._tolerance = val
            self._reindex()
@@ -39,7 +41,8 @@ class HCube(object):
            self._wavelengths = np.round(self._original_wavelengths, decimals=self.tolerance)

    def __getitem__(self, key):
        return _iLocIndexer(self)
        i = _iLocIndexer(self)
        return i[key]
    
    @property
    def loc(self):
@@ -54,7 +57,6 @@ class HCube(object):

        y = key[1]
        x = key[2]
        
        if isinstance(x, slice):
            xstart = ifnone(x.start,0)
            xstop = ifnone(x.stop,self.raster_size[0])
@@ -68,7 +70,10 @@ class HCube(object):
        else:
            raise TypeError("Loc style access elements must be slices, e.g., [:] or [10:100]")
            
        pixels = (xstart, ystart, xstop, ystop)
        pixels = (xstart, ystart, xstep, ystep)
        if isinstance(key[0], (int, np.integer)):
            return self.read_array(band=int(key[0]+1), pixels=pixels)
        else:
            arrs = []
            for b in key[0]:
                arrs.append(self.read_array(band=int(b+1), pixels=pixels))
+9 −2
Original line number Diff line number Diff line
@@ -14,6 +14,13 @@ class M3(GeoDataset, HCube):
        if not hasattr(self, '_wavelengths'):
            try:
                info = gdal.Info(self.file_name, format='json')
                if 'Resize' in info['metadata']['']['Band_1']:
                    wavelengths = [float(j.split(' ')[-1].replace('(','').replace(')', '')) for\
                                  i,j in sorted(info['metadata'][''].items(),
                                  key=lambda x: float(x[0].split('_')[-1]))]
                    # This is a geotiff translated from the PDS IMG
                else:
                    # This is a PDS IMG
                    wavelengths = [float(j) for i, j in sorted(info['metadata'][''].items(),
                                    key=lambda x: float(x[0].split('_')[-1]))]
                self._original_wavelengths = wavelengths
+7 −4
Original line number Diff line number Diff line
@@ -44,6 +44,9 @@ class _LocIndexer(object):
        if isinstance(sl, slice):
            sl = list(range(ifnone(sl.start, 0), self.data_array.nbands, ifnone(sl.step, 1)))

        if isinstance(sl, (int, float)):
            idx = self._get_idx(sl)
        else:    
            idx = [self._get_idx(s) for s in sl]
        key = (idx, key[1], key[2])
        return self.data_array._read(key)   
@@ -52,7 +55,7 @@ class _LocIndexer(object):
        vals = np.abs(self.data_array.wavelengths-value)
        minidx = np.argmin(vals)
        if vals[minidx] >= tolerance:
            warning.warn("Absolute difference between requested value and found values is {}".format(vals[minidx]))
            warnings.warn("Absolute difference between requested value and found values is {}".format(vals[minidx]))
        return minidx
    
class _iLocIndexer(object):