Source code for datasets.amsre

""" Class definition for the AMSR-E Soil Mositure data type.

.. module:: amsre
   :synopsis: Definition of the AMSRE class

.. moduleauthor:: Kostas Andreadis <kandread@jpl.nasa.gov>

"""

from soilmoist import Soilmoist
from ftplib import FTP
from datetime import timedelta
import tempfile
import subprocess
import datasets
import dbio
import logging


table = "soilmoist.amsre"


[docs]def dates(dbname): dts = datasets.dates(dbname, "soilmoist.amsre") return dts
[docs]def download(dbname, dts, bbox): """Downloads AMSR-E soil moisture data for a set of dates *dts* and imports them into the PostGIS database *outpath*. Optionally uses a bounding box to limit the region with [minlon, minlat, maxlon, maxlat].""" log = logging.getLogger(__name__) url = "n5eil01u.ecs.nsidc.org" ftp = FTP(url) ftp.login() ftp.cwd("SAN/AMSA/AE_Land3.002") for dt in [dts[0] + timedelta(ti) for ti in range((dts[-1] - dts[0]).days+1)]: datadir = dt.strftime("%Y.%m.%d") try: tmppath = tempfile.mkdtemp() ftp.cwd(datadir) fname = [f for f in ftp.nlst() if f.endswith("hdf")][0] with open("{0}/{1}".format(tmppath, fname), 'wb') as f: ftp.retrbinary("RETR {0}".format(fname), f.write) proc = subprocess.Popen(["gdal_translate", "HDF4_EOS:EOS_GRID:{0}/{1}:Ascending_Land_Grid:A_Soil_Moisture".format(tmppath, fname), "{0}/sma.tif".format(tmppath)], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, err = proc.communicate() log.debug(out) proc = subprocess.Popen(["gdal_translate", "HDF4_EOS:EOS_GRID:{0}/{1}:Descending_Land_Grid:D_Soil_Moisture".format(tmppath, fname), "{0}/smd.tif".format(tmppath)], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, err = proc.communicate() log.debug(out) # merge orbits proc = subprocess.Popen(["gdal_merge.py", "-o", "{0}/sm1.tif".format(tmppath), "{0}/sma.tif".format(tmppath), "{0}/smd.tif".format(tmppath)], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, err = proc.communicate() log.debug(out) # reproject data proc = subprocess.Popen(["gdalwarp", "-s_srs", "epsg:3410", "-t_srs", "epsg:4326", "{0}/sm1.tif".format(tmppath), "{0}/sm2.tif".format(tmppath)], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, err = proc.communicate() log.debug(out) if bbox is None: pstr = [] else: pstr = ["-projwin", str(bbox[0]), str(bbox[3]), str(bbox[2]), str(bbox[1])] proc = subprocess.Popen(["gdal_translate"] + pstr + ["-ot", "Float32", "{0}/sm2.tif".format(tmppath), "{0}/sm3.tif".format(tmppath)], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, err = proc.communicate() log.debug(out) filename = "{0}/amsre_soilm_{1}.tif".format(tmppath, dt.strftime("%Y%m%d")) proc = subprocess.Popen(["gdal_calc.py", "-A", "{0}/sm3.tif".format(tmppath), "--outfile={0}".format(filename), "--NoDataValue=-9999", "--calc=\"(abs(A)!=9999)*(A/1000.0+9999)-9999\""], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, err = proc.communicate() log.debug(out) dbio.ingest(dbname, filename, dt, table, False) ftp.cwd("../") except: log.warning("AMSR-E data not available for {0}. Skipping download!".format(dt.strftime("%Y%m%d")))
[docs]class Amsre(Soilmoist): def __init__(self, uncert=None): """Initialize AMSR-E soil moisture object.""" super(Amsre, self).__init__(uncert) self.res = 0.25 self.stddev = 0.01 self.tablename = "soilmoist.amsre"