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