[GRASS-SVN] r56181 - grass-addons/grass6/raster/r.viewshed.cva

svn_grass at osgeo.org svn_grass at osgeo.org
Thu May 9 12:10:54 PDT 2013


Author: isaacullah
Date: 2013-05-09 12:10:54 -0700 (Thu, 09 May 2013)
New Revision: 56181

Added:
   grass-addons/grass6/raster/r.viewshed.cva/r.viewshed.cva.py
Log:
r.viewshed.cva is a module to undertake cumulative viewshed analysis using addon r.viewshed

Added: grass-addons/grass6/raster/r.viewshed.cva/r.viewshed.cva.py
===================================================================
--- grass-addons/grass6/raster/r.viewshed.cva/r.viewshed.cva.py	                        (rev 0)
+++ grass-addons/grass6/raster/r.viewshed.cva/r.viewshed.cva.py	2013-05-09 19:10:54 UTC (rev 56181)
@@ -0,0 +1,212 @@
+#!/usr/bin/python
+#
+############################################################################
+#
+# MODULE:       	r.viewshed.cva.py
+# AUTHOR(S):	Isaac Ullah
+# PURPOSE:		Undertakes a "cumulative viewshed analysis" using a vector points map as input "viewing" locations, and utilizing the faster r.viewshed instead of r.los.
+# COPYRIGHT:	(C) 2013 by Isaac Ullah
+# REFERENCES:    r.viewshed
+#			This program is free software under the GNU General Public
+#			License (>=v2). Read the file COPYING that comes with GRASS
+#			for details.
+#
+#############################################################################
+
+
+#%Module
+#%  description: Undertakes a "cumulative viewshed analysis" using a vector points map as input "viewing" locations, and the faster r.viewshed instead of r.los. NOTE: this routine requires the grass addon module r.viewshed, which can be added with g.extention
+#%End
+
+#%option
+#% key: elev
+#% type: string
+#% gisprompt: old,cell,raster
+#% description: Input elevation map (DEM)
+#% required : yes
+#%END 
+
+#%option
+#% key: output
+#% type: string
+#% gisprompt: old,cell,raster
+#% description: Output CVA raster
+#% required : yes
+#%END
+
+#%option
+#% key: vect
+#% type: string
+#% gisprompt: old,vector,vector
+#% description: Name of input vector points map containg the set of sites for this analysis.
+#% required : yes
+#%END
+
+#%option
+#% key: x_column
+#% type: string
+#% description: Column containing x values for site coordinates
+#% required : yes
+#%END
+
+#%option
+#% key: y_column
+#% type: string
+#% description: Column containing y values for site coordinates
+#% required : yes
+#%END
+
+#%option
+#% key: name_column
+#% type: string
+#% description: Column with unique identifiers for each point in input vector map (e.g. "cat" column)
+#% required : yes
+#%END
+
+#%option
+#% key: obs_elev
+#% type: string
+#% description: Height of observation points off the ground
+#%answer: 0.0
+#% required : yes
+#%END
+
+#%option
+#% key: tgt_elev
+#% type: string
+#% description: Height of target areas off the ground
+#%answer: 1.75
+#% required : yes
+#%END
+
+#%option
+#% key: max_dist
+#% type: string
+#% description: Maximum viewing distance (-1 = infinity)
+#%answer: -1
+#% required : yes
+#%END
+
+#%option
+#% key: mem
+#% type: string
+#% description: Amount of memory to use (in MB)
+#%answer: 1500
+#% required : yes
+#%END
+
+#%option
+#% key: refraction_coef
+#% type: string
+#% description: Refraction coefficient (with flag -r)
+#%answer: 0.14286
+#% required : no
+#%END
+
+
+#%flag
+#% key: k
+#% description: -k Keep all interim viewshed maps produced by the routine (maps will be named "vshed_'name'", where 'name' is the value in "name_column" for each input point)
+#%END
+
+#%flag
+#% key: c
+#% description: -c Consider the curvature of the earth (current ellipsoid)
+#%END
+
+#%flag
+#% key: r
+#% description: -r Consider the effect of atmospheric refraction
+#%END
+
+#%flag
+#% key: b
+#% description: -b   Output format is {0 (invisible) 1 (visible)}
+#%END
+
+#%flag
+#% key: e
+#% description:  -e   Output format is invisible = NULL, else current elev - viewpoint_elev
+#%END
+
+
+
+import sys
+import os
+import subprocess
+import tempfile
+import random
+grass_install_tree = os.getenv('GISBASE')
+sys.path.append(grass_install_tree + os.sep + 'etc' + os.sep + 'python')
+import grass.script as grass
+
+
+#main block of code starts here
+def main():
+    #bring in input variables
+    elev = os.getenv("GIS_OPT_elev")
+    out = os.getenv("GIS_OPT_output")
+    vect = os.getenv("GIS_OPT_vect")
+    xcol = os.getenv("GIS_OPT_x_column")
+    ycol = os.getenv("GIS_OPT_y_column")
+    namecol = os.getenv("GIS_OPT_name_column")
+    obs_elev = os.getenv("GIS_OPT_obs_elev")
+    tgt_elev = os.getenv("GIS_OPT_tgt_elev")
+    max_dist = os.getenv("GIS_OPT_max_dist")
+    mem = os.getenv("GIS_OPT_mem")
+    refraction_coef = os.getenv("GIS_OPT_refraction_coef")
+    #assemble flag string
+    if os.getenv('GIS_FLAG_r') == '1':
+        f1 = "r"
+    else:
+        f1 = ""
+    if os.getenv('GIS_FLAG_c') == '1':
+        f2 = "c"
+    else:
+        f2 = ""
+    if os.getenv('GIS_FLAG_b') == '1':
+        f3 = "b"
+    else:
+        f3 = ""
+    if os.getenv('GIS_FLAG_e') == '1':
+        f4 = "e"
+    else:
+        f4 = ""
+    flagstring = f1 + f2 + f3 +f4
+    #read in info from the table of the vector sites map, and parse it into a list of lists of info for each site
+    s1 = grass.read_command("v.db.select", quiet = "True", map = vect, columns = xcol + "," + ycol + "," + namecol, fs = ",", nv = "False").strip()
+    masterlist = []
+    for item in s1.split("\n"):
+        masterlist.append(item.strip("\n").split(","))
+    #the first row is the column names, so pop that out of our master list
+    index = masterlist.pop(0)
+    #now, loop through the master list and run r.viewshed for each of the sites, and append the viewsheds to a list (so we can work with them later)
+    vshed_list = []
+    for site in masterlist:
+        grass.message('Calculating viewshed for location %s,%s (point name = %s)\n' % (site[0], site[1], site[2]))
+        tempry = "vshed_%s" % site[2]
+        vshed_list.append(tempry)
+        grass.run_command("r.viewshed", quiet = "True",  flags = flagstring,  input = elev, output = tempry, coordinate = site[0] + "," + site[1], obs_elev = obs_elev, tgt_elev = tgt_elev, max_dist = max_dist, mem = mem,  refraction_coef = refraction_coef)
+    #now make a mapcalc statement to add all the viewsheds together to make the outout cumulative viewsheds map
+    grass.message("Calculating \"Cumulative Viewshed\" map")
+    #grass.mapcalc("${output}=${command_string}", quiet = "True", output = out, command_string = ("+").join(vshed_list))
+    grass.run_command("r.series", quiet = "True", input = (",").join(vshed_list), output = out, method = "count")
+    #Clean up temporary maps, if requested
+    if os.getenv('GIS_FLAG_k') == '1':
+        grass.message("Temporary viewshed maps will not removed")
+    else:
+        grass.message("Removing temporary viewshed maps")
+        grass.run_command("g.remove",  quiet = "True",  rast = (",").join(vshed_list))
+    return
+    
+# here is where the code in "main" actually gets executed. This way of programming is neccessary for the way g.parser needs to run.
+if __name__ == "__main__":
+    if ( len(sys.argv) <= 1 or sys.argv[1] != "@ARGS_PARSED@" ):
+        os.execvp("g.parser", [sys.argv[0]] + sys.argv)
+    else:
+        main()
+
+
+
+
+


Property changes on: grass-addons/grass6/raster/r.viewshed.cva/r.viewshed.cva.py
___________________________________________________________________
Added: svn:executable
   + *



More information about the grass-commit mailing list