4 @brief Rendering map layers and overlays into map composition image.
12 (C) 2006-2011 by the GRASS Development Team
14 This program is free software under the GNU General Public License
15 (>=v2). Read the file COPYING that comes with GRASS for details.
17 @author Michael Barton
18 @author Jachym Cepicky
19 @author Martin Landa <landa.martin gmail.com>
31 from wx.lib.newevent
import NewEvent
35 from core
import utils
36 from core.gcmd import GException, GError, RunCommand
40 wxUpdateProgressBar, EVT_UPDATE_PRGBAR = NewEvent()
49 """!Virtual class which stores information about layers (map layers and
50 overlays) of the map composition.
52 For map layer use MapLayer class.
53 For overlays use Overlay class.
55 def __init__(self, type, cmd, name = None,
56 active =
True, hidden =
False, opacity = 1.0):
58 @todo pass cmd as tuple instead of list
60 @param type layer type ('raster', 'vector', 'overlay', 'command', etc.)
61 @param cmd GRASS command to render layer,
62 given as list, e.g. ['d.rast', 'map=elevation@PERMANENT']
63 @param name layer name, e.g. 'elevation@PERMANENT' (for layer tree)
64 @param active layer is active, will be rendered only if True
65 @param hidden layer is hidden, won't be listed in Layer Manager if True
66 @param opacity layer opacity <0;1>
71 if self.
type ==
'command':
84 Debug.msg (3,
"Layer.__init__(): type=%s, cmd='%s', name=%s, " \
85 "active=%d, opacity=%d, hidden=%d" % \
90 self.
gtemp = tempfile.mkstemp()[1]
92 if self.
type ==
'overlay':
98 Debug.msg (3,
"Layer.__del__(): layer=%s, cmd='%s'" %
102 """!Render layer to image
104 @return rendered image filename
105 @return None on error
111 if self.
type ==
'3d-raster':
114 Debug.msg (3,
"Layer.Render(): type=%s, name=%s" % \
118 layertypes = (
'raster',
'rgb',
'his',
'shaded',
'rastarrow',
'rastnum',
119 'vector',
'thememap',
'themechart',
120 'grid',
'geodesic',
'rhumb',
'labels',
121 'command',
'rastleg',
124 if self.
type not in layertypes:
125 raise GException(_(
"<%(name)s>: layer type <%(type)s> is not supported") % \
126 {
'type' : self.
type,
'name' : self.
name})
129 if UserSettings.Get(group=
'display', key=
'driver', subkey=
'type') ==
'cairo':
137 self.
gtemp = tempfile.mkstemp()[1]
139 if self.
type ==
'overlay':
145 os.environ[
"GRASS_CAIROFILE"] = self.
mapfile
148 self.
gtemp = tempfile.mkstemp()[1]
150 if self.
type ==
'overlay':
156 os.environ[
"GRASS_PNGFILE"] = self.
mapfile
160 if self.
type ==
'command':
170 os.environ[
"GRASS_PNG_READ"] =
"TRUE"
172 os.environ[
"GRASS_PNG_READ"] =
"FALSE"
180 sys.stderr.write(_(
"Command '%s' failed\n") % self.
GetCmd(string =
True))
182 sys.stderr.write(_(
"Details: %s\n") % msg)
190 os.remove(self.
gtemp)
191 except (OSError, TypeError):
197 if UserSettings.Get(group=
'display', key=
'driver', subkey=
'type') ==
'cairo':
200 del os.environ[
"GRASS_CAIROFILE"]
201 elif "GRASS_PNGFILE" in os.environ:
202 del os.environ[
"GRASS_PNGFILE"]
209 """!Get GRASS command as list of string.
211 @param string get command as string if True otherwise as list
213 @return command list/string
216 if self.
type ==
'command':
221 return ';'.join(scmd)
228 """!Get map layer type"""
232 """!Get map element type"""
233 if self.
type ==
'raster':
239 Get layer opacity level
241 @param float get opacity level in <0,1> otherwise <0,100>
243 @return opacity level
248 return int (self.
opacity * 100)
251 """!Get map layer name
253 @param fullyQualified True to return fully qualified name as a
254 string 'name@mapset' otherwise directory { 'name', 'mapset' }
257 @return string / directory
263 return {
'name' : self.name.split(
'@')[0],
264 'mapset' : self.name.split(
'@')[1] }
266 return {
'name' : self.
name,
270 """!Check if layer is activated for rendering"""
274 """!Set layer type"""
275 if type
not in (
'raster',
'3d-raster',
'vector',
276 'overlay',
'command',
277 'shaded',
'rgb',
'his',
'rastarrow',
'rastnum',
278 'thememap',
'themechart',
'grid',
'labels',
280 raise GException(_(
"Unsupported map layer type '%s'") % type)
285 """!Set layer name"""
289 """!Active or deactive layer"""
290 self.
active = bool(enable)
293 """!Hide or show map layer in Layer Manager"""
294 self.
hidden = bool(enable)
297 """!Set opacity value"""
306 """!Set new command for layer"""
307 if self.
type ==
'command':
313 Debug.msg(3,
"Layer.SetCmd(): cmd='%s'" % self.
GetCmd(string =
True))
319 def __init__(self, type, cmd, name = None,
320 active =
True, hidden =
False, opacity = 1.0):
321 """!Represents map layer in the map canvas
323 @param type layer type ('raster', 'vector', 'command', etc.)
324 @param cmd GRASS command to render layer,
325 given as list, e.g. ['d.rast', 'map=elevation@PERMANENT']
326 @param name layer name, e.g. 'elevation@PERMANENT' (for layer tree) or None
327 @param active layer is active, will be rendered only if True
328 @param hidden layer is hidden, won't be listed in Layer Manager if True
329 @param opacity layer opacity <0;1>
331 Layer.__init__(self, type, cmd, name,
332 active, hidden, opacity)
335 """!Get mapset of map layer
338 @return '' on error (no name given)
344 return self.name.split(
'@')[1]
350 active =
True, hidden =
True, opacity = 1.0):
351 """!Represents overlay displayed in map canvas
353 @param id overlay id (for PseudoDC)
354 @param type overlay type ('barscale', 'legend', etc.)
355 @param cmd GRASS command to render overlay,
356 given as list, e.g. ['d.legend', 'map=elevation@PERMANENT']
357 @param active layer is active, will be rendered only if True
358 @param hidden layer is hidden, won't be listed in Layer Manager if True
359 @param opacity layer opacity <0;1>
361 Layer.__init__(self,
'overlay', cmd, type,
362 active, hidden, opacity)
367 """!Map composition (stack of map layers and overlays)
389 self.
mapfile = tempfile.mkstemp(suffix =
'.ppm')[1]
395 os.environ[
"GRASS_TRANSPARENT"] =
"TRUE"
396 os.environ[
"GRASS_BACKGROUNDCOLOR"] =
"ffffff"
401 def _runCommand(self, cmd, **kwargs):
402 """!Run command in environment defined by self.gisrc if
405 gisrc_orig = os.getenv(
"GISRC")
407 os.environ[
"GISRC"] = self.
gisrc
413 os.environ[
"GISRC"] = gisrc_orig
417 def _initGisEnv(self):
418 """!Stores GRASS variables (g.gisenv) to self.env variable
420 if not os.getenv(
"GISBASE"):
421 sys.exit(_(
"GISBASE not set. You must be in GRASS GIS to run this program."))
426 """!Get projection info"""
430 """!Return region projection and map units information
433 if not grass.find_program(
'g.proj', [
'--help']):
434 sys.exit(_(
"GRASS module '%s' not found. Unable to start map "
435 "display window.") %
'g.proj')
437 ret = self.
_runCommand(RunCommand, prog =
'g.proj',
438 read =
True, flags =
'p')
443 for line
in ret.splitlines():
445 key, val = map(
lambda x: x.strip(), line.split(
':'))
449 elif "XY location (unprojected)" in line:
450 projinfo[
'proj'] =
'xy'
451 projinfo[
'units'] =
''
457 """!Read WIND file and set up self.wind dictionary"""
459 filename = os.path.join (self.
env[
'GISDBASE'],
460 self.
env[
'LOCATION_NAME'],
464 windfile = open (filename,
"r")
466 sys.exit(_(
"Error: Unable to open '%(file)s'. Reason: %(ret)s. wxGUI exited.\n") % \
467 {
'file' : filename,
'ret' : e})
469 for line
in windfile.readlines():
471 key, value = line.split(
":", 1)
472 self.
wind[key.strip()] = value.strip()
479 """!Adjusts display resolution to match monitor size in
480 pixels. Maintains constant display resolution, not related to
481 computational region. Do NOT use the display resolution to set
482 computational resolution. Set computational resolution through
494 Debug.msg (3,
"Map.AdjustRegion(): %s" % self.
region)
499 """!Sets display extents to even multiple of current
500 resolution defined in WIND file from SW corner. This must be
501 done manually as using the -a flag can produce incorrect
514 n = float(self.
region[
'n'])
515 s = float(self.
region[
's'])
516 e = float(self.
region[
'e'])
517 w = float(self.
region[
'w'])
520 new[
'rows'] = math.fabs(
round((n-s)/nsres))
521 new[
'cols'] = math.fabs(
round((e-w)/ewres))
524 new[
's'] = nsres *
round(s / nsres)
525 new[
'w'] = ewres *
round(w / ewres)
526 new[
'n'] = new[
's'] + (new[
'rows'] * nsres)
527 new[
'e'] = new[
'w'] + (new[
'cols'] * ewres)
532 """!Align region extent based on display size from center
536 res = self.
region[
"ewres"]
538 res = self.
region[
"nsres"]
540 Debug.msg(3,
"Map.AlignExtentFromDisplay(): width=%d, height=%d, res=%f, center=%f,%f" % \
542 self.
region[
'center_northing']))
544 ew = (self.
width / 2) * res
545 ns = (self.
height / 2) * res
558 """!Change size of rendered map.
560 @param width,height map size
562 @return True on success
563 @return False on failure
568 Debug.msg(2,
"Map.ChangeMapSize(): width=%d, height=%d" % \
576 def GetRegion(self, rast = [], zoom = False, vect = [], regionName = None,
577 n =
None, s =
None, e =
None, w =
None, default =
False,
579 """!Get region settings (g.region -upgc)
581 Optionally extent, raster or vector map layer can be given.
583 @param rast list of raster maps
584 @param zoom zoom to raster map (ignore NULLs)
585 @param vect list of vector maps
586 @param regionName named region or None
587 @param n,s,e,w force extent
588 @param default force default region settings
589 @param update if True update current display region settings
591 @return region settings as directory, e.g. {
592 'n':'4928010', 's':'4913700', 'w':'589980',...}
594 @see GetCurrentRegion()
598 tmpreg = os.getenv(
"GRASS_REGION")
600 del os.environ[
"GRASS_REGION"]
603 gisrc_orig = os.getenv(
"GISRC")
605 os.environ[
"GISRC"] = self.
gisrc
609 cmd[
'flags'] =
'ugpc'
615 cmd[
'region'] = regionName
628 cmd[
'zoom'] = rast[0]
630 cmd[
'rast'] =
','.join(rast)
633 cmd[
'vect'] =
','.join(vect)
642 message = _(
"Unable to zoom to raster map <%s>.") % rast[0] + \
643 "\n\n" + _(
"Details:") +
" %s" % msg
645 message = _(
"Unable to zoom to vector map <%s>.") % vect[0] + \
646 "\n\n" + _(
"Details:") +
" %s" % msg
648 message = _(
"Unable to get current geographic extent. "
649 "Force quiting wxGUI. Please manually run g.region to "
654 for r
in reg.splitlines():
655 key, val = r.split(
"=", 1)
657 region[key] = float(val)
663 os.environ[
"GISRC"] = gisrc_orig
667 os.environ[
"GRASS_REGION"] = tmpreg
669 Debug.msg (3,
"Map.GetRegion(): %s" % region)
677 """!Get current display region settings
684 """!Render string for GRASS_REGION env. variable, so that the
685 images will be rendered from desired zoom level.
687 @param windres uses resolution from WIND file rather than
688 display (for modules that require set resolution like
691 @return String usable for GRASS_REGION variable or None
697 region = copy.copy(self.
region)
698 for key
in (
'nsres',
'ewres',
'cells'):
699 region[key] = compRegion[key]
706 for key
in self.wind.keys():
708 grass_region +=
"north: %s; " % \
712 grass_region +=
"south: %s; " % \
716 grass_region +=
"east: %s; " % \
720 grass_region +=
"west: %s; " % \
723 elif key ==
"e-w resol":
724 grass_region +=
"e-w resol: %f; " % \
727 elif key ==
"n-s resol":
728 grass_region +=
"n-s resol: %f; " % \
734 grass_region +=
'cols: %d; ' % \
740 grass_region +=
'rows: %d; ' % \
744 grass_region += key +
": " + self.
wind[key] +
"; "
746 Debug.msg (3,
"Map.SetRegion(): %s" % grass_region)
753 def GetListOfLayers(self, l_type = None, l_mapset = None, l_name = None,
754 l_active =
None, l_hidden =
None):
755 """!Returns list of layers of selected properties or list of
758 @param l_type layer type, e.g. raster/vector/wms/overlay (value or tuple of values)
759 @param l_mapset all layers from given mapset (only for maplayers)
760 @param l_name all layers with given name
761 @param l_active only layers with 'active' attribute set to True or False
762 @param l_hidden only layers with 'hidden' attribute set to True or False
764 @return list of selected layers
768 if type(l_type) == types.StringType:
773 if one_type
and l_type ==
'overlay':
782 if one_type
and layer.type != l_type:
784 elif not one_type
and layer.type
not in l_type:
788 if (l_mapset !=
None and l_type !=
'overlay')
and \
789 layer.GetMapset() != l_mapset:
793 if l_name !=
None and layer.name != l_name:
797 if l_active !=
None and \
799 if layer.active == l_active
and \
800 layer.hidden == l_hidden:
801 selected.append(layer)
804 elif l_active !=
None:
805 if layer.active == l_active:
806 selected.append(layer)
809 elif l_hidden !=
None:
810 if layer.hidden == l_hidden:
811 selected.append(layer)
815 selected.append(layer)
817 Debug.msg (3,
"Map.GetListOfLayers(): numberof=%d" % len(selected))
821 def _renderLayers(self, force, mapWindow, maps, masks, opacities):
826 if layer ==
None or layer.active ==
False:
831 layer.force_render
or \
832 layer.mapfile ==
None or \
833 (
not os.path.isfile(layer.mapfile)
or not os.path.getsize(layer.mapfile)):
834 if not layer.Render():
840 event = wxUpdateProgressBar(value = ilayer)
841 wx.PostEvent(mapWindow, event)
844 if layer.type !=
"overlay":
845 maps.append(layer.mapfile)
846 masks.append(layer.maskfile)
847 opacities.append(str(layer.opacity))
849 Debug.msg (3,
"Map.Render() type=%s, layer=%s " % (layer.type, layer.name))
852 def Render(self, force = False, mapWindow = None, windres = False):
853 """!Creates final image composite
855 This function can conditionaly use high-level tools, which
856 should be avaliable in wxPython library
858 @param force force rendering
859 @param reference for MapFrame instance (for progress bar)
860 @param windres use region resolution (True) otherwise display resolution
862 @return name of file with rendered image or None
870 gisrc_orig = os.getenv(
"GISRC")
872 os.environ[
"GISRC"] = self.
gisrc
874 tmp_region = os.getenv(
"GRASS_REGION")
875 os.environ[
"GRASS_REGION"] = self.
SetRegion(windres)
876 os.environ[
"GRASS_WIDTH"] = str(self.
width)
877 os.environ[
"GRASS_HEIGHT"] = str(self.
height)
878 if UserSettings.Get(group=
'display', key=
'driver', subkey=
'type') ==
'cairo':
879 os.environ[
"GRASS_AUTO_WRITE"] =
"TRUE"
880 if "GRASS_RENDER_IMMEDIATE" in os.environ:
881 del os.environ[
"GRASS_RENDER_IMMEDIATE"]
882 os.environ[
"GRASS_RENDER_IMMEDIATE"] =
"TRUE"
884 os.environ[
"GRASS_PNG_AUTO_WRITE"] =
"TRUE"
885 os.environ[
"GRASS_PNG_READ"] =
"FALSE"
886 os.environ[
"GRASS_PNG_COMPRESSION"] =
"0"
887 os.environ[
"GRASS_TRUECOLOR"] =
"TRUE"
888 os.environ[
"GRASS_RENDER_IMMEDIATE"] =
"TRUE"
893 if sys.platform !=
'win32':
894 mapstr =
",".join(maps)
895 maskstr =
",".join(masks)
900 mapstr += item.replace(
'\\',
'/')
901 mapstr = mapstr.rstrip(
',')
904 maskstr += item.replace(
'\\',
'/')
905 maskstr = maskstr.rstrip(
',')
906 mapoutstr = self.mapfile.replace(
'\\',
'/')
909 bgcolor =
':'.join(map(str, UserSettings.Get(group =
'display', key =
'bgcolor',
914 os.environ[
"GRASS_REGION"] = tmp_region
916 del os.environ[
"GRASS_REGION"]
922 input =
'%s' %
",".join(maps),
923 mask =
'%s' %
",".join(masks),
924 opacity =
'%s' %
",".join(opacities),
925 background = bgcolor,
931 print >> sys.stderr, _(
"ERROR: Rendering failed. Details: %s") % msg
935 Debug.msg (3,
"Map.Render() force=%s file=%s" % (force, self.
mapfile))
939 os.environ[
"GISRC"] = gisrc_orig
947 def AddLayer(self, type, command, name = None,
948 l_active =
True, l_hidden =
False, l_opacity = 1.0, l_render =
False,
950 """!Adds generic map layer to list of layers
952 @param type layer type ('raster', 'vector', etc.)
953 @param command GRASS command given as list
954 @param name layer name
955 @param l_active layer render only if True
956 @param l_hidden layer not displayed in layer tree if True
957 @param l_opacity opacity level range from 0(transparent) - 1(not transparent)
958 @param l_render render an image if True
959 @param pos position in layer list (-1 for append)
961 @return new layer on success
962 @return None on failure
966 if l_opacity < 0: l_opacity = 0
967 elif l_opacity > 1: l_opacity = 1
968 layer =
MapLayer(type = type, name = name, cmd = command,
969 active = l_active, hidden = l_hidden, opacity = l_opacity)
973 self.layers.insert(pos, layer)
975 self.layers.append(layer)
977 Debug.msg (3,
"Map.AddLayer(): layer=%s" % layer.name)
979 if not layer.Render():
980 raise GException(_(
"Unable to render map layer <%s>.") % name)
987 """!Removes layer from list of layers
989 @param layer layer instance in layer tree
990 @param overlay delete overlay (use self.DeleteOverlay() instead)
992 @return removed layer on success or None
994 Debug.msg (3,
"Map.DeleteLayer(): name=%s" % layer.name)
1003 base = os.path.split(layer.mapfile)[0]
1004 mapfile = os.path.split(layer.mapfile)[1]
1005 tempbase = mapfile.split(
'.')[0]
1006 if base ==
'' or tempbase ==
'':
1008 basefile = os.path.join(base, tempbase) +
r'.*'
1009 for f
in glob.glob(basefile):
1018 """!Reorder list to match layer tree
1020 @param layerList list of layers
1025 for layer
in self.
layers:
1027 layerNameList += layer.name +
','
1028 Debug.msg (4,
"Map.ReoderLayers(): layers=%s" % \
1032 """!Change map layer properties
1034 @param layer map layer instance
1035 @param type layer type ('raster', 'vector', etc.)
1036 @param command GRASS command given as list
1037 @param name layer name
1038 @param active layer render only if True
1039 @param hidden layer not displayed in layer tree if True
1040 @param opacity opacity level range from 0(transparent) - 1(not transparent)
1041 @param render render an image if True
1043 Debug.msg (3,
"Map.ChangeLayer(): layer=%s" % layer.name)
1046 layer.SetType(kargs[
'type'])
1048 if 'command' in kargs:
1049 layer.SetCmd(kargs[
'command'])
1052 layer.SetName(kargs[
'name'])
1054 if 'active' in kargs:
1055 layer.SetActive(kargs[
'active'])
1057 if 'hidden' in kargs:
1058 layer.SetHidden(kargs[
'hidden'])
1060 if 'opacity' in kargs:
1061 layer.SetOpacity(kargs[
'opacity'])
1063 if render
and not layer.Render():
1064 raise GException(_(
"Unable to render map layer <%s>.") %
1070 """!Changes opacity value of map layer
1072 @param layer layer instance in layer tree
1073 @param l_opacity opacity level <0;1>
1076 if l_opacity < 0: l_opacity = 0
1077 elif l_opacity > 1: l_opacity = 1
1079 layer.opacity = l_opacity
1080 Debug.msg (3,
"Map.ChangeOpacity(): layer=%s, opacity=%f" % \
1081 (layer.name, layer.opacity))
1084 """!Enable or disable map layer
1086 @param layer layer instance in layer tree
1087 @param active to be rendered (True)
1089 layer.active = active
1091 Debug.msg (3,
"Map.ChangeLayerActive(): name='%s' -> active=%d" % \
1092 (layer.name, layer.active))
1095 """!Change name of the layer
1097 @param layer layer instance in layer tree
1098 @param name layer name to set up
1100 Debug.msg (3,
"Map.ChangeLayerName(): from=%s to=%s" % \
1105 """!Removes layer from layer list
1107 Layer is defined by name@mapset or id.
1109 @param name layer name (must be unique)
1110 @param id layer index in layer list
1112 @return removed layer on success
1113 @return None on failure
1118 for layer
in self.
layers:
1119 if layer.name == name:
1121 os.remove(layer.mapfile)
1122 os.remove(layer.maskfile)
1123 self.layers.remove(layer)
1127 return self.layers.pop(id)
1132 """!Get index of layer in layer list.
1134 @param layer layer instace in layer tree
1135 @param overlay use list of overlays instead
1138 @return -1 if layer not found
1146 return list.index(layer)
1151 l_active =
True, l_hidden =
True, l_opacity = 1.0, l_render =
False):
1152 """!Adds overlay (grid, barscale, legend, etc.) to list of
1155 @param id overlay id (PseudoDC)
1156 @param type overlay type (barscale, legend)
1157 @param command GRASS command to render overlay
1158 @param l_active overlay activated (True) or disabled (False)
1159 @param l_hidden overlay is not shown in layer tree (if True)
1160 @param l_render render an image (if True)
1162 @return new layer on success
1163 @retutn None on failure
1165 Debug.msg (2,
"Map.AddOverlay(): cmd=%s, render=%d" % (command, l_render))
1166 overlay =
Overlay(id = id, type = type, cmd = command,
1167 active = l_active, hidden = l_hidden, opacity = l_opacity)
1170 self.overlays.append(overlay)
1172 if l_render
and command !=
'' and not overlay.Render():
1173 raise GException(_(
"Unable to render overlay <%s>.") %
1179 """!Change overlay properities
1181 Add new overlay if overlay with 'id' doesn't exist.
1183 @param id overlay id (PseudoDC)
1184 @param type overlay type (barscale, legend)
1185 @param command GRASS command to render overlay
1186 @param l_active overlay activated (True) or disabled (False)
1187 @param l_hidden overlay is not shown in layer tree (if True)
1188 @param l_render render an image (if True)
1190 @return new layer on success
1194 overlay =
Overlay(id, type =
None, cmd =
None)
1197 overlay.SetName(kargs[
'type'])
1199 if 'command' in kargs:
1200 overlay.SetCmd(kargs[
'command'])
1202 if 'active' in kargs:
1203 overlay.SetActive(kargs[
'active'])
1205 if 'hidden' in kargs:
1206 overlay.SetHidden(kargs[
'hidden'])
1208 if 'opacity' in kargs:
1209 overlay.SetOpacity(kargs[
'opacity'])
1211 if render
and overlay.GetCmd() != []
and not overlay.Render():
1212 raise GException(_(
"Unable to render overlay <%s>.") %
1218 """!Return overlay(s) with 'id'
1220 @param id overlay id
1221 @param list return list of overlays of True
1222 otherwise suppose 'id' to be unique
1224 @return list of overlays (list=True)
1225 @return overlay (list=False)
1226 @retur None (list=False) if no overlay or more overlays found
1230 if overlay.id == id:
1244 @param overlay overlay layer
1246 @return removed overlay on success or None
1251 """!Clean layer stack - go trough all layers and remove them
1254 Removes also l_mapfile and l_maskfile
1256 @return False on failure
1257 @return True on success
1260 dir = os.path.dirname(self.
mapfile)
1262 removepath = os.path.join(dir,base)+
r'*'
1263 for f
in glob.glob(removepath):
1265 for layer
in self.
layers:
1267 dir = os.path.dirname(layer.mapfile)
1268 base = os.path.basename(layer.mapfile).
split(
'.')[0]
1269 removepath = os.path.join(dir,base)+
r'*'
1270 for f
in glob.glob(removepath):
1272 self.layers.remove(layer)
1276 dir = os.path.dirname(overlay.mapfile)
1277 base = os.path.basename(overlay.mapfile).
split(
'.')[0]
1278 removepath = os.path.join(dir,base)+
r'*'
1279 for f
in glob.glob(removepath):
1281 self.overlays.remove(overlay)
1288 """!Reverse list of layers"""
1289 return self.layers.reverse()
1292 """!Render overlays only (for nviz)"""
1294 if force
or layer.force_render:
1297 if __name__ ==
"__main__":
1299 gettext.install(
'grasswxpy', os.path.join(os.getenv(
"GISBASE"),
'locale'), unicode =
True)
1302 Map.GetRegion(update =
True)
1304 Map.AddLayer(type =
"raster",
1306 command = [
"d.rast",
"map=elevation@PERMANENT"],
1309 Map.AddLayer(type =
"vector",
1310 name =
"roadsmajor",
1311 command = [
"d.vect",
"map=roadsmajor@PERMANENT",
"color=red",
"width=3",
"type=line"])
1313 image = Map.Render(force =
True)
1316 grass.call([
"display", image])
def AlignResolution
Sets display extents to even multiple of current resolution defined in WIND file from SW corner...
def CmdToTuple
Convert command list to tuple for gcmd.RunCommand()
def GetElement
Get map element type.
Virtual class which stores information about layers (map layers and overlays) of the map composition...
def GetCurrentRegion
Get current display region settings.
def ChangeLayerActive
Enable or disable map layer.
def GetProjInfo
Get projection info.
def _initGisEnv
Stores GRASS variables (g.gisenv) to self.env variable.
def SetHidden
Hide or show map layer in Layer Manager.
def Render
Render layer to image.
def DeleteLayer
Removes layer from list of layers.
def RenderOverlays
Render overlays only (for nviz)
def AdjustRegion
Adjusts display resolution to match monitor size in pixels.
def ReverseListOfLayers
Reverse list of layers.
def GetOverlay
Return overlay(s) with 'id'.
def AddLayer
Adds generic map layer to list of layers.
def ChangeLayer
Change map layer properties.
def ChangeLayerName
Change name of the layer.
def GetName
Get map layer name.
def _projInfo
Return region projection and map units information.
def DeleteOverlay
Delete overlay.
def AddOverlay
Adds overlay (grid, barscale, legend, etc.) to list of overlays.
def Clean
Clean layer stack - go trough all layers and remove them from layer list.
def _runCommand
Run command in environment defined by self.gisrc if defined.
def GetWindow
Read WIND file and set up self.wind dictionary.
def split
Platform spefic shlex.split.
def Render
Creates final image composite.
def GetCmd
Get GRASS command as list of string.
def ReorderLayers
Reorder list to match layer tree.
def IsActive
Check if layer is activated for rendering.
def ChangeMapSize
Change size of rendered map.
def AlignExtentFromDisplay
Align region extent based on display size from center point.
def GetType
Get map layer type.
def __init__
Represents overlay displayed in map canvas.
def GetMapset
Get mapset of map layer.
def SetCmd
Set new command for layer.
def SetName
Set layer name.
def GetLayerIndex
Get index of layer in layer list.
Map composition (stack of map layers and overlays)
def ChangeOverlay
Change overlay properities.
def ChangeOpacity
Changes opacity value of map layer.
def RemoveLayer
Removes layer from layer list.
def SetType
Set layer type.
def SetActive
Active or deactive layer.
def GetRegion
Get region settings (g.region -upgc)
def SetRegion
Render string for GRASS_REGION env.
def __init__
Represents map layer in the map canvas.
def GetListOfLayers
Returns list of layers of selected properties or list of all layers.
def RunCommand
Run GRASS command.
def SetOpacity
Set opacity value.