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 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,8 +70,11 @@ class HCube(object):
else:
raise TypeError("Loc style access elements must be slices, e.g., [:] or [10:100]")
pixels = (xstart, ystart, xstop, ystop)
arrs = []
for b in key[0]:
arrs.append(self.read_array(band=int(b+1), pixels=pixels))
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))
return np.stack(arrs)
\ No newline at end of file
......@@ -14,8 +14,15 @@ class M3(GeoDataset, HCube):
if not hasattr(self, '_wavelengths'):
try:
info = gdal.Info(self.file_name, format='json')
wavelengths = [float(j) for i, j in sorted(info['metadata'][''].items(),
key=lambda x: float(x[0].split('_')[-1]))]
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
self._wavelengths = np.round(wavelengths, self.tolerance)
except:
......
......@@ -35,7 +35,7 @@ def expanded_indexer(key, ndim):
class _LocIndexer(object):
def __init__(self, data_array):
self.data_array = data_array
def __getitem__(self, key):
# expand the indexer so we can handle Ellipsis
key = expanded_indexer(key, 3)
......@@ -43,8 +43,11 @@ class _LocIndexer(object):
ifnone = lambda a, b: b if a is None else a
if isinstance(sl, slice):
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])
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):
......
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