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 given as tuple
563 self.
width = int(width)
566 sys.stderr.write(_(
"Invalid map size %d,%d\n") % (self.
width, self.
height))
572 Debug.msg(2,
"Map.ChangeMapSize(): width=%d, height=%d" % \
575 def GetRegion(self, rast = [], zoom = False, vect = [], regionName = None,
576 n =
None, s =
None, e =
None, w =
None, default =
False,
578 """!Get region settings (g.region -upgc)
580 Optionally extent, raster or vector map layer can be given.
582 @param rast list of raster maps
583 @param zoom zoom to raster map (ignore NULLs)
584 @param vect list of vector maps
585 @param regionName named region or None
586 @param n,s,e,w force extent
587 @param default force default region settings
588 @param update if True update current display region settings
590 @return region settings as directory, e.g. {
591 'n':'4928010', 's':'4913700', 'w':'589980',...}
593 @see GetCurrentRegion()
597 tmpreg = os.getenv(
"GRASS_REGION")
599 del os.environ[
"GRASS_REGION"]
602 gisrc_orig = os.getenv(
"GISRC")
604 os.environ[
"GISRC"] = self.
gisrc
608 cmd[
'flags'] =
'ugpc'
614 cmd[
'region'] = regionName
627 cmd[
'zoom'] = rast[0]
629 cmd[
'rast'] =
','.join(rast)
632 cmd[
'vect'] =
','.join(vect)
641 message = _(
"Unable to zoom to raster map <%s>.") % rast[0] + \
642 "\n\n" + _(
"Details:") +
" %s" % msg
644 message = _(
"Unable to zoom to vector map <%s>.") % vect[0] + \
645 "\n\n" + _(
"Details:") +
" %s" % msg
647 message = _(
"Unable to get current geographic extent. "
648 "Force quiting wxGUI. Please manually run g.region to "
653 for r
in reg.splitlines():
654 key, val = r.split(
"=", 1)
656 region[key] = float(val)
662 os.environ[
"GISRC"] = gisrc_orig
666 os.environ[
"GRASS_REGION"] = tmpreg
668 Debug.msg (3,
"Map.GetRegion(): %s" % region)
676 """!Get current display region settings
683 """!Render string for GRASS_REGION env. variable, so that the
684 images will be rendered from desired zoom level.
686 @param windres uses resolution from WIND file rather than
687 display (for modules that require set resolution like
690 @return String usable for GRASS_REGION variable or None
696 region = copy.copy(self.
region)
697 for key
in (
'nsres',
'ewres',
'cells'):
698 region[key] = compRegion[key]
705 for key
in self.wind.keys():
707 grass_region +=
"north: %s; " % \
711 grass_region +=
"south: %s; " % \
715 grass_region +=
"east: %s; " % \
719 grass_region +=
"west: %s; " % \
722 elif key ==
"e-w resol":
723 grass_region +=
"e-w resol: %f; " % \
726 elif key ==
"n-s resol":
727 grass_region +=
"n-s resol: %f; " % \
733 grass_region +=
'cols: %d; ' % \
739 grass_region +=
'rows: %d; ' % \
743 grass_region += key +
": " + self.
wind[key] +
"; "
745 Debug.msg (3,
"Map.SetRegion(): %s" % grass_region)
752 def GetListOfLayers(self, l_type = None, l_mapset = None, l_name = None,
753 l_active =
None, l_hidden =
None):
754 """!Returns list of layers of selected properties or list of
757 @param l_type layer type, e.g. raster/vector/wms/overlay (value or tuple of values)
758 @param l_mapset all layers from given mapset (only for maplayers)
759 @param l_name all layers with given name
760 @param l_active only layers with 'active' attribute set to True or False
761 @param l_hidden only layers with 'hidden' attribute set to True or False
763 @return list of selected layers
767 if type(l_type) == types.StringType:
772 if one_type
and l_type ==
'overlay':
781 if one_type
and layer.type != l_type:
783 elif not one_type
and layer.type
not in l_type:
787 if (l_mapset !=
None and l_type !=
'overlay')
and \
788 layer.GetMapset() != l_mapset:
792 if l_name !=
None and layer.name != l_name:
796 if l_active !=
None and \
798 if layer.active == l_active
and \
799 layer.hidden == l_hidden:
800 selected.append(layer)
803 elif l_active !=
None:
804 if layer.active == l_active:
805 selected.append(layer)
808 elif l_hidden !=
None:
809 if layer.hidden == l_hidden:
810 selected.append(layer)
814 selected.append(layer)
816 Debug.msg (3,
"Map.GetListOfLayers(): numberof=%d" % len(selected))
820 def _renderLayers(self, force, mapWindow, maps, masks, opacities):
825 if layer ==
None or layer.active ==
False:
830 layer.force_render
or \
831 layer.mapfile ==
None or \
832 (
not os.path.isfile(layer.mapfile)
or not os.path.getsize(layer.mapfile)):
833 if not layer.Render():
839 event = wxUpdateProgressBar(value = ilayer)
840 wx.PostEvent(mapWindow, event)
843 if layer.type !=
"overlay":
844 maps.append(layer.mapfile)
845 masks.append(layer.maskfile)
846 opacities.append(str(layer.opacity))
848 Debug.msg (3,
"Map.Render() type=%s, layer=%s " % (layer.type, layer.name))
851 def Render(self, force = False, mapWindow = None, windres = False):
852 """!Creates final image composite
854 This function can conditionaly use high-level tools, which
855 should be avaliable in wxPython library
857 @param force force rendering
858 @param reference for MapFrame instance (for progress bar)
859 @param windres use region resolution (True) otherwise display resolution
861 @return name of file with rendered image or None
869 gisrc_orig = os.getenv(
"GISRC")
871 os.environ[
"GISRC"] = self.
gisrc
873 tmp_region = os.getenv(
"GRASS_REGION")
874 os.environ[
"GRASS_REGION"] = self.
SetRegion(windres)
875 os.environ[
"GRASS_WIDTH"] = str(self.
width)
876 os.environ[
"GRASS_HEIGHT"] = str(self.
height)
877 if UserSettings.Get(group=
'display', key=
'driver', subkey=
'type') ==
'cairo':
878 os.environ[
"GRASS_AUTO_WRITE"] =
"TRUE"
879 if "GRASS_RENDER_IMMEDIATE" in os.environ:
880 del os.environ[
"GRASS_RENDER_IMMEDIATE"]
881 os.environ[
"GRASS_RENDER_IMMEDIATE"] =
"TRUE"
883 os.environ[
"GRASS_PNG_AUTO_WRITE"] =
"TRUE"
884 os.environ[
"GRASS_PNG_READ"] =
"FALSE"
885 os.environ[
"GRASS_PNG_COMPRESSION"] =
"0"
886 os.environ[
"GRASS_TRUECOLOR"] =
"TRUE"
887 os.environ[
"GRASS_RENDER_IMMEDIATE"] =
"TRUE"
892 if sys.platform !=
'win32':
893 mapstr =
",".join(maps)
894 maskstr =
",".join(masks)
899 mapstr += item.replace(
'\\',
'/')
900 mapstr = mapstr.rstrip(
',')
903 maskstr += item.replace(
'\\',
'/')
904 maskstr = maskstr.rstrip(
',')
905 mapoutstr = self.mapfile.replace(
'\\',
'/')
908 bgcolor =
':'.join(map(str, UserSettings.Get(group =
'display', key =
'bgcolor',
913 os.environ[
"GRASS_REGION"] = tmp_region
915 del os.environ[
"GRASS_REGION"]
921 input =
'%s' %
",".join(maps),
922 mask =
'%s' %
",".join(masks),
923 opacity =
'%s' %
",".join(opacities),
924 background = bgcolor,
930 print >> sys.stderr, _(
"ERROR: Rendering failed. Details: %s") % msg
934 Debug.msg (3,
"Map.Render() force=%s file=%s" % (force, self.
mapfile))
938 os.environ[
"GISRC"] = gisrc_orig
946 def AddLayer(self, type, command, name = None,
947 l_active =
True, l_hidden =
False, l_opacity = 1.0, l_render =
False,
949 """!Adds generic map layer to list of layers
951 @param type layer type ('raster', 'vector', etc.)
952 @param command GRASS command given as list
953 @param name layer name
954 @param l_active layer render only if True
955 @param l_hidden layer not displayed in layer tree if True
956 @param l_opacity opacity level range from 0(transparent) - 1(not transparent)
957 @param l_render render an image if True
958 @param pos position in layer list (-1 for append)
960 @return new layer on success
961 @return None on failure
965 if l_opacity < 0: l_opacity = 0
966 elif l_opacity > 1: l_opacity = 1
967 layer =
MapLayer(type = type, name = name, cmd = command,
968 active = l_active, hidden = l_hidden, opacity = l_opacity)
972 self.layers.insert(pos, layer)
974 self.layers.append(layer)
976 Debug.msg (3,
"Map.AddLayer(): layer=%s" % layer.name)
978 if not layer.Render():
979 raise GException(_(
"Unable to render map layer <%s>.") % name)
986 """!Removes layer from list of layers
988 @param layer layer instance in layer tree
989 @param overlay delete overlay (use self.DeleteOverlay() instead)
991 @return removed layer on success or None
993 Debug.msg (3,
"Map.DeleteLayer(): name=%s" % layer.name)
1002 base = os.path.split(layer.mapfile)[0]
1003 mapfile = os.path.split(layer.mapfile)[1]
1004 tempbase = mapfile.split(
'.')[0]
1005 if base ==
'' or tempbase ==
'':
1007 basefile = os.path.join(base, tempbase) +
r'.*'
1008 for f
in glob.glob(basefile):
1017 """!Reorder list to match layer tree
1019 @param layerList list of layers
1024 for layer
in self.
layers:
1026 layerNameList += layer.name +
','
1027 Debug.msg (4,
"Map.ReoderLayers(): layers=%s" % \
1031 """!Change map layer properties
1033 @param layer map layer instance
1034 @param type layer type ('raster', 'vector', etc.)
1035 @param command GRASS command given as list
1036 @param name layer name
1037 @param active layer render only if True
1038 @param hidden layer not displayed in layer tree if True
1039 @param opacity opacity level range from 0(transparent) - 1(not transparent)
1040 @param render render an image if True
1042 Debug.msg (3,
"Map.ChangeLayer(): layer=%s" % layer.name)
1045 layer.SetType(kargs[
'type'])
1047 if 'command' in kargs:
1048 layer.SetCmd(kargs[
'command'])
1051 layer.SetName(kargs[
'name'])
1053 if 'active' in kargs:
1054 layer.SetActive(kargs[
'active'])
1056 if 'hidden' in kargs:
1057 layer.SetHidden(kargs[
'hidden'])
1059 if 'opacity' in kargs:
1060 layer.SetOpacity(kargs[
'opacity'])
1062 if render
and not layer.Render():
1063 raise GException(_(
"Unable to render map layer <%s>.") %
1069 """!Changes opacity value of map layer
1071 @param layer layer instance in layer tree
1072 @param l_opacity opacity level <0;1>
1075 if l_opacity < 0: l_opacity = 0
1076 elif l_opacity > 1: l_opacity = 1
1078 layer.opacity = l_opacity
1079 Debug.msg (3,
"Map.ChangeOpacity(): layer=%s, opacity=%f" % \
1080 (layer.name, layer.opacity))
1083 """!Enable or disable map layer
1085 @param layer layer instance in layer tree
1086 @param active to be rendered (True)
1088 layer.active = active
1090 Debug.msg (3,
"Map.ChangeLayerActive(): name='%s' -> active=%d" % \
1091 (layer.name, layer.active))
1094 """!Change name of the layer
1096 @param layer layer instance in layer tree
1097 @param name layer name to set up
1099 Debug.msg (3,
"Map.ChangeLayerName(): from=%s to=%s" % \
1104 """!Removes layer from layer list
1106 Layer is defined by name@mapset or id.
1108 @param name layer name (must be unique)
1109 @param id layer index in layer list
1111 @return removed layer on success
1112 @return None on failure
1117 for layer
in self.
layers:
1118 if layer.name == name:
1120 os.remove(layer.mapfile)
1121 os.remove(layer.maskfile)
1122 self.layers.remove(layer)
1126 return self.layers.pop(id)
1131 """!Get index of layer in layer list.
1133 @param layer layer instace in layer tree
1134 @param overlay use list of overlays instead
1137 @return -1 if layer not found
1145 return list.index(layer)
1150 l_active =
True, l_hidden =
True, l_opacity = 1.0, l_render =
False):
1151 """!Adds overlay (grid, barscale, legend, etc.) to list of
1154 @param id overlay id (PseudoDC)
1155 @param type overlay type (barscale, legend)
1156 @param command GRASS command to render overlay
1157 @param l_active overlay activated (True) or disabled (False)
1158 @param l_hidden overlay is not shown in layer tree (if True)
1159 @param l_render render an image (if True)
1161 @return new layer on success
1162 @retutn None on failure
1164 Debug.msg (2,
"Map.AddOverlay(): cmd=%s, render=%d" % (command, l_render))
1165 overlay =
Overlay(id = id, type = type, cmd = command,
1166 active = l_active, hidden = l_hidden, opacity = l_opacity)
1169 self.overlays.append(overlay)
1171 if l_render
and command !=
'' and not overlay.Render():
1172 raise GException(_(
"Unable to render overlay <%s>.") %
1178 """!Change overlay properities
1180 Add new overlay if overlay with 'id' doesn't exist.
1182 @param id overlay id (PseudoDC)
1183 @param type overlay type (barscale, legend)
1184 @param command GRASS command to render overlay
1185 @param l_active overlay activated (True) or disabled (False)
1186 @param l_hidden overlay is not shown in layer tree (if True)
1187 @param l_render render an image (if True)
1189 @return new layer on success
1193 overlay =
Overlay(id, type =
None, cmd =
None)
1196 overlay.SetName(kargs[
'type'])
1198 if 'command' in kargs:
1199 overlay.SetCmd(kargs[
'command'])
1201 if 'active' in kargs:
1202 overlay.SetActive(kargs[
'active'])
1204 if 'hidden' in kargs:
1205 overlay.SetHidden(kargs[
'hidden'])
1207 if 'opacity' in kargs:
1208 overlay.SetOpacity(kargs[
'opacity'])
1210 if render
and overlay.GetCmd() != []
and not overlay.Render():
1211 raise GException(_(
"Unable to render overlay <%s>.") %
1217 """!Return overlay(s) with 'id'
1219 @param id overlay id
1220 @param list return list of overlays of True
1221 otherwise suppose 'id' to be unique
1223 @return list of overlays (list=True)
1224 @return overlay (list=False)
1225 @retur None (list=False) if no overlay or more overlays found
1229 if overlay.id == id:
1243 @param overlay overlay layer
1245 @return removed overlay on success or None
1250 """!Clean layer stack - go trough all layers and remove them
1253 Removes also l_mapfile and l_maskfile
1255 @return False on failure
1256 @return True on success
1259 dir = os.path.dirname(self.
mapfile)
1261 removepath = os.path.join(dir,base)+
r'*'
1262 for f
in glob.glob(removepath):
1264 for layer
in self.
layers:
1266 dir = os.path.dirname(layer.mapfile)
1267 base = os.path.basename(layer.mapfile).
split(
'.')[0]
1268 removepath = os.path.join(dir,base)+
r'*'
1269 for f
in glob.glob(removepath):
1271 self.layers.remove(layer)
1275 dir = os.path.dirname(overlay.mapfile)
1276 base = os.path.basename(overlay.mapfile).
split(
'.')[0]
1277 removepath = os.path.join(dir,base)+
r'*'
1278 for f
in glob.glob(removepath):
1280 self.overlays.remove(overlay)
1287 """!Reverse list of layers"""
1288 return self.layers.reverse()
1291 """!Render overlays only (for nviz)"""
1293 if force
or layer.force_render:
1296 if __name__ ==
"__main__":
1298 gettext.install(
'grasswxpy', os.path.join(os.getenv(
"GISBASE"),
'locale'), unicode =
True)
1301 Map.GetRegion(update =
True)
1303 Map.AddLayer(type =
"raster",
1305 command = [
"d.rast",
"map=elevation@PERMANENT"],
1308 Map.AddLayer(type =
"vector",
1309 name =
"roadsmajor",
1310 command = [
"d.vect",
"map=roadsmajor@PERMANENT",
"color=red",
"width=3",
"type=line"])
1312 image = Map.Render(force =
True)
1315 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.