Unit 26 - MODIS ST scripting

Let’s create a simple Python script for computing LST statistics in Germany area for given period. Input parameters:

  • input - Name of the input space time raster dataset (line 6)
  • start - Start date (line 9)
  • end - End date (line 15)

The script prints minimum, maximum and mean LST value. The raster map for computing statistics is created by t.rast.series (line 50), statistics is computed by r.univar (line 60). Statistics will be printed in nicely formatted manner, see lines 66-68.

In Unit 25 - MODIS ST we processed LST space time dataset only for year 2017. We will also check if input dates are valid, see line 31.

Tip

You can globally set quiet flag by GRASS_VERBOSE environment variable, see line 47.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env python

#%module
#% description: Computes LST stats for given period (limited to Germany and 2017).
#%end
#%option G_OPT_STRDS_INPUT
#%end
#%option 
#% key: start
#% description: Start date (eg. 2017-03-01)
#% type: string
#% required: yes
#%end
#%option 
#% key: end
#% description: End date (eg. 2017-04-01)
#% type: string
#% required: yes
#%end

import os
import sys
import atexit
from datetime import datetime
from subprocess import PIPE

import grass.script as gs
from grass.pygrass.modules import Module
from grass.exceptions import CalledModuleError
    
def check_date(date_str):
    d = datetime.strptime(date_str, '%Y-%m-%d')
    if d.year != 2017:
        gs.fatal("Only year 2017 allowed")

def cleanup():
    try:
        Module('g.remove', flags='f', type='raster', name=output)
    except CalledModuleError:
        pass
    
def main():
    check_date(options['start'])
    check_date(options['end'])

    # be silent
    os.environ['GRASS_VERBOSE'] = '0'
    
    try:
        Module('t.rast.series',
               input=options['input'],
               output=output,
               method='average',
               where="start_time > '{start}' and start_time < '{end}'".format(
                   start=options['start'], end=options['end']
        ))
    except CalledModuleError:
        gs.fatal('Unable to compute statistics')
        
    ret = Module('r.univar',
                 flags='g',
                 map=output,
                 stdout_=PIPE
    )
    stats = gs.parse_key_val(ret.outputs.stdout)
    print('Min: {0:.1f}'.format(float(stats['min'])))
    print('Max: {0:.1f}'.format(float(stats['max'])))
    print('Mean: {0:.1f}'.format(float(stats['mean'])))
        
if __name__ == "__main__":
    options, flags = gs.parser()
    output = '{}_{}'.format(
        options['input'].split('@')[0], os.getpid()
    )

    atexit.register(cleanup)
    sys.exit(main())

Example of usage:

modis-date-stats.py input=modis_c start=2017-03-01 end=2017-04-01
Min: -5.4
Max: 13.8
Mean: 8.0

Sample script to download: modis-date-stats.py