Python grass

17

Click here to load reader

description

Lecture at North Carolina State University about python programming in GRASS GIS environment

Transcript of Python grass

Page 1: Python grass

Python scripting in GRASS GIS environment

Geospatial Analysis and Modeling – MEA792Margherita Di Leo

Page 2: Python grass

Python scripting in GRASS GIS environment

Python + GRASS GIS:

➢ Python scripts that call GRASS functionality from outside

➢ Running external commands from Python (as a grass module)

Page 3: Python grass

Python scripting in GRASS GIS environment

Example

Module: r.ipso

Purpose: Creates the ipsographic curve and the adimensional ipsometric curve

Requires: Matplotlib

http://svn.osgeo.org/grass/grass-addons/raster/r.ipso/

Page 4: Python grass

Python scripting in GRASS GIS environment

GUI

#%module#% description: Creates the ipsographic and ipsometric curve#% keywords: raster#%end#%option#% key: map#% type: string#% gisprompt: old,raster,raster#% key_desc: name#% description: Name of elevation raster map #% required: yes#%end#%option#% key: image#% type: string#% gisprompt: new_file,file,input#% key_desc: image#% description: output graph#% required: yes#%end#%flag#% key: a#% description: generate ipsometric curve#%END#%flag#% key: b#% description: generate ipsographic curve#%END

Page 5: Python grass

Python scripting in GRASS GIS environment

GUI

#%module#% description: Creates the ipsographic and ipsometric curve#% keywords: raster#%end#%option#% key: map#% type: string#% gisprompt: old,raster,raster#% key_desc: name#% description: Name of elevation raster map #% required: yes#%end#%option#% key: image#% type: string#% gisprompt: new_file,file,input#% key_desc: image#% description: output graph#% required: yes#%end#%flag#% key: a#% description: generate ipsometric curve#%END#%flag#% key: b#% description: generate ipsographic curve#%END

Page 6: Python grass

Python scripting in GRASS GIS environment

prompt

GRASS 6.5.svn (Basilicata):~ > r.ipso.py --help

Description: Creates the ipsographic and ipsometric curve

Keywords: raster

Usage: r.ipso.py [-ab] map=name image=image [--verbose] [--quiet]

Flags: -a generate ipsometric curve -b generate ipsographic curve --v Verbose module output --q Quiet module output

Parameters: map Name of elevation raster map image path to output graphGRASS 6.5.svn (Basilicata):~ >

Page 7: Python grass

Python scripting in GRASS GIS environment

output

GRASS 6.5.svn (Basilicata):~ > r.ipso.py map=dem@Fiumarella_dataset -ab image=Fiumarella 100%Tot. cells 172200.0===========================Ipsometric | quantiles===========================994 | 0.025989 | 0.05980 | 0.1960 | 0.25918 | 0.5870 | 0.75882 | 0.7841 | 0.9817 | 0.975

Done!GRASS 6.5.svn (Basilicata):~ >

Page 8: Python grass

Python scripting in GRASS GIS environment

output

Page 9: Python grass

Python scripting in GRASS GIS environment

output

Page 10: Python grass

Python scripting in GRASS GIS environment

importimport sysimport osimport matplotlib.pyplot as pltimport grass.script as grassimport numpy as np

Main (1/4)def main(): # r.stats gives in the first column the elevation and in the second the number of cells having that elevation stats = grass.read_command('r.stats', input = options['map'], fs = 'space', nv = '*', nsteps = '255', flags = 'inc').split('\n')[:-1]

# res = cellsize res = float(grass.read_command('g.region', rast = options['map'], flags = 'm').strip().split('\n')[4].split('=')[1]) zn = np.zeros((len(stats),6),float) kl = np.zeros((len(stats),2),float) prc = np.zeros((9,2),float)

for i in range(len(stats)): if i == 0: zn[i,0], zn[i, 1] = map(float, stats[i].split(' ')) zn[i,2] = zn[i,1] else: zn[i,0], zn[i, 1] = map(float, stats[i].split(' ')) zn[i,2] = zn[i,1] + zn[i-1,2]

totcell = sum(zn[:,1]) print "Tot. cells", totcell

Page 11: Python grass

Python scripting in GRASS GIS environment

Main (2/4) for i in range(len(stats)): zn[i,3] = 1 - (zn[i,2] / sum(zn[:,1])) zn[i,4] = zn[i,3] * (((res**2)/1000000)*sum(zn[:,1])) zn[i,5] = ((zn[i,0] - min(zn[:,0])) / (max(zn[:,0]) - min(zn[:,0])) ) kl[i,0] = zn[i,0] kl[i,1] = 1 - (zn[i,2] / totcell)

