Changeset 44444
- Timestamp:
- Nov 27, 2010, 12:16:04 AM (14 years ago)
- File:
-
- 1 edited
-
grass/trunk/scripts/v.rast.stats/v.rast.stats.py (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
grass/trunk/scripts/v.rast.stats/v.rast.stats.py
r44443 r44444 4 4 # 5 5 # MODULE: v.rast.stats 6 # AUTHOR(S): Markus Neteler, converted to Python by Glynn Clements 6 # AUTHOR(S): Markus Neteler 7 # converted to Python by Glynn Clements 8 # speed up by Markus Metz 7 9 # PURPOSE: Calculates univariate statistics from a GRASS raster map 8 10 # only for areas covered by vector objects on a per-category base … … 79 81 80 82 def cleanup(): 81 grass.run_command('g.remove', rast = '%s_%s' % (vector, tmpname), quiet = True)83 grass.run_command('g.remove', rast = rastertmp, quiet = True) 82 84 grass.run_command('g.remove', rast = 'MASK', quiet = True, stderr = nuldev) 83 85 if mask_found: … … 88 90 89 91 def main(): 90 global tmp, sqltmp, tmpname, nuldev, vector, mask_found 92 global tmp, sqltmp, tmpname, nuldev, vector, mask_found, rastertmp 91 93 mask_found = False 92 94 #### setup temporary files … … 120 122 vector = vs[0] 121 123 122 #check the input raster map 124 rastertmp = "%s_%s" % (vector, tmpname) 125 126 # check the input raster map 123 127 if not grass.find_file(raster, 'cell')['file']: 124 128 grass.fatal(_("Raster map <%s> not found") % raster) 125 129 126 # check presence of raster MASK, put it aside130 # check presence of raster MASK, put it aside 127 131 mask_found = bool(grass.find_file('MASK', 'cell')['file']) 128 132 if mask_found: … … 130 134 grass.run_command('g.rename', rast = ('MASK', tmpname + "_origmask"), quiet = True) 131 135 132 #get RASTER resolution of map which we want to query: 133 #fetch separated to permit for non-square cells (latlong etc) 134 kv = grass.raster_info(map = raster) 135 nsres = kv['nsres'] 136 ewres = kv['ewres'] 137 138 #save current settings: 136 # save current settings: 139 137 grass.use_temp_region() 140 138 141 # Temporarily setting rasterresolution to $RASTER resolution142 # keep boundary settings143 grass.run_command('g.region', flags = 'a', nsres = nsres, ewres = ewres)144 145 # prepare raster MASK146 if grass.run_command('v.to.rast', input = vector, output = "%s_%s" % (vector, tmpname),139 # Temporarily aligning region resolution to $RASTER resolution 140 # keep boundary settings 141 grass.run_command('g.region', align = raster) 142 143 # prepare raster MASK 144 if grass.run_command('v.to.rast', input = vector, output = rastertmp, 147 145 use = 'cat', quiet = True) != 0: 148 146 grass.fatal(_("An error occurred while converting vector to raster")) 149 147 150 # dump cats to file to avoid "too many argument" problem:151 p = grass.pipe_command('r.category', map = '%s_%s' % (vector, tmpname), fs = ';', quiet = True)148 # dump cats to file to avoid "too many argument" problem: 149 p = grass.pipe_command('r.category', map = rastertmp, fs = ';', quiet = True) 152 150 cats = [] 153 151 for line in p.stdout: … … 155 153 p.wait() 156 154 157 #echo "List of categories found: $CATSLIST"158 155 number = len(cats) 159 156 if number < 1: 160 157 grass.fatal(_("No categories found in raster map")) 161 158 162 # check if DBF driver used, in this case cut to 10 chars col names:159 # check if DBF driver used, in this case cut to 10 chars col names: 163 160 try: 164 161 fi = grass.vector_db(map = vector)[int(layer)] … … 168 165 dbfdriver = fi['driver'] == 'dbf' 169 166 170 # Find out which table is linked to the vector map on the given layer167 # Find out which table is linked to the vector map on the given layer 171 168 if not fi['table']: 172 169 grass.fatal(_('There is no table connected to this map. Run v.db.connect or v.db.addtable first.')) … … 192 189 addcols = [] 193 190 for i in basecols + extracols: 194 # check if column already present191 # check if column already present 195 192 currcolumn = ("%s_%s" % (colprefix, i)) 196 193 if dbfdriver: … … 199 196 if currcolumn in grass.vector_columns(vector, layer).keys(): 200 197 if not flags['c']: 201 grass.fatal(( "Cannot create column <%s> (already present). "% currcolumn) +202 "Use -c flag to update values in this column.")198 grass.fatal((_("Cannot create column <%s> (already present). ") % currcolumn) + 199 _("Use -c flag to update values in this column.")) 203 200 else: 204 201 if i == "n": … … 213 210 grass.fatal(_("Adding columns failed. Exiting.")) 214 211 215 # loop over cats andcalculate statistics:212 # calculate statistics: 216 213 grass.message(_("Processing data (%d categories)...") % number) 217 214 218 215 # get rid of any earlier attempts 219 216 grass.try_remove(sqltmp) 217 218 colnames = [] 219 for var in basecols + extracols: 220 colname = '%s_%s' % (colprefix, var) 221 if dbfdriver: 222 colname = colname[:10] 223 colnames.append(colname) 224 225 ntabcols = len(colnames) 220 226 221 227 # do extended stats? … … 224 230 else: 225 231 extstat = "" 226 232 227 233 f = file(sqltmp, 'w') 228 currnum = 1 229 230 for i in cats: 231 grass.message(_("Processing category %s (%d/%d)...") % (i, currnum, number)) 232 grass.run_command('g.remove', rast = 'MASK', quiet = True, stderr = nuldev) 233 grass.mapcalc("MASK = if($name == $i, 1, null())", 234 name = "%s_%s" % (vector, tmpname), i = i) 235 236 #n, min, max, range, mean, stddev, variance, coeff_var, sum 237 # How to test r.univar $? exit status? using -e creates the real possibility of out-of-memory errors 238 s = grass.read_command('r.univar', flags = 'g' + extstat, map = raster, percentile = percentile) 239 vars = grass.parse_key_val(s) 240 241 vars['cf_var'] = vars['coeff_var'] 242 243 if flags['e'] and dbfdriver: 244 percvar = 'percentile_' + percentile 245 vars[perccol] = vars[percvar] 246 247 for var in basecols + extracols: 248 value = vars[var] 249 if value.lower() == 'nan': 234 235 # do the stats 236 p = grass.pipe_command('r.univar', flags = 't' + 'g' + extstat, map = raster, 237 zones = rastertmp, percentile = percentile, fs = ';') 238 239 first_line = 1 240 for line in p.stdout: 241 if first_line: 242 first_line = 0 243 continue 244 245 vars = line.rstrip('\r\n').split(';') 246 247 f.write("UPDATE %s SET" % fi['table']) 248 i = 2 249 first_var = 1 250 for colname in colnames: 251 value = vars[i] 252 # convert nan, +nan, -nan to NULL 253 if value.lower().endswith('nan'): 250 254 value = 'NULL' 251 colname = '%s_%s' % (colprefix, var) 252 if dbfdriver: 253 colname = colname[:10] 254 f.write("UPDATE %s SET %s=%s WHERE cat=%s;\n" % (fi['table'], colname, value, i)) 255 256 currnum += 1 257 255 if not first_var: 256 f.write(" , ") 257 else: 258 first_var = 0 259 f.write(" %s=%s" % (colname, value)) 260 i += 1 261 # skip n_null_cells, mean_of_abs, sum_of_abs 262 if i == 3 or i == 8 or i == 13: 263 i += 1 264 265 f.write(" WHERE %s=%s;\n" % (fi['key'], vars[0])) 266 267 p.wait() 258 268 f.close() 259 269 … … 261 271 exitcode = grass.run_command('db.execute', input = sqltmp, 262 272 database = fi['database'], driver = fi['driver']) 273 274 grass.run_command('g.remove', rast = 'MASK', quiet = True, stderr = nuldev) 275 276 if exitcode == 0: 277 grass.message((_("Statistics calculated from raster map <%s>") % raster) + 278 (_(" and uploaded to attribute table of vector map <%s>.") % vector)) 279 else: 280 grass.warning(_("Failed to upload statistics to attribute table of vector map <%s>.") % vector) 263 281 264 grass.run_command('g.remove', rast = 'MASK', quiet = True, stderr = nuldev)265 266 if exitcode == 0:267 grass.message(("Statistics calculated from raster map <%s>" % raster) +268 (" and uploaded to attribute table of vector map <%s>." % vector))269 282 270 283 sys.exit(exitcode)
Note:
See TracChangeset
for help on using the changeset viewer.
