[GRASS-SVN] r41168 - in grass/trunk/scripts: . d.vect.thematic
svn_grass at osgeo.org
svn_grass at osgeo.org
Tue Feb 23 13:32:27 EST 2010
Author: glynn
Date: 2010-02-23 13:32:26 -0500 (Tue, 23 Feb 2010)
New Revision: 41168
Added:
grass/trunk/scripts/d.vect.thematic/d.vect.thematic.py
Modified:
grass/trunk/scripts/Makefile
Log:
Convert d.vect.thematic to Python
Modified: grass/trunk/scripts/Makefile
===================================================================
--- grass/trunk/scripts/Makefile 2010-02-23 18:13:51 UTC (rev 41167)
+++ grass/trunk/scripts/Makefile 2010-02-23 18:32:26 UTC (rev 41168)
@@ -6,6 +6,7 @@
d.rast.edit \
d.rast.leg \
d.shadedmap \
+ d.vect.thematic \
db.dropcolumn \
db.droptable \
db.in.ogr \
@@ -65,7 +66,6 @@
v.krige \
wxpyimgview
-# d.vect.thematic \
# d.out.gpsdrive \
# r.mapcalculator \
# r3.mapcalculator \
Added: grass/trunk/scripts/d.vect.thematic/d.vect.thematic.py
===================================================================
--- grass/trunk/scripts/d.vect.thematic/d.vect.thematic.py (rev 0)
+++ grass/trunk/scripts/d.vect.thematic/d.vect.thematic.py 2010-02-23 18:32:26 UTC (rev 41168)
@@ -0,0 +1,1115 @@
+#!/usr/bin/env python
+#
+############################################################################
+#
+# MODULE: d.vect.thematic
+# AUTHOR(S): Michael Barton, Arizona State University with contributions
+# by Martin Landa, Jachym Cepicky, Daniel Calvelo Aros and Moritz Lennert
+# PURPOSE: Displays thematic vector map with graduated colors
+# or graduated points and line thickneses
+# COPYRIGHT: (C) 2006 by the GRASS Development Team
+#
+# This program is free software under the GNU General Public
+# License (>=v2). Read the file COPYING that comes with GRASS
+# for details.
+#
+#############################################################################
+
+
+#%Module
+#% description: Displays thematic vector map
+#% keywords: display, vector, thematic, legend
+#%End
+#%option
+#% guisection: Files
+#% key: map
+#% type: string
+#% gisprompt: old,vector,vector
+#% description: Name of vector map
+#% required : yes
+#%end
+#%option
+#% guisection: Theme
+#% key: type
+#% type: string
+#% description: Feature type
+#% options: area,point,centroid,line,boundary
+#% answer: area
+#% required : yes
+#%end
+#%option
+#% guisection: Theme
+#% key: column
+#% gisprompt: old_dbcolumn,dbcolumn,dbcolumn
+#% type: string
+#% description: Name of attribute column to use for thematic display (must be numeric)
+#% required : yes
+#%end
+#%option
+#% guisection: Theme
+#% key: themetype
+#% type: string
+#% options: graduated_colors,graduated_points,graduated_lines
+#% answer: graduated_colors
+#% description: Type of thematic display
+#% required : yes
+#%end
+#%option
+#% guisection: Theme
+#% key: themecalc
+#% type: string
+#% options: interval,std_deviation,quartiles,custom_breaks
+#% answer: interval
+#% description: Thematic divisions of data for display
+#% required : yes
+#%end
+#%option
+#% guisection: Theme
+#% key: breakpoints
+#% type: string
+#% label: Break points for custom breaks option
+#% description: Separate values by spaces (0 10 20 30 ...)
+#% required : no
+#%end
+#%option
+#% guisection: Theme
+#% key: layer
+#% type: integer
+#% gisprompt: old_layer,layer,layer
+#% description: Layer number
+#% answer: 1
+#% required : no
+#%end
+#%option
+#% guisection: Points
+#% key: icon
+#% type: string
+#% description: Vector point icon for point data
+#% options: basic/box,basic/circle,basic/cross2,basic/diamond,basic/star,basic/cross1,basic/x
+#% answer: basic/circle
+#% required : no
+#%end
+#%option
+#% guisection: Points
+#% key: size
+#% type: double
+#% label: Icon size for point data
+#% description: Minimum icon size/line width for graduated points/lines)
+#% answer: 5
+#% required : no
+#%end
+#%option
+#% guisection: Points
+#% key: maxsize
+#% type: double
+#% description: Maximum icon size/line width for graduated points and lines
+#% answer: 20
+#% required : no
+#%end
+#%option
+#% guisection: Theme
+#% key: nint
+#% type: integer
+#% description: Number of classes for interval theme (integer)
+#% answer: 4
+#% required : no
+#%end
+#%option
+#% guisection: Color
+#% key: colorscheme
+#% type: string
+#% label: Color scheme for graduated color mapping
+#% description: Select 'single_color' for graduated point/line display
+#% options: blue-red,red-blue,green-red,red-green,blue-green,green-blue,cyan-yellow,yellow-cyan,custom_gradient,single_color
+#% answer: blue-red
+#% required : yes
+#%end
+#% option
+#% guisection: Color
+#% key: pointcolor
+#% type: string
+#% label: Color for graduated points map
+#% description: GRASS named color or R:G:B triplet. Set color scheme to single color
+#% answer: 255:0:0
+#% required : no
+#%end
+#% option
+#% guisection: Color
+#% key: linecolor
+#% type: string
+#% label: Color for graduated lines or point/area outlines
+#% description: GRASS named color or R:G:B triplet. Set color scheme to single color.
+#% answer: 0:0:0
+#% required : no
+#%end
+#% option
+#% guisection: Color
+#% key: startcolor
+#% type: string
+#% label: Beginning color for custom color gradient
+#% description: Must be expressed as R:G:B triplet
+#% answer: 255:0:0
+#% required : no
+#%end
+#% option
+#% guisection: Color
+#% key: endcolor
+#% type: string
+#% label: Ending color for custom color gradient
+#% description: Must be expressed as R:G:B triplet
+#% answer: 0:0:255
+#% required : no
+#%end
+#% option
+#% guisection: Misc
+#% key: monitor
+#% type: string
+#% description: Select x11 display monitor for legend
+#% options: x0,x1,x2,x3,x4,x5,x6,none
+#% answer: x1
+#% required : no
+#%end
+#%flag
+#% guisection: Files
+#%key: g
+#%description: Save thematic map commands to group file for GIS Manager
+#%end
+#%option
+#% guisection: Theme
+#% key: where
+#% type: string
+#% description: WHERE conditions of SQL statement without 'where' keyword
+#% required : no
+#%end
+#%option
+#% guisection: Files
+#% key: psmap
+#% type: string
+#% label: Root for the name of psmap instruction files to be in current directory
+#% description: If not set, no psmap instruction files will be created)
+#% required : no
+#%end
+#%option
+#% guisection: Files
+#% key: group
+#% type: string
+#% gisprompt: new_file,file,group
+#% description: Name of group file where thematic map commands will be saved
+#% required : no
+#%end
+#%flag
+#% guisection: Theme
+#%key: l
+#%description: Create graphic legend in x11 display monitor
+#%end
+#%flag
+#% guisection: Color
+#% key: f
+#% description: Only draw fills (no outlines) for areas and points
+#%end
+#%flag
+#% guisection: Color
+#% key: u
+#% description: Update color values to GRASSRGB column in attribute table
+#%end
+#%flag
+#% guisection: Misc
+#%key: s
+#%description: Output legend for GIS Manager (for scripting use only)
+#%end
+#%flag
+#% guisection: Misc
+#%key: m
+#%description: Use math notation brackets in legend
+#%end
+
+import sys
+import os
+import string
+import shutil
+import atexit
+import grass.script as grass
+
+def cleanup():
+ for i in xrange(1,6+1):
+ grass.try_remove(tmpfile[i])
+ grass.try_remove(tmpfile[i] + ".sort")
+
+# hard-coded parameter: the maximum number of legend items before
+# we strip them using a middle ellipsis
+max_leg_items = 18
+
+def subs(vars, tmpl):
+ return string.Template(tmpl).substitute(vars)
+
+def msg(vars, tmpl):
+ grass.message(subs(vars, tmpl))
+
+def out(fh, vars, tmpl):
+ fh.write(subs(vars, tmpl))
+
+def main():
+ breakpoints = options['breakpoints']
+ colorscheme = options['colorscheme']
+ column = options['column']
+ endcolor = options['endcolor']
+ group = options['group']
+ layer = options['layer']
+ linecolor = options['linecolor']
+ map = options['map']
+ maxsize = options['maxsize']
+ monitor = options['monitor']
+ nint = options['nint']
+ pointcolor = options['pointcolor']
+ psmap = options['psmap']
+ size = options['size']
+ startcolor = options['startcolor']
+ themecalc = options['themecalc']
+ themetype = options['themetype']
+ type = options['type']
+ where = options['where']
+
+ flag_f = flags['f']
+ flag_g = flags['g']
+ flag_l = flags['l']
+ flag_m = flags['m']
+ flag_s = flags['s']
+ flag_u = flags['u']
+
+ # check column type
+ inf = grass.vector_columns(map, layer)
+ if column not in inf:
+ grass.fatal(_("No such column <%s>") % column)
+ coltype = inf[column]['type'].lower()
+
+ if coltype not in ["integer", "double precision"]:
+ grass.fatal(_("Column <%s> is of type <%s> which is not numeric.") % (column, coltype))
+
+ # create temporary file to hold d.graph commands for legend
+ tmp_graph = grass.tempfile()
+ # Create temporary file to commands for GIS Manager group
+ tmp_group = grass.tempfile()
+ # Create temporary file for commands for ps.map map file
+ tmp_psmap = grass.tempfile()
+ # Create temporary file for commands for ps.map legend file
+ tmp_psleg = grass.tempfile()
+ # create file to hold elements for GIS Manager legend
+ tmp_gisleg = grass.tempfile()
+
+ # Set display variables for group
+ atype = int(type == "area")
+ ptype = int(type == "point")
+ ctype = int(type == "centroid")
+ ltype = int(type == "line")
+ btype = int(type == "boundary")
+
+ # if running in the GUI, do not create a graphic legend in an xmon
+ if flag_s:
+ flag_l = False
+ # if running in GUI, turn off immediate mode rendering so that the
+ # iterated d.vect commands will composite using the display driver
+ os.environ['GRASS_PNG_READ'] = 'TRUE'
+ os.environ['GRASS_PNG_AUTO_WRITE'] = 'FALSE'
+
+ db = vector_db(map)[1]
+ if not db or not db['table']:
+ grass.fatal(_("No table connected or layer <%s> does not exist.") % layer)
+ table = db['table']
+ database = db['database']
+ driver = db['driver']
+
+ # update color values to the table?
+ if flag_u:
+ # test, if the column GRASSRGB is in the table
+ s = grass.read_command('db.columns', table = table, database = database, driver = driver)
+ if 'grassrgb' not in s.splitlines():
+ msg(locals(), _("Creating column 'grassrgb' in table <$table>"))
+ sql = "ALTER TABLE %s ADD COLUMN grassrgb varchar(11)" % table
+ grass.write_command('db.execute', database = database, driver = driver, stdin = sql)
+
+ # Group name
+ if not group:
+ group = "themes"
+
+ f_group = file(tmp_group, 'w')
+ f_group.write("Group %s\n" % group)
+
+ # Calculate statistics for thematic intervals
+ if type == "line":
+ stype = "line"
+ else:
+ stype = ["point", "centroid"]
+
+ if not where:
+ where = None
+
+ stats = grass.read_command('v.univar', flags = 'eg', map = map, type = stype, column = column, where = where)
+ stats = grass.parse_key_val(stats)
+
+ min = float(stats['min'])
+ max = float(stats['max'])
+ mean = float(stats['mean'])
+ sd = float(stats['population_stddev'])
+ q1 = float(stats['first_quartile'])
+ q2 = float(stats['median'])
+ q3 = float(stats['third_quartile'])
+ q4 = max
+
+ ptsize = size
+
+ if breakpoints and themecalc != "custom_breaks":
+ grass.warning(_("Custom breakpoints ignored due to themecalc setting."))
+
+ # set interval for each thematic map calculation type
+ if themecalc == "interval":
+ numint = nint
+ step = float(max - min) / numint
+ breakpoints = [min + i * step for i in xrange(numint + 1)]
+ annotations = ""
+ elif themecalc == "std_deviation":
+ # 2 standard deviation units on either side of mean,
+ # plus min to -2 sd units and +2 sd units to max, if applicable
+ breakpoints = [min] + [i for i in [(mean + i * sd) for i in [-2,-1,0,1,2]] if min < i < max] + [max]
+ annotations = [""] + [("%dsd" % i) for (i, j) in [(i, mean + i * sd) for i in [-2,-1,0,1,2]] if (min < j < max)] + [""]
+ annotations = ";".join(annotations)
+ numint = len(breakpoints) - 1
+ elif themecalc == "quartiles":
+ numint=4
+ # one for each quartile
+ breakpoints = [min, q1, q2, q3, max]
+ annotations = " %f; %f; %f; %f" % (q1, q2, q3, q4)
+ elif themecalc == "custom_breaks":
+ if not breakpoints:
+ breakpoints = sys.stdin.read()
+ breakpoints = [int(x) for x in breakpoints.split()]
+ numint = len(breakpoints) - 1
+ annotations = ""
+ else:
+ grass.fatal(_("Unknown themecalc type <%s>") % themecalc)
+
+ pointstep = float(maxsize - ptsize) / (numint - 1)
+
+ # Prepare legend cuts for too large numint
+ if numint > max_leg_items:
+ xupper = int(numint - max_leg_items / 2) + 1
+ xlower = int(max_leg_items / 2) + 1
+ else:
+ xupper = 0
+ xlower = 0
+
+ # legend title
+ f_graph = file(tmp_graph, 'w')
+ out(f_graph, locals(), """\
+color 0:0:0
+size 2 2
+move 1 95
+text Thematic map legend for column $column of map $map
+size 1.5 1.8
+move 4 90
+text Value range: $min - $max
+""")
+
+ f_gisleg = file(tmp_gisleg, 'w')
+ out(f_gisleg, locals(), """\
+title - - - {Thematic map legend for column $colum of map $map}
+""")
+
+ f_psleg = file(tmp_psleg, 'w')
+ out(f.psleg, locals(), """\
+text 1% 95% Thematic map legend for column $column of map $map
+ ref bottom left
+end
+text 4% 90% Value range: $min - $max
+ ref bottom left
+end
+""")
+
+ msg(locals(), _("Thematic map legend for column $column of map $map"))
+ msg(locals(), _("Value range: $min - $max"))
+
+ colorschemes = {
+ "blue-red": ("0:0:255", "255:0:0"),
+ "red-blue": ("255:0:0", "0:0:255"),
+ "green-red": ("0:255:0", "255:0:0"),
+ "red-green": ("255:0:0", "0:255:0"),
+ "blue-green": ("0:0:255", "0:255:0"),
+ "green-blue": ("0:255:0", "0:0:255"),
+ "cyan-yellow": ("0:255:255", "255:255:0"),
+ "yellow-cyan": ("255:255:0", "0:255:255"),
+ "custom_gradient": (startcolor, endcolor)
+ }
+
+ # graduated color thematic mapping
+ if themetype == "graduated_colors":
+ if colorscheme in colorschemes:
+ startc, endc = colorschemes[colorscheme]
+ # set color schemes for graduated color maps
+ elif colorscheme == "single_color":
+ if themetype == "graduated_points":
+ startc = endc = linecolor
+ else:
+ startc = endc = pointcolor
+ else:
+ grass.fatal(_("This should not happen: parser error. Unknown color scheme %s") % colorscheme)
+
+ color = startc.split(":")
+ endcolor = endc.split(":")
+
+ #The number of color steps is one less then the number of classes
+ nclrstep = numint - 1
+ clrstep = [(a - b) / nclrstep for a, b in zip(color, endcolor)]
+
+ themecolor = startc
+
+ # display graduated color themes
+ if themecalc == "interval":
+ out(f_graph, locals(), """\
+move 4 87
+text Mapped by $numint intervals of $step
+""")
+
+ out(f_gisleg, locals(), """\
+subtitle - - - {Mapped by $numint intervals of $step}
+""")
+
+ out(f.psleg, locals(), """\
+text 4% 87% Mapped by $numint intervals of $step
+ ref bottom left
+end
+""")
+
+ msg(locals(), _("Mapped by $numint intervals of $step"))
+
+ # display graduated color themes for standard deviation units
+ if themecalc == "std_deviation":
+ out(f_graph, locals(), """\
+move 4 87
+text Mapped by standard deviation units of $sd (mean = $mean)
+""")
+
+ out(f_gisleg, locals(), """\
+subtitle - - - {Mapped by standard deviation units of $sd (mean = $mean)}
+""")
+
+ out(f_psleg, locals(), """\
+text 4% 87% Mapped by standard deviation units of $sd (mean = $mean)
+ ref bottom left
+end
+""")
+
+ msg(locals(), _("Mapped by standard deviation units of $sd (mean = $mean)"))
+
+ # display graduated color themes for quartiles
+ if themecalc == "quartiles":
+ out(f_graph, locals(), """\
+move 4 87
+text Mapped by quartiles (median = $q2)
+""")
+
+ out(f_gisleg, locals(), """\
+subtitle - - - {Mapped by quartiles (median = $q2)}
+""")
+
+ out(f_psleg, locals(), """\
+text 4% 87% Mapped by quartiles (median = $q2)
+ ref bottom left
+end
+""")
+
+ msg(locals(), _("Mapped by quartiles (median = $q2)"))
+
+ f_graph.write("""\
+move 4 83
+text Color
+move 14 83
+text Value
+move 4 80
+text =====
+move 14 80
+text ============
+""")
+
+ f_psleg.write("""\
+text 4% 83% Color
+ ref bottom left
+end
+text 14% 83% Value
+ ref bottom left
+end
+text 4% 80% =====
+ ref bottom left
+end
+text 14% 80% ============
+ ref bottom left
+end
+""")
+
+ sys.stdout.write("Color(R:G:B)\tValue\n")
+ sys.stdout.write("============\t==========\n")
+
+ line1 = 78
+ line2 = 76
+ line3 = 75
+
+ i = 1
+ first = True
+
+ while i < numint:
+ if flag_m:
+ # math notation
+ if first:
+ closebracket = "]"
+ openbracket = "["
+ mincomparison = ">="
+ first = False
+ else:
+ closebracket = "]"
+ openbracket = "]"
+ mincomparison = ">"
+ else:
+ closebracket = ""
+ openbracket = ""
+ if first:
+ mincomparison = ">="
+ first = False
+ else:
+ mincomparison = ">"
+
+ themecolor = ":".join(color)
+ if flag_f:
+ linecolor = "none"
+ else:
+ if type in ["line", "boundary"]:
+ linecolor = themecolor
+ else:
+ linecolor = linecolor
+
+ rangemin = __builtins__.min(breakpoints)
+ rangemax = __builtins__.max(breakpoints)
+
+ if not annotations:
+ extranote = ""
+ else:
+ extranote = annotations[i]
+
+ if i < xlower or i >= xupper:
+ xline1 = line2 + 2
+ xline3 = line2 - 1
+ out(f_graph, locals(), """\
+color $themecolor
+polygon
+5 $xline1
+8 $xline1
+8 $xline3
+5 $xline3
+color $linecolor
+move 5 $xline1
+draw 8 $xline1
+draw 8 $xline3
+draw 5 $xline3
+draw 5 $xline1
+move 14 $line2
+color 0:0:0
+text $openbracket$rangemin - $rangemax$closebracket $extranote
+""")
+ else:
+ if i == xlower:
+ out(f_graph, locals(), """\
+color 0:0:0
+move 10 $line2
+text ...
+""")
+ else:
+ #undo next increment
+ line2 += 4
+
+ if i < xlower or i >= xupper:
+ out(f_gisleg, locals(), """\
+area $themecolor $linecolor - {$openbracket$rangemin - $rangemax$closebracket $extranote}
+""")
+
+ if type in ["line", "boundary"]:
+ out(f_psleg, locals(), """\
+line 5% $xline1% 8% $xline1%
+ color $linecolor
+end
+text 14% $xline1% $openbracket$rangemin - $rangemax$closebracket $extranote
+ ref center left
+end
+""")
+ elif type in ["point", "centroid"]:
+ out(f_psleg, locals(), """\
+point 8% $xline1%
+ color $linecolor
+ fcolor $themecolor
+ size $size
+ symbol $icon
+end
+text 14% $xline1% $openbracket$rangemin - $rangemax$closebracket $extranote
+ ref center left
+end
+""")
+ else:
+ out(f_psleg, locals(), """\
+rectangle 5% $xline1% 8% $xline3%
+ color 0:0:0
+ fcolor $themecolor
+end
+text 14% $xline3% $openbracket$rangemin - $rangemax$closebracket DCADCA $extranote
+ ref bottom left
+end
+""")
+ else:
+ if i == xlower:
+ out(f_psleg, locals(), """\
+color 0:0:0
+text 14% $xline3% ...
+ ref bottom left
+end
+""")
+
+ f_gisleg.write("text - - - {...}\n")
+
+ sys.stdout.write(subs(locals(), "$themecolor\t\t$openbracket$rangemin - $rangemax$closebracket $extranote"))
+ if not where:
+ sqlwhere = subs(locals(), "$column $mincomparison $rangemin AND $column <= $rangemax")
+ else:
+ sqlwhere = subs(locals(), "$column $mincomparison $rangemin AND $column <= $rangemax AND $where")
+
+ # update color to database?
+ if flag_u:
+ sql = subs(locals(), "UPDATE $table SET GRASSRGB = '$themecolor' WHERE $sqlwhere")
+ grass.write_command('db.execute', database = database, driver = driver, stdin = sql)
+
+ # Create group for GIS Manager
+ if flag_g:
+ # change rgb colors to hex
+ xthemecolor = "#%02X%02X%02X" % tuple(themecolor.split(":"))
+ #xlinecolor=`echo $linecolor | awk -F: '{printf("#%02X%02X%02X\n",$1,$2,$3)}'`
+
+ if "$linecolor" == "black":
+ xlinecolor = "#000000"
+ else:
+ xlinecolor = xthemecolor
+
+
+ # create group entry
+ out(f_group, locals(), """\
+ _check 1
+ Vector $column = $rangemin - $rangemax
+ _check 1
+ map $map
+ display_shape 1
+ display_cat 0
+ display_topo 0
+ display_dir 0
+ display_attr 0
+ type_point $ptype
+ type_line $ltype
+ type_boundary $btype
+ type_centroid $ctype
+ type_area $atype
+ type_face 0
+ color $xlinecolor
+ fcolor $xthemecolor
+ width $ptsize
+ _use_fcolor 1
+ lcolor #000000
+ sqlcolor 0
+ icon $icon
+ size $ptsize
+ field $layer
+ lfield $layer
+ attribute
+ xref left
+ yref center
+ lsize 8
+ cat
+ where $sqlwhere
+ _query_text 0
+ _query_edit 1
+ _use_where 1
+ minreg
+ maxreg
+ _width 0.1
+ End
+""")
+
+ # display theme vector map
+
+ grass.run_command('d.vect', map = map, type = type, layer = layer,
+ where = sqlwhere,
+ color = linecolor, fcolor = themecolor, icon = icon, size = ptsize)
+
+ f_psmap = file(tmp_psmap, 'w')
+ if type in ["line", "boundary"]:
+ out(f_psmap, locals(), """\
+vlines $map
+ type $type
+ layer $layer
+ where $sqlwhere
+ color $linecolor
+ label $rangemin - $rangemax
+end
+""")
+ elif type in ["point", "centroid"]:
+ out(f_psmap, locals(), """\
+vpoints $map
+ type $type
+ layer $layer
+ where $sqlwhere
+ color $linecolor
+ fcolor $themecolor
+ symbol $icon
+ label $rangemin - $rangemax
+end
+""")
+ else:
+ out(f_psmap, locals(), """\
+vareas $map
+ layer $layer
+ where $sqlwhere
+ color $linecolor
+ fcolor $themecolor
+ label $rangemin - $rangemax
+end
+""")
+
+ # increment for next theme
+ i += 1
+ if i == numint:
+ color = endcolor
+ else:
+ color = [a - b for a, b in zip(color, clrstep)]
+ line1 -= 4
+ line2 -= 4
+ line3 -= 4
+
+ #graduated points and line widths thematic mapping
+
+ if themetype in ["graduated_points", "graduated_lines"]:
+
+ #display graduated points/lines by intervals
+ if themecalc == "interval":
+ out(f_graph, locals(), """\
+move 4 87
+text Mapped by $numint intervals of $step
+""")
+
+ out(f_gisleg, locals(), """\
+subtitle - - - {Mapped by $numint intervals of $step}
+""")
+
+ out(f_psleg, locals(), """\
+text 4% 87% Mapped by $numint intervals of $step
+ ref bottom left
+end
+""")
+
+ msg(locals(), _("Mapped by $numint intervals of $step"))
+
+ # display graduated points/lines for standard deviation units
+ if themecalc == "std_deviation":
+
+ out(f_graph, locals(), """\
+move 4 87
+text Mapped by standard deviation units of $sd (mean = $mean)
+""")
+
+ out(f_gisleg, locals(), """\
+subtitle - - - {Mapped by standard deviation units of $sd (mean = $mean)}
+""")
+
+ out(f_psleg, locals(), """\
+text 4% 87% Mapped by standard deviation units of $sd (mean = $mean)
+ ref bottom left
+end
+""")
+
+ msg(locals(), _("Mapped by standard deviation units of $sd (mean = $mean)"))
+
+ # display graduated points/lines for quartiles
+ if themecalc == "quartiles":
+
+ out(f_graph, locals(), """\
+move 4 87
+text Mapped by quartiles (median = $q2)
+""")
+
+ out(f_gisleg, locals(), """\
+subtitle - - - {Mapped by quartiles (median = $q2)}
+""")
+
+ out(f_psleg, locals(), """\
+text 4% 87% Mapped by quartiles (median = $q2)
+ ref bottom left
+end
+""")
+
+ msg(locals(), _("Mapped by quartiles (median = $q2)"))
+
+ line1 = 76
+ line2 = 75
+
+ out(f_graph, locals(), """\
+move 4 83
+text Size/width
+move 25 83
+text Value
+move 4 80
+text ==============
+move 25 80
+text ==============
+""")
+
+ out(f_psleg, locals(), """\
+text 4% 83% Icon size
+ ref bottom left
+end
+text 25% 83% Value
+ ref bottom left
+end
+text 4% 80% ============
+ ref bottom left
+end
+text 25% 80% ============
+ ref bottom left
+end
+""")
+
+
+ sys.stdout.write("Size/width\tValue")
+ sys.stdout.write("==========\t=====")
+
+ themecolor = pointcolor
+
+ if flag_f:
+ linecolor = "none"
+
+ i = numint
+ ptsize = maxsize
+
+ while i >= 1:
+ if flag_m:
+ # math notation
+ if i == 1:
+ closebracket = "]"
+ openbracket = "["
+ mincomparison = ">="
+ else:
+ closebracket = "]"
+ openbracket = "]"
+ mincomparison = ">"
+ else:
+ closebracket = ""
+ openbracket = ""
+ if i == 1:
+ mincomparison = ">="
+ else:
+ mincomparison = ">"
+
+ themecolor = pointcolor
+
+ if flag_f:
+ linecolor = "none"
+
+ rangemin = __builtins__.min(breakpoints)
+ rangemax = __builtins__.max(breakpoints)
+
+ if not annotations:
+ extranote = ""
+ else:
+ extranote = annotations[i]
+
+ iconsize = int(ptsize / 2)
+ lineht = int(ptsize / 4)
+ if lineht < 4:
+ lineht = 4
+
+ if i < xlower or i >= xupper:
+ if themetype == graduated_lines:
+ out(f_graph, locals(), """\
+color $linecolor
+""")
+
+ out(f_gisleg, locals(), """\
+line $themecolor $linecolor $ptsize {$openbracket$rangemin - $rangemax$closebracket $extranote}
+""")
+ else:
+ out(f_graph, locals(), """\
+color $themecolor
+""")
+ out(f_gisleg, locals(), """\
+point $themecolor $linecolor $ptsize {$openbracket$rangemin - $rangemax$closebracket $extranote}
+""")
+
+ out(f_graph, locals(), """\
+icon + $iconsize 5 $line1
+color 0:0:0
+move 10 $line2
+text $ptsize pts
+move 25 $line2
+text $openbracket$rangemin - $rangemax$closebracket $extranote
+""")
+ else:
+ if i == xlower:
+ out(f_graph, locals(), """\
+color 0:0:0
+move 10 $line2
+text ...
+""")
+
+ out(f_gisleg, locals(), """\
+text - - - ...
+""")
+ else:
+ # undo future line increment
+ line2 += lineht
+
+ if i < xlower or i >= xupper:
+ out(f_psleg, locals(), """\
+point 8% $line1%
+ color $linecolor
+ fcolor $themecolor
+ size $iconsize
+ symbol $icon
+end
+text 25% $line1% $openbracket$rangemin - $rangemax$closebracket $extranote
+ ref center left
+end
+""")
+ else:
+ if i == xlower:
+ out(f_psleg, locals(), """\
+text 25% $xline1% ...
+ ref center left
+end
+""")
+
+ sys.stdout.write(subs(locals(), "$ptsize\t\t$openbracket$rangemin - $rangemax$closebracket $extranote"))
+
+ if not where:
+ sqlwhere = subs(locals(), "$column $mincomparison $rangemin AND $column <= $rangemax")
+ else:
+ sqlwhere = subs(locals(), "$column $mincomparison $rangemin AND $column <= $rangemax AND $where")
+
+ # update color to database?
+ if flag_u:
+ sql = subs(locals(), "UPDATE $table SET grassrgb = '$themecolor' WHERE $sqlwhere")
+ grass.write_command('db.execute', database = database, driver = driver, stdin = sql)
+
+ # Create group for GIS Manager
+ if flag_g:
+ # change rgb colors to hex
+ xthemecolor = "#%02X%02X%02X" % tuple(themecolor.split(":"))
+ xlinecolor = "#000000"
+
+ # create group entry
+ out(f_group, locals(), """\
+ _check 1
+ Vector $column = $rangemin - $rangemax
+ _check 1
+ map $map
+ display_shape 1
+ display_cat 0
+ display_topo 0
+ display_dir 0
+ display_attr 0
+ type_point $ptype
+ type_line $ltype
+ type_boundary $btype
+ type_centroid $ctype
+ type_area $atype
+ type_face 0
+ color $xlinecolor
+ width $ptsize
+ fcolor $xthemecolor
+ _use_fcolor 1
+ lcolor #000000
+ sqlcolor 0
+ icon $icon
+ size $ptsize
+ field $layer
+ lfield $layer
+ attribute
+ xref left
+ yref center
+ lsize 8
+ cat
+ where $sqlwhere
+ _query_text 0
+ _query_edit 1
+ _use_where 1
+ minreg
+ maxreg
+ _width 0.1
+ End
+""")
+
+ #graduates line widths or point sizes
+
+ if themetype == "graduated_lines":
+ grass.run_command('d.vect', map = map, type = type, layer = layer,
+ where = sqlwhere,
+ color = linecolor, fcolor = themecolor, icon = icon, size = ptsize,
+ width = ptsize)
+
+ else:
+ grass.run_command('d.vect', map = map, type = type, layer = layer,
+ where = sqlwhere,
+ color = linecolor, fcolor = themecolor, icon = icon, size = ptsize)
+
+ out(f_psmap, locals(), """\
+vpoints $map
+ type $type
+ layer $layer
+ where $sqlwhere
+ color $linecolor
+ fcolor $themecolor
+ symbol $icon
+ size $ptsize
+ label $rangemin - $rangemax
+end
+""")
+
+ ptsize -= pointstep
+
+ line1 -= lineht
+ line2 -= lineht
+ i -= 1
+
+ # Create graphic legend
+ f_graph.close()
+ if flag_l:
+ grass.run_command('d.erase')
+ grass.run_command('d.graph', input = tmp_graph)
+
+ # Create group file for GIS Manager
+ f_group.write("End\n")
+ f_group.close()
+ if flag_g:
+ shutil.copyfile(tmp_group, "%s.dm" % group)
+
+ # Create ps.map map file
+ f_psmap.write("end\n")
+ f_psmap.close()
+ if psmap:
+ shutil.copyfile(tmp_psmap, "%s.psmap" % psmap)
+
+ # Create ps.map legend file
+ f_psleg.write("end\n")
+ f_psleg.close()
+ if psmap:
+ shutil.copyfile(tmp_psleg, "%s_legend.psmap" % psmap)
+
+ # Create text file to use with d.graph in GIS Manager
+ f_gisleg.close()
+ if flag_s:
+ tmpdir = os.path.dirname(tmp_gisleg)
+ tlegfile = os.path.join(tmpdir, "gismlegend.txt")
+ shutil.copyfile(tmp_gisleg, tlegfile)
+
+if __name__ == "__main__":
+ options, flags = grass.parser()
+ atexit.register(cleanup)
+ main()
More information about the grass-commit
mailing list