Source code for Py6S.SixSHelpers.spectra

# This file is part of Py6S.
#
# Copyright 2012 Robin Wilson and contributors listed in the CONTRIBUTORS file.
#
# Py6S is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Py6S is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with Py6S.  If not, see <http://www.gnu.org/licenses/>.

import sys

import numpy as np

# Python 2/3 imports
try:
    import urllib2
except ImportError:
    if sys.version_info[0] >= 3:
        import urllib.request as urllib2
    else:
        raise

try:
    from StringIO import StringIO
except ImportError:
    if sys.version_info[0] >= 3:
        from io import StringIO
    else:
        raise


[docs]class Spectra: """Class allowing the import of spectral libraries from various sources"""
[docs] @classmethod def import_from_usgs(cls, loc): """NOT WORKING AT THE MOMENT - USGS have changed the format of their spectra. Imports a spectral library from the USGS Spectral Library (available at http://speclab.cr.usgs.gov/spectral.lib06/). Arguments: * ``loc`` -- Location of the data to import. Returns: An ``ndarray`` with two columns: wavelength (um) and reflectance (fraction) Example usage:: from Py6S import * s = SixS() s.wavelength = Wavelength(0.500) s.ground_reflectance = GroundReflectance.HomogeneousLambertian(Spectra.import_from_usgs("http://speclab.cr.usgs.gov/spectral.lib06/ds231/ASCII/V/russianolive.dw92-4.30728.asc")) s.run() # Bear in mind this will produce a result for a single Wavelength # To see what the whole spectrum will look like after atmospheric # radiative transfer has taken place you must run for multiple wavelengths # For example wavelengths, reflectances = SixSHelpers.Wavelengths.run_vnir(s, output_name="apparent_radiance") """ if loc.startswith("""http://"""): data = urllib2.urlopen(loc).read() if sys.version_info[0] >= 3: f = StringIO(data.decode()) else: f = StringIO(data) else: f = open(loc, "r") npdata = np.loadtxt(f, skiprows=16) f.close() npdata[npdata == -1.23e34] = np.nan npdata = npdata[:, 0:2] return npdata
[docs] @classmethod def import_from_aster(cls, loc): """Imports a spectral library from the ASTER Spectral Library (http://speclib.jpl.nasa.gov/) Arguments: * ``loc`` -- Location of the data to import. Must be a local file path - URLs do not work currently due to SSL errors at the remote end Returns: An ``ndarray`` with two columns: wavelength (um) and reflectance (fraction) Example usage:: from Py6S import * s = SixS() s.ground_reflectance = GroundReflectance.HomogeneousLambertian(Spectra.import_from_aster("http://speclib.jpl.nasa.gov/speclibdata/jhu.becknic.vegetation.trees.conifers.solid.conifer.spectrum.txt")) s.run() # Bear in mind this will produce a result for a single Wavelength # To see what the whole spectrum will look like after atmospheric # radiative transfer has taken place you must run for multiple wavelengths # For example wavelengths, reflectances = SixSHelpers.Wavelengths.run_vnir(s, output_name="apparent_radiance") """ if loc.startswith("""http://"""): data = urllib2.urlopen(loc).read() if sys.version_info[0] >= 3: f = StringIO(data.decode()) else: f = StringIO(data) else: f = open(loc, "r") npdata = np.loadtxt(f, skiprows=26) f.close() npdata[:, 1] = npdata[:, 1] / 100 return npdata