pyModis

PDF documentation

Download the documentation in pdf format



Source code for pymodis.qualitymodis

#!/usr/bin/env python
#  class to convert/process modis data
#
#  (c) Copyright Ingmar Nitze 2013
#  Authors: Ingmar Nitze, Luca Delucchi
#  Email: initze at ucc dot ie
#  Email: luca dot delucchi at iasma dot it
#
##################################################################
#
#  This MODIS Python class is licensed under the terms of GNU GPL 2.
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License as
#  published by the Free Software Foundation; either version 2 of
#  the License, or (at your option) any later version.
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#  See the GNU General Public License for more details.
#
##################################################################

from datetime import *
import os
import sys
import numpy as np
from osgeo import gdal, gdal_array


VALIDTYPES = {'13' : map(str,range(1,10)), '11' : map(str,range(1,6))}

PRODUCTPROPS = {'MOD13Q1' : ([2], ['QAGrp1']),\
				'MYD13Q1' : ([2], ['QAGrp1']),\
				'MOD13A1' : ([2], ['QAGrp1']),\
				'MYD13A1' : ([2], ['QAGrp1']),\
				'MOD13A2' : ([2], ['QAGrp1']),\
				'MYD13A2' : ([2], ['QAGrp1']),\
				'MOD13A3' : ([2], ['QAGrp1']),\
				'MYD13A3' : ([2], ['QAGrp1']),\
				'MOD13C1' : ([2], ['QAGrp1']),\
				'MYD13C1' : ([2], ['QAGrp1']),\
				'MOD13C2' : ([2], ['QAGrp1']),\
				'MYD13C2' : ([2], ['QAGrp1']),\
				'MOD11A1' : ([1, 5], ['QAGrp2', 'QAGrp2']),\
				'MYD11A1' : ([1, 5], ['QAGrp2', 'QAGrp2']),\
				'MOD11A2' : ([1, 5], ['QAGrp4', 'QAGrp4']),\
				'MYD11A2' : ([1, 5], ['QAGrp4', 'QAGrp4']),\
				'MOD11B1' : ([1, 5, -2], ['QAGrp2', 'QAGrp2', 'QAGrp3']),\
				'MYD11B1' : ([1, 5, -2], ['QAGrp2', 'QAGrp2', 'QAGrp3']),\
				'MOD11C1' : ([1, 5, -2], ['QAGrp2', 'QAGrp2', 'QAGrp3']),\
				'MYD11C1' : ([1, 5, -2], ['QAGrp2', 'QAGrp2', 'QAGrp3']),\
				'MOD11C2' : ([1, 6], ['QAGrp2', 'QAGrp2']),\
				'MYD11C2' : ([1, 6], ['QAGrp2', 'QAGrp2']),\
				'MOD11C3' : ([1, 6], ['QAGrp2', 'QAGrp2']),\
				'MYD11C3' : ([1, 6], ['QAGrp2', 'QAGrp2'])}

	
QAindices = {'QAGrp1' : (16, [[-2, None],[-6, -2],[-8, -6],[-9, -8],[-10, -9],[-11, -10],[-14, -11],[-15, -14], [-16, -15]]),\
			 'QAGrp2' : (7, [[-2, None],[-3, -2],[-4, -3],[-6, -4],[-8, -6]]),\
			 'QAGrp3' : (7, [[-3, None],[-6, -3],[-7, -6]]),\
			 'QAGrp4' : (8, [[-2, None],[-4, -2],[-6, -4],[-8, -6]])}

			 
[docs]class QualityModis(): """A Class for the extraction and transformation of MODIS quality layers to specific information""" def __init__(self, infile, outfile, qType = None, qLayer = None, pType = None): """Initialization function : infile = the full path to the hdf file outfile = the full path to the paramater file mrtpath = the full path to mrt directory where inside you have bin and data directories """ self.infile = infile self.outfile = outfile self.qType = qType self.qLayer = qLayer self.qaGroup = None self.pType = pType
[docs] def loadData(self): """loads the input file to the object""" os.path.isfile(self.infile) self.ds = gdal.Open(self.infile)
[docs] def setProductType(self): """read productType from Metadata of hdf file""" if self.pType == None: self.productType = self.ds.GetMetadata()['SHORTNAME'] else: self.productType = self.pType
[docs] def setProductGroup(self): """read productGroup from Metadata of hdf file""" self.productGroup = self.productType[3:5]
[docs] def setQAGroup(self): """set QA dataset group type""" if self.productType in PRODUCTPROPS.keys(): self.qaGroup = PRODUCTPROPS[self.productType][1][int(self.qLayer)-1] else: #print "Product version", self.modisVersion, "is currently not supported!" #used for later version support print "Product version is currently not supported!"
[docs] def setQALayer(self): """function sets the input path of the designated QA layer""" self.qaLayer = self.ds.GetSubDatasets()[PRODUCTPROPS[self.productType][0][int(self.qLayer)-1]][0]
[docs] def loadQAArray(self): """loads the QA layer to the object""" self.qaArray = gdal_array.LoadFile(self.qaLayer)
[docs] def qualityConvert(self, modisQaValue): """converts encoded Bit-Field values to designated QA information""" startindex = QAindices[self.qaGroup][1][int(self.qType)-1][0] endindex = QAindices[self.qaGroup][1][int(self.qType)-1][1] return int(np.binary_repr(modisQaValue, QAindices[self.qaGroup][0])[startindex: endindex], 2)
[docs] def exportData(self): """writes calculated QA values to physical .tif file""" qaDS = gdal.Open(self.qaLayer) dr = gdal.GetDriverByName('GTiff') outds = dr.Create(self.outfile, self.ncols, self.nrows, 1, gdal.GDT_Byte) outds.SetProjection(qaDS.GetProjection()) outds.SetGeoTransform(qaDS.GetGeoTransform()) outds.GetRasterBand(1).WriteArray(self.qaOut) outds = None qaDS = None
[docs] def run(self): """Function defines the entire process""" self.loadData() self.setProductType() self.setProductGroup() #self.setDSversion() self.setQAGroup() self.setQALayer() self.loadQAArray() self.nrows, self.ncols = self.qaArray.shape print "Conversion started !" self.qaOut = np.zeros_like(self.qaArray, dtype = np.int8) if self.productGroup in ['11', '13'] and self.qType in VALIDTYPES[self.productGroup] and self.qaGroup != None: for val in np.unique(self.qaArray): ind = np.where(self.qaArray == val) self.qaOut[ind] = self.qualityConvert(self.qaArray[ind][0]) self.exportData() print "Export finished!" else: print "This MODIS type is currently not supported."