Skip to content
Snippets Groups Projects
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
No related branches found
No related tags found
No related merge requests found
import numpy as np import numpy as np
import gdal import gdal
from ..utils.indexing import _LocIndexer, _iLocIndexer
class HCube(object): class HCube(object):
""" """
A Mixin class for use with the io_gdal.GeoDataset class A Mixin class for use with the io_gdal.GeoDataset class
...@@ -27,7 +30,6 @@ class HCube(object): ...@@ -27,7 +30,6 @@ class HCube(object):
@tolerance.setter @tolerance.setter
def tolerance(self, val): def tolerance(self, val):
wv = self.wavelengths
if isinstance(val, int): if isinstance(val, int):
self._tolerance = val self._tolerance = val
self._reindex() self._reindex()
...@@ -39,7 +41,8 @@ class HCube(object): ...@@ -39,7 +41,8 @@ class HCube(object):
self._wavelengths = np.round(self._original_wavelengths, decimals=self.tolerance) self._wavelengths = np.round(self._original_wavelengths, decimals=self.tolerance)
def __getitem__(self, key): def __getitem__(self, key):
return _iLocIndexer(self) i = _iLocIndexer(self)
return i[key]
@property @property
def loc(self): def loc(self):
...@@ -54,7 +57,6 @@ class HCube(object): ...@@ -54,7 +57,6 @@ class HCube(object):
y = key[1] y = key[1]
x = key[2] x = key[2]
if isinstance(x, slice): if isinstance(x, slice):
xstart = ifnone(x.start,0) xstart = ifnone(x.start,0)
xstop = ifnone(x.stop,self.raster_size[0]) xstop = ifnone(x.stop,self.raster_size[0])
...@@ -68,8 +70,11 @@ class HCube(object): ...@@ -68,8 +70,11 @@ class HCube(object):
else: else:
raise TypeError("Loc style access elements must be slices, e.g., [:] or [10:100]") raise TypeError("Loc style access elements must be slices, e.g., [:] or [10:100]")
pixels = (xstart, ystart, xstop, ystop) pixels = (xstart, ystart, xstep, ystep)
arrs = [] if isinstance(key[0], (int, np.integer)):
for b in key[0]: return self.read_array(band=int(key[0]+1), pixels=pixels)
arrs.append(self.read_array(band=int(b+1), pixels=pixels)) else:
arrs = []
for b in key[0]:
arrs.append(self.read_array(band=int(b+1), pixels=pixels))
return np.stack(arrs) return np.stack(arrs)
\ No newline at end of file
...@@ -14,8 +14,15 @@ class M3(GeoDataset, HCube): ...@@ -14,8 +14,15 @@ class M3(GeoDataset, HCube):
if not hasattr(self, '_wavelengths'): if not hasattr(self, '_wavelengths'):
try: try:
info = gdal.Info(self.file_name, format='json') info = gdal.Info(self.file_name, format='json')
wavelengths = [float(j) for i, j in sorted(info['metadata'][''].items(), if 'Resize' in info['metadata']['']['Band_1']:
key=lambda x: float(x[0].split('_')[-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 self._original_wavelengths = wavelengths
self._wavelengths = np.round(wavelengths, self.tolerance) self._wavelengths = np.round(wavelengths, self.tolerance)
except: except:
......
...@@ -35,7 +35,7 @@ def expanded_indexer(key, ndim): ...@@ -35,7 +35,7 @@ def expanded_indexer(key, ndim):
class _LocIndexer(object): class _LocIndexer(object):
def __init__(self, data_array): def __init__(self, data_array):
self.data_array = data_array self.data_array = data_array
def __getitem__(self, key): def __getitem__(self, key):
# expand the indexer so we can handle Ellipsis # expand the indexer so we can handle Ellipsis
key = expanded_indexer(key, 3) key = expanded_indexer(key, 3)
...@@ -43,8 +43,11 @@ class _LocIndexer(object): ...@@ -43,8 +43,11 @@ class _LocIndexer(object):
ifnone = lambda a, b: b if a is None else a ifnone = lambda a, b: b if a is None else a
if isinstance(sl, slice): if isinstance(sl, slice):
sl = list(range(ifnone(sl.start, 0), self.data_array.nbands, ifnone(sl.step, 1))) sl = list(range(ifnone(sl.start, 0), self.data_array.nbands, ifnone(sl.step, 1)))
idx = [self._get_idx(s) for s in sl] 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]) key = (idx, key[1], key[2])
return self.data_array._read(key) return self.data_array._read(key)
...@@ -52,7 +55,7 @@ class _LocIndexer(object): ...@@ -52,7 +55,7 @@ class _LocIndexer(object):
vals = np.abs(self.data_array.wavelengths-value) vals = np.abs(self.data_array.wavelengths-value)
minidx = np.argmin(vals) minidx = np.argmin(vals)
if vals[minidx] >= tolerance: 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 return minidx
class _iLocIndexer(object): class _iLocIndexer(object):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment