GroundSurfaceTemperatureTime.py

maria prove, 2014-02-11 03:58 AM

Download (6.71 KB)

 
1
# -*- coding: utf-8 -*-
2

    
3
"""
4
***************************************************************************
5
    GroundSurfaceTemperatureTime.py
6
    ---------------------
7
    Date                 : May 2013
8
    Copyright            : (C) 2013 by Rocco Pispico
9
    Email                : rocco dot pispico at arpa dot piemonte dot it
10
    Note                 : based on GroundSurfaceTemperature.py by
11
                           Riccardo Lemmi
12
***************************************************************************
13
*                                                                         *
14
*   This program is free software; you can redistribute it and/or modify  *
15
*   it under the terms of the GNU General Public License as published by  *
16
*   the Free Software Foundation; either version 2 of the License, or     *
17
*   (at your option) any later version.                                   *
18
*                                                                         *
19
***************************************************************************
20
"""
21

    
22
__author__ = 'Rocco Pispico'
23
__date__ = 'May 2013'
24
__copyright__ = '(C) 2013, Rocco Pispico'
25
# This will get replaced with a git SHA1 when you do a git archive
26
__revision__ = '$Format:%H$'
27

    
28
import os
29

    
30
from PyQt4 import QtGui
31

    
32
from processing.core.GeoAlgorithm import GeoAlgorithm
33
from processing.outputs.OutputRaster import OutputRaster
34

    
35
from processing.parameters.ParameterRange import ParameterRange
36
from processing.parameters.ParameterNumber import ParameterNumber
37
from processing.parameters.ParameterRaster import ParameterRaster
38

    
39
import sys
40
from osgeo import gdal
41

    
42
import numpy
43
import numpy.ma as ma
44

    
45

    
46
def HcT0(Ta, K, Qs):
47
    # Snow depth Critical
48
  #  if Ta < 0:
49
   #     return abs(Ta) * (K / Qs) 
50
    #else:
51
     #   raise Exception("Positive Ta temperature not expected")
52
    if Ta >= 0:
53
        return 0.001
54
    else:
55
        return abs(Ta) * (K / Qs) 
56

    
57
def TsT0_analysis(T0, Hn, Ta, K, Qs):
58
  #
59
  if Hn == 0:
60
      return Ta
61
  elif Hn >= HcT0(Ta, K, Qs):
62
      return T0
63
  else:
64
      if Ta < 0:
65
          # return (Ta - Qs / (K * Hn))
66
          # return (abs(Ta) - (Qs / (K * Hn))) * -1.0
67
          return Ta + (Qs * Hn / K)
68
      else:
69
          return 0
70

    
71
  Tarray = numpy.frompyfunc(TsT0_analysis,5,1)
72

    
73

    
74
def stats(data, bandOut):
75
    # stats
76
    masked_data = ma.masked_less_equal(data, -3.4e+38)
77
    data_min = float(masked_data.min())
78
    data_max = float(masked_data.max())
79
    data_std = numpy.std(masked_data)
80
    bandOut.SetStatistics(
81
                data_min,
82
                data_max,
83
                numpy.mean([data_max, data_min]),
84
                data_std)
85

    
86

    
87
class GroundSurfaceTemperatureTime:
88

    
89
    def __init__(self, T0_path, Hn_path, Ta_path, K, Qs, Ts_path):
90
        gdal.AllRegister()
91

    
92
        self.T0 = gdal.Open(str(T0_path))
93
        self.Hn = gdal.Open(str(Hn_path))
94
        self.Ta = gdal.Open(str(Ta_path))
95
        self.K = K
96
        self.Qs = Qs
97

    
98
        # image parameters
99
        self.rows = self.Hn.RasterYSize
100
        self.cols = self.Hn.RasterXSize
101
        self.geoTransform = self.Hn.GetGeoTransform()
102
        self.projection = self.Hn.GetProjection()
103
        self.data_type = self.Hn.GetRasterBand(1).DataType
104

    
105
        driver = self.Hn.GetDriver()
106
        self.imageOut = driver.Create(
107
                                str(Ts_path),
108
                                self.cols,
109
                                self.rows,
110
                                1,               # Image Bands
111
                                self.data_type)
112
        self.data = None
113

    
114
    def compute(self):
115
        """  """
116
        T0_data = self.T0.GetRasterBand(1).ReadAsArray(0, 0, self.cols, self.rows)
117
        Hn_data = self.Hn.GetRasterBand(1).ReadAsArray(0, 0, self.cols, self.rows)
118
        Ta_data = self.Ta.GetRasterBand(1).ReadAsArray(0, 0, self.cols, self.rows)
119

    
120
        data = Tarray(T0_data, Hn_data, Ta_data, self.K, self.Qs).astype(numpy.float)
121

    
122
        # remove invalid points
123
        mask = numpy.greater(Hn_data, -3.4e+38)
124
        self.data = numpy.choose(mask, (-3.4e+38, data))
125

    
126
    def __enter__(self):
127
        return  self
128

    
129
    def __exit__(self,exc_type, exc_val, exc_tb):
130

    
131
        if self.data is not None:
132
            # create the output image
133
            bandOut = self.imageOut.GetRasterBand(1)
134
            bandOut.SetNoDataValue(-3.4e+38)
135
            stats(self.data, bandOut)
136
            bandOut.WriteArray(self.data, 0, 0)
137
            bandOut.FlushCache()
138

    
139
            # set the geotransform and projection on the output
140
            self.imageOut.SetGeoTransform(self.geoTransform)
141
            self.imageOut.SetProjection(self.projection)
142

    
143
            ## build pyramids for the output
144
            gdal.SetConfigOption('HFA_USE_RRD', 'YES')
145
            self.imageOut.BuildOverviews(overviewlist=[2,4,8,16])
146

    
147

    
148
class GroundSurfaceTemperatureTimeAlgorithm(GeoAlgorithm):
149

    
150
    # input parameters
151
    T0 = "T0"
152
    Hn = "Hn"
153
    Ta = "Ta"
154
    K  = "K"
155
    Qs = "Qs"
156

    
157
    # output parameters
158
    Ts = "Ts"
159

    
160
    def defineCharacteristics(self):
161
        self.name = "Ground surface Temperature Time"
162
        self.group = "[permaclim]"
163
        self.addParameter(ParameterRaster(
164
                            GroundSurfaceTemperatureTimeAlgorithm.T0,
165
                            "T0 Reference"))
166
        self.addParameter(ParameterRaster(
167
                            GroundSurfaceTemperatureTimeAlgorithm.Hn,
168
                            "Snow heigth (m)"))
169
        self.addParameter(ParameterRaster(
170
                            GroundSurfaceTemperatureTimeAlgorithm.Ta,
171
                            u"Air temperature (°C)"))
172
        self.addParameter(ParameterNumber(
173
                            GroundSurfaceTemperatureTimeAlgorithm.K,
174
                            u"Thermal conductivity of the snow (W m^-1 °C^-1)",
175
                            default=0.16))
176
        self.addParameter(ParameterNumber(
177
                            GroundSurfaceTemperatureTimeAlgorithm.Qs,
178
                            "Sensible heat flux",
179
                            default=0.86))
180
        self.addOutput(OutputRaster(
181
                            GroundSurfaceTemperatureTimeAlgorithm.Ts,
182
                            "Surface Temperature"))
183

    
184
    def processAlgorithm(self, progress):
185

    
186
        t0_path = self.getParameterValue(GroundSurfaceTemperatureTimeAlgorithm.T0)
187
        hn_path = self.getParameterValue(GroundSurfaceTemperatureTimeAlgorithm.Hn)
188
        ta_path = self.getParameterValue(GroundSurfaceTemperatureTimeAlgorithm.Ta)
189
        k = self.getParameterValue(GroundSurfaceTemperatureTimeAlgorithm.K)
190
        qs = self.getParameterValue(GroundSurfaceTemperatureTimeAlgorithm.Qs)
191

    
192
        ts_path = self.getOutputValue(GroundSurfaceTemperatureTimeAlgorithm.Ts)
193

    
194
        with GroundSurfaceTemperatureTime(t0_path,hn_path,ta_path,k,qs,ts_path) as gst:
195
            gst.compute()        
196

    
197

    
198