# quantiles prc[0,0] , prc[0,1] = findint(kl,0.025) , 0.025 prc[1,0] , prc[1,1] = findint(kl,0.05) , 0.05 prc[2,0] , prc[2,1] = findint(kl,0.1) , 0.1 prc[3,0] , prc[3,1] = findint(kl,0.25) , 0.25 prc[4,0] , prc[4,1] = findint(kl,0.5) , 0.5 prc[5,0] , prc[5,1] = findint(kl,0.75) , 0.75 prc[6,0] , prc[6,1] = findint(kl,0.9) , 0.9 prc[7,0] , prc[7,1] = findint(kl,0.95) , 0.95 prc[8,0] , prc[8,1] = findint(kl,0.975) , 0.975

# Managing flag & plot if flags['a']: plotImage(zn[:,3], zn[:,5],options['image']+'_Ipsometric.png','-','A(i) / A','Z(i) / Zmax','Ipsometric Curve') if flags['b']: plotImage(zn[:,4], zn[:,0],options['image']+'_Ipsographic.png','-','A [km^2]','Z [m.slm]','Ipsographic Curve')

Page 12: Python grass

Python scripting in GRASS GIS environment

Main (3/4) print "===========================" print "Ipsometric | quantiles" print "===========================" print '%.0f' %findint(kl,0.025) , "|", 0.025 print '%.0f' %findint(kl,0.05) , "|", 0.05 print '%.0f' %findint(kl,0.1) , "|", 0.1 print '%.0f' %findint(kl,0.25) , "|", 0.25 print '%.0f' %findint(kl,0.5) , "|", 0.5 print '%.0f' %findint(kl,0.75) , "|", 0.75 print '%.0f' %findint(kl,0.7) , "|", 0.7 print '%.0f' %findint(kl,0.9) , "|", 0.9 print '%.0f' %findint(kl,0.975) , "|", 0.975 print '\n' print 'Done!' #print prc

def findint(kl,f): Xf = np.abs(kl-f); Xf = np.where(Xf==Xf.min()) z1 , z2 , f1 , f2 = kl[float(Xf[0])][0] , kl[float(Xf[0]-1)][0] , kl[float(Xf[0])][1] , kl[float(Xf[0]-1)][1] z = z1 + ((z2 - z1) / (f2 - f1)) * (f - f1) return z

Page 13: Python grass

Python scripting in GRASS GIS environment

Main (4/4)def plotImage(x,y,image,type,xlabel,ylabel,title): plt.plot(x, y, type) plt.ylabel(ylabel) plt.xlabel(xlabel) plt.xlim( min(x), max(x) ) plt.ylim( min(y), max(y) ) plt.title(title) plt.grid(True) plt.savefig(image) plt.close('all') if __name__ == "__main__":

options, flags = grass.parser()sys.exit(main())

Page 14: Python grass

Python scripting in GRASS GIS environment

Zn has n rows and 6 columns [len(stats) = n]

Kl has n rows and 2 columns

Prc has 9 rows and 2 columns

Zn

0 1 2 3 4 5

A = elevation

B = numbers of

cells

C = (if i=0, Ci=Ai; else

Ci = Ai + B(i-1) )

D = (1-C) / numbers of

cells

E = Di * (res^2) /

1000000 * numbers of

cells

F = (A – min(A)) / (max(A) - min(A))

Page 15: Python grass

Python scripting in GRASS GIS environment

Zn has n rows and 6 columns [len(stats) = n]

Kl has n rows and 2 columns

Prc has 9 rows and 2 columns

kl

0 1

A = elevation

G = 1 – (C / num of cell)

Page 16: Python grass

Python scripting in GRASS GIS environment

Prc has 9 rows and 2 columns. It defines the ipsometric curve by the quantiles of the distribution.It is built by the function ”findint”

def findint(kl,f): Xf = np.abs(kl-f); Xf = np.where(Xf==Xf.min()) z1 , z2 , f1 , f2 = kl[float(Xf[0])][0] , kl[float(Xf[0]-1)][0] , kl[float(Xf[0])][1] , kl[float(Xf[0]-1)][1] z = z1 + ((z2 - z1) / (f2 - f1)) * (f - f1) return z

np.abs and np.where are two NumPy routines:

numpy.absolute(x[, out]) Calculate the absolute value element-wise.

numpy.where(condition[, x, y]) Return elements, either from x or y, depending on condition. If only condition is given, return condition.nonzero().

See NumPy doc at http://docs.scipy.org/doc/

Page 17: Python grass

Python scripting in GRASS GIS environment

Some useful links:

GRASS and Python on Osgeo wiki:http://grass.osgeo.org/wiki/GRASS_and_Python

GRASS Python Scripting Library:http://grass.osgeo.org/programming6/pythonlib.html Style rules:http://trac.osgeo.org/grass/browser/grass/trunk/SUBMITTING_PYTHON