From 8e4a0856c62d978f70db27f6b47ba20428a18928 Mon Sep 17 00:00:00 2001 From: jlaura <jlaura@usgs.gov> Date: Thu, 19 Apr 2018 10:27:25 -0700 Subject: [PATCH] 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 --- plio/io/hcube.py | 19 ++++++++++++------- plio/io/io_moon_minerology_mapper.py | 11 +++++++++-- plio/utils/indexing.py | 11 +++++++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/plio/io/hcube.py b/plio/io/hcube.py index 9b41a71..0d1ed9f 100644 --- a/plio/io/hcube.py +++ b/plio/io/hcube.py @@ -1,6 +1,9 @@ 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 diff --git a/plio/io/io_moon_minerology_mapper.py b/plio/io/io_moon_minerology_mapper.py index 3093c2c..c28a7dc 100644 --- a/plio/io/io_moon_minerology_mapper.py +++ b/plio/io/io_moon_minerology_mapper.py @@ -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: diff --git a/plio/utils/indexing.py b/plio/utils/indexing.py index 50fa17a..9dc7c93 100644 --- a/plio/utils/indexing.py +++ b/plio/utils/indexing.py @@ -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): -- GitLab