|
@@ -9,7 +9,7 @@ Classes:
|
|
- Overlay
|
|
- Overlay
|
|
- Map
|
|
- Map
|
|
|
|
|
|
-(C) 2006-2009 by the GRASS Development Team
|
|
|
|
|
|
+(C) 2006-2010 by the GRASS Development Team
|
|
This program is free software under the GNU General Public
|
|
This program is free software under the GNU General Public
|
|
License (>=v2). Read the file COPYING that comes with GRASS
|
|
License (>=v2). Read the file COPYING that comes with GRASS
|
|
for details.
|
|
for details.
|
|
@@ -55,11 +55,10 @@ USE_GPNMCOMP = True
|
|
class Layer(object):
|
|
class Layer(object):
|
|
"""!Virtual class which stores information about layers (map layers and
|
|
"""!Virtual class which stores information about layers (map layers and
|
|
overlays) of the map composition.
|
|
overlays) of the map composition.
|
|
-
|
|
|
|
|
|
+
|
|
For map layer use MapLayer class.
|
|
For map layer use MapLayer class.
|
|
For overlays use Overlay class.
|
|
For overlays use Overlay class.
|
|
"""
|
|
"""
|
|
-
|
|
|
|
def __init__(self, type, cmd, name=None,
|
|
def __init__(self, type, cmd, name=None,
|
|
active=True, hidden=False, opacity=1.0):
|
|
active=True, hidden=False, opacity=1.0):
|
|
"""
|
|
"""
|
|
@@ -75,7 +74,7 @@ class Layer(object):
|
|
"""
|
|
"""
|
|
self.type = type
|
|
self.type = type
|
|
self.name = name
|
|
self.name = name
|
|
-
|
|
|
|
|
|
+
|
|
if self.type == 'command':
|
|
if self.type == 'command':
|
|
self.cmd = []
|
|
self.cmd = []
|
|
for c in cmd:
|
|
for c in cmd:
|
|
@@ -93,7 +92,7 @@ class Layer(object):
|
|
"active=%d, opacity=%d, hidden=%d" % \
|
|
"active=%d, opacity=%d, hidden=%d" % \
|
|
(self.type, self.GetCmd(string=True), self.name, self.active,
|
|
(self.type, self.GetCmd(string=True), self.name, self.active,
|
|
self.opacity, self.hidden))
|
|
self.opacity, self.hidden))
|
|
-
|
|
|
|
|
|
+
|
|
# generated file for each layer
|
|
# generated file for each layer
|
|
self.gtemp = tempfile.mkstemp()[1]
|
|
self.gtemp = tempfile.mkstemp()[1]
|
|
self.maskfile = self.gtemp + ".pgm"
|
|
self.maskfile = self.gtemp + ".pgm"
|
|
@@ -101,14 +100,14 @@ class Layer(object):
|
|
self.mapfile = self.gtemp + ".png"
|
|
self.mapfile = self.gtemp + ".png"
|
|
else:
|
|
else:
|
|
self.mapfile = self.gtemp + ".ppm"
|
|
self.mapfile = self.gtemp + ".ppm"
|
|
-
|
|
|
|
|
|
+
|
|
def __del__(self):
|
|
def __del__(self):
|
|
Debug.msg (3, "Layer.__del__(): layer=%s, cmd='%s'" %
|
|
Debug.msg (3, "Layer.__del__(): layer=%s, cmd='%s'" %
|
|
(self.name, self.GetCmd(string=True)))
|
|
(self.name, self.GetCmd(string=True)))
|
|
|
|
|
|
def Render(self):
|
|
def Render(self):
|
|
"""!Render layer to image
|
|
"""!Render layer to image
|
|
-
|
|
|
|
|
|
+
|
|
@return rendered image filename
|
|
@return rendered image filename
|
|
@return None on error
|
|
@return None on error
|
|
"""
|
|
"""
|
|
@@ -200,9 +199,9 @@ class Layer(object):
|
|
def GetCmd(self, string=False):
|
|
def GetCmd(self, string=False):
|
|
"""
|
|
"""
|
|
Get GRASS command as list of string.
|
|
Get GRASS command as list of string.
|
|
-
|
|
|
|
|
|
+
|
|
@param string get command as string if True otherwise as list
|
|
@param string get command as string if True otherwise as list
|
|
-
|
|
|
|
|
|
+
|
|
@return command list/string
|
|
@return command list/string
|
|
"""
|
|
"""
|
|
if string:
|
|
if string:
|
|
@@ -224,9 +223,9 @@ class Layer(object):
|
|
def GetOpacity(self, float=False):
|
|
def GetOpacity(self, float=False):
|
|
"""
|
|
"""
|
|
Get layer opacity level
|
|
Get layer opacity level
|
|
-
|
|
|
|
|
|
+
|
|
@param float get opacity level in <0,1> otherwise <0,100>
|
|
@param float get opacity level in <0,1> otherwise <0,100>
|
|
-
|
|
|
|
|
|
+
|
|
@return opacity level
|
|
@return opacity level
|
|
"""
|
|
"""
|
|
if float:
|
|
if float:
|
|
@@ -253,7 +252,7 @@ class Layer(object):
|
|
def IsActive(self):
|
|
def IsActive(self):
|
|
"""!Check if layer is activated for rendering"""
|
|
"""!Check if layer is activated for rendering"""
|
|
return self.active
|
|
return self.active
|
|
-
|
|
|
|
|
|
+
|
|
def SetType(self, type):
|
|
def SetType(self, type):
|
|
"""!Set layer type"""
|
|
"""!Set layer type"""
|
|
if type not in ('raster', '3d-raster', 'vector',
|
|
if type not in ('raster', '3d-raster', 'vector',
|
|
@@ -300,10 +299,10 @@ class Layer(object):
|
|
self.force_render = True
|
|
self.force_render = True
|
|
|
|
|
|
class MapLayer(Layer):
|
|
class MapLayer(Layer):
|
|
- """!Represents map layer in the map canvas"""
|
|
|
|
def __init__(self, type, cmd, name=None,
|
|
def __init__(self, type, cmd, name=None,
|
|
- active=True, hidden=False, opacity=1.0):
|
|
|
|
- """
|
|
|
|
|
|
+ active=True, hidden=False, opacity=1.0):
|
|
|
|
+ """!Represents map layer in the map canvas
|
|
|
|
+
|
|
@param type layer type ('raster', 'vector', 'command', etc.)
|
|
@param type layer type ('raster', 'vector', 'command', etc.)
|
|
@param cmd GRASS command to render layer,
|
|
@param cmd GRASS command to render layer,
|
|
given as list, e.g. ['d.rast', 'map=elevation@PERMANENT']
|
|
given as list, e.g. ['d.rast', 'map=elevation@PERMANENT']
|
|
@@ -314,29 +313,26 @@ class MapLayer(Layer):
|
|
"""
|
|
"""
|
|
Layer.__init__(self, type, cmd, name,
|
|
Layer.__init__(self, type, cmd, name,
|
|
active, hidden, opacity)
|
|
active, hidden, opacity)
|
|
-
|
|
|
|
- #self.mapfile = self.gtemp + ".ppm"
|
|
|
|
-
|
|
|
|
|
|
+
|
|
def GetMapset(self):
|
|
def GetMapset(self):
|
|
- """
|
|
|
|
- Get mapset of map layer
|
|
|
|
-
|
|
|
|
|
|
+ """!Get mapset of map layer
|
|
|
|
+
|
|
@return mapset name
|
|
@return mapset name
|
|
@return '' on error (no name given)
|
|
@return '' on error (no name given)
|
|
"""
|
|
"""
|
|
if not self.name:
|
|
if not self.name:
|
|
return ''
|
|
return ''
|
|
-
|
|
|
|
|
|
+
|
|
try:
|
|
try:
|
|
return self.name.split('@')[1]
|
|
return self.name.split('@')[1]
|
|
except IndexError:
|
|
except IndexError:
|
|
return self.name
|
|
return self.name
|
|
-
|
|
|
|
|
|
+
|
|
class Overlay(Layer):
|
|
class Overlay(Layer):
|
|
- """!Represents overlay displayed in map canvas"""
|
|
|
|
def __init__(self, id, type, cmd,
|
|
def __init__(self, id, type, cmd,
|
|
active=True, hidden=True, opacity=1.0):
|
|
active=True, hidden=True, opacity=1.0):
|
|
- """
|
|
|
|
|
|
+ """!Represents overlay displayed in map canvas
|
|
|
|
+
|
|
@param id overlay id (for PseudoDC)
|
|
@param id overlay id (for PseudoDC)
|
|
@param type overlay type ('barscale', 'legend', etc.)
|
|
@param type overlay type ('barscale', 'legend', etc.)
|
|
@param cmd GRASS command to render overlay,
|
|
@param cmd GRASS command to render overlay,
|
|
@@ -347,10 +343,9 @@ class Overlay(Layer):
|
|
"""
|
|
"""
|
|
Layer.__init__(self, 'overlay', cmd, type,
|
|
Layer.__init__(self, 'overlay', cmd, type,
|
|
active, hidden, opacity)
|
|
active, hidden, opacity)
|
|
-
|
|
|
|
|
|
+
|
|
self.id = id
|
|
self.id = id
|
|
- #self.mapfile = self.gtemp + ".png"
|
|
|
|
-
|
|
|
|
|
|
+
|
|
class Map(object):
|
|
class Map(object):
|
|
"""!Map composition (stack of map layers and overlays)
|
|
"""!Map composition (stack of map layers and overlays)
|
|
"""
|
|
"""
|
|
@@ -363,7 +358,7 @@ class Map(object):
|
|
|
|
|
|
# list of layers
|
|
# list of layers
|
|
self.layers = list() # stack of available GRASS layer
|
|
self.layers = list() # stack of available GRASS layer
|
|
-
|
|
|
|
|
|
+
|
|
self.overlays = list() # stack of available overlays
|
|
self.overlays = list() # stack of available overlays
|
|
self.ovlookup = dict() # lookup dictionary for overlay items and overlays
|
|
self.ovlookup = dict() # lookup dictionary for overlay items and overlays
|
|
|
|
|
|
@@ -385,7 +380,7 @@ class Map(object):
|
|
|
|
|
|
# projection info
|
|
# projection info
|
|
self.projinfo = self._projInfo()
|
|
self.projinfo = self._projInfo()
|
|
-
|
|
|
|
|
|
+
|
|
def _runCommand(self, cmd, **kwargs):
|
|
def _runCommand(self, cmd, **kwargs):
|
|
"""!Run command in environment defined by self.gisrc if
|
|
"""!Run command in environment defined by self.gisrc if
|
|
defined"""
|
|
defined"""
|
|
@@ -418,7 +413,7 @@ class Map(object):
|
|
"""!Return region projection and map units information
|
|
"""!Return region projection and map units information
|
|
"""
|
|
"""
|
|
projinfo = dict()
|
|
projinfo = dict()
|
|
-
|
|
|
|
|
|
+
|
|
ret = self._runCommand(gcmd.RunCommand, prog = 'g.proj',
|
|
ret = self._runCommand(gcmd.RunCommand, prog = 'g.proj',
|
|
read = True, flags = 'p')
|
|
read = True, flags = 'p')
|
|
|
|
|
|
@@ -435,7 +430,7 @@ class Map(object):
|
|
break
|
|
break
|
|
|
|
|
|
return projinfo
|
|
return projinfo
|
|
-
|
|
|
|
|
|
+
|
|
def GetWindow(self):
|
|
def GetWindow(self):
|
|
"""!Read WIND file and set up self.wind dictionary"""
|
|
"""!Read WIND file and set up self.wind dictionary"""
|
|
# FIXME: duplicated region WIND == g.region (at least some values)
|
|
# FIXME: duplicated region WIND == g.region (at least some values)
|
|
@@ -459,81 +454,77 @@ class Map(object):
|
|
return self.wind
|
|
return self.wind
|
|
|
|
|
|
def AdjustRegion(self):
|
|
def AdjustRegion(self):
|
|
|
|
+ """!Adjusts display resolution to match monitor size in
|
|
|
|
+ pixels. Maintains constant display resolution, not related to
|
|
|
|
+ computational region. Do NOT use the display resolution to set
|
|
|
|
+ computational resolution. Set computational resolution through
|
|
|
|
+ g.region.
|
|
"""
|
|
"""
|
|
- Adjusts display resolution to match monitor size in pixels.
|
|
|
|
- Maintains constant display resolution, not related to computational
|
|
|
|
- region. Do NOT use the display resolution to set computational
|
|
|
|
- resolution. Set computational resolution through g.region.
|
|
|
|
- """
|
|
|
|
-
|
|
|
|
mapwidth = abs(self.region["e"] - self.region["w"])
|
|
mapwidth = abs(self.region["e"] - self.region["w"])
|
|
mapheight = abs(self.region['n'] - self.region['s'])
|
|
mapheight = abs(self.region['n'] - self.region['s'])
|
|
-
|
|
|
|
|
|
+
|
|
self.region["nsres"] = mapheight / self.height
|
|
self.region["nsres"] = mapheight / self.height
|
|
self.region["ewres"] = mapwidth / self.width
|
|
self.region["ewres"] = mapwidth / self.width
|
|
self.region['rows'] = round(mapheight / self.region["nsres"])
|
|
self.region['rows'] = round(mapheight / self.region["nsres"])
|
|
self.region['cols'] = round(mapwidth / self.region["ewres"])
|
|
self.region['cols'] = round(mapwidth / self.region["ewres"])
|
|
self.region['cells'] = self.region['rows'] * self.region['cols']
|
|
self.region['cells'] = self.region['rows'] * self.region['cols']
|
|
-
|
|
|
|
|
|
+
|
|
Debug.msg (3, "Map.AdjustRegion(): %s" % self.region)
|
|
Debug.msg (3, "Map.AdjustRegion(): %s" % self.region)
|
|
-
|
|
|
|
|
|
+
|
|
return self.region
|
|
return self.region
|
|
|
|
|
|
def AlignResolution(self):
|
|
def AlignResolution(self):
|
|
|
|
+ """!Sets display extents to even multiple of current
|
|
|
|
+ resolution defined in WIND file from SW corner. This must be
|
|
|
|
+ done manually as using the -a flag can produce incorrect
|
|
|
|
+ extents.
|
|
"""
|
|
"""
|
|
- Sets display extents to even multiple of
|
|
|
|
- current resolution defined in WIND file from SW corner.
|
|
|
|
- This must be done manually as using the -a flag
|
|
|
|
- can produce incorrect extents.
|
|
|
|
- """
|
|
|
|
-
|
|
|
|
# new values to use for saving to region file
|
|
# new values to use for saving to region file
|
|
new = {}
|
|
new = {}
|
|
n = s = e = w = 0.0
|
|
n = s = e = w = 0.0
|
|
nwres = ewres = 0.0
|
|
nwres = ewres = 0.0
|
|
-
|
|
|
|
|
|
+
|
|
# Get current values for region and display
|
|
# Get current values for region and display
|
|
nsres = self.GetRegion()['nsres']
|
|
nsres = self.GetRegion()['nsres']
|
|
ewres = self.GetRegion()['ewres']
|
|
ewres = self.GetRegion()['ewres']
|
|
-
|
|
|
|
|
|
+
|
|
n = float(self.region['n'])
|
|
n = float(self.region['n'])
|
|
s = float(self.region['s'])
|
|
s = float(self.region['s'])
|
|
e = float(self.region['e'])
|
|
e = float(self.region['e'])
|
|
w = float(self.region['w'])
|
|
w = float(self.region['w'])
|
|
-
|
|
|
|
|
|
+
|
|
# Calculate rows, columns, and extents
|
|
# Calculate rows, columns, and extents
|
|
new['rows'] = math.fabs(round((n-s)/nsres))
|
|
new['rows'] = math.fabs(round((n-s)/nsres))
|
|
new['cols'] = math.fabs(round((e-w)/ewres))
|
|
new['cols'] = math.fabs(round((e-w)/ewres))
|
|
-
|
|
|
|
|
|
+
|
|
# Calculate new extents
|
|
# Calculate new extents
|
|
new['s'] = nsres * round(s/nsres)
|
|
new['s'] = nsres * round(s/nsres)
|
|
new['w'] = ewres * round(w/ewres)
|
|
new['w'] = ewres * round(w/ewres)
|
|
new['n'] = new['s'] + (new['rows'] * nsres)
|
|
new['n'] = new['s'] + (new['rows'] * nsres)
|
|
new['e'] = new['w'] + (new['cols'] * ewres)
|
|
new['e'] = new['w'] + (new['cols'] * ewres)
|
|
-
|
|
|
|
|
|
+
|
|
return new
|
|
return new
|
|
|
|
|
|
def AlignExtentFromDisplay(self):
|
|
def AlignExtentFromDisplay(self):
|
|
"""!Align region extent based on display size from center point"""
|
|
"""!Align region extent based on display size from center point"""
|
|
-
|
|
|
|
# calculate new bounding box based on center of display
|
|
# calculate new bounding box based on center of display
|
|
if self.region["ewres"] > self.region["nsres"]:
|
|
if self.region["ewres"] > self.region["nsres"]:
|
|
res = self.region["ewres"]
|
|
res = self.region["ewres"]
|
|
else:
|
|
else:
|
|
res = self.region["nsres"]
|
|
res = self.region["nsres"]
|
|
-
|
|
|
|
|
|
+
|
|
Debug.msg(3, "Map.AlignExtentFromDisplay(): width=%d, height=%d, res=%f, center=%f,%f" % \
|
|
Debug.msg(3, "Map.AlignExtentFromDisplay(): width=%d, height=%d, res=%f, center=%f,%f" % \
|
|
(self.width, self.height, res, self.region['center_easting'],
|
|
(self.width, self.height, res, self.region['center_easting'],
|
|
self.region['center_northing']))
|
|
self.region['center_northing']))
|
|
|
|
|
|
ew = (self.width / 2) * res
|
|
ew = (self.width / 2) * res
|
|
ns = (self.height / 2) * res
|
|
ns = (self.height / 2) * res
|
|
-
|
|
|
|
|
|
+
|
|
self.region['n'] = self.region['center_northing'] + ns
|
|
self.region['n'] = self.region['center_northing'] + ns
|
|
self.region['s'] = self.region['center_northing'] - ns
|
|
self.region['s'] = self.region['center_northing'] - ns
|
|
self.region['e'] = self.region['center_easting'] + ew
|
|
self.region['e'] = self.region['center_easting'] + ew
|
|
self.region['w'] = self.region['center_easting'] - ew
|
|
self.region['w'] = self.region['center_easting'] - ew
|
|
-
|
|
|
|
|
|
+
|
|
# LL locations
|
|
# LL locations
|
|
if self.projinfo['proj'] == 'll':
|
|
if self.projinfo['proj'] == 'll':
|
|
if self.region['n'] > 90.0:
|
|
if self.region['n'] > 90.0:
|
|
@@ -559,12 +550,12 @@ class Map(object):
|
|
self.width = 640
|
|
self.width = 640
|
|
self.height = 480
|
|
self.height = 480
|
|
return False
|
|
return False
|
|
-
|
|
|
|
|
|
+
|
|
def GetRegion(self, rast = [], zoom = False, vect = [], regionName = None,
|
|
def GetRegion(self, rast = [], zoom = False, vect = [], regionName = None,
|
|
n = None, s = None, e = None, w = None, default = False,
|
|
n = None, s = None, e = None, w = None, default = False,
|
|
update = False):
|
|
update = False):
|
|
"""!Get region settings (g.region -upgc)
|
|
"""!Get region settings (g.region -upgc)
|
|
-
|
|
|
|
|
|
+
|
|
Optionally extent, raster or vector map layer can be given.
|
|
Optionally extent, raster or vector map layer can be given.
|
|
|
|
|
|
@param rast list of raster maps
|
|
@param rast list of raster maps
|
|
@@ -579,20 +570,20 @@ class Map(object):
|
|
'n':'4928010', 's':'4913700', 'w':'589980',...}
|
|
'n':'4928010', 's':'4913700', 'w':'589980',...}
|
|
"""
|
|
"""
|
|
region = {}
|
|
region = {}
|
|
-
|
|
|
|
|
|
+
|
|
tmpreg = os.getenv("GRASS_REGION")
|
|
tmpreg = os.getenv("GRASS_REGION")
|
|
if tmpreg:
|
|
if tmpreg:
|
|
del os.environ["GRASS_REGION"]
|
|
del os.environ["GRASS_REGION"]
|
|
-
|
|
|
|
|
|
+
|
|
# use external gisrc if defined
|
|
# use external gisrc if defined
|
|
gisrc_orig = os.getenv("GISRC")
|
|
gisrc_orig = os.getenv("GISRC")
|
|
if self.gisrc:
|
|
if self.gisrc:
|
|
os.environ["GISRC"] = self.gisrc
|
|
os.environ["GISRC"] = self.gisrc
|
|
-
|
|
|
|
|
|
+
|
|
# do not update & shell style output
|
|
# do not update & shell style output
|
|
cmd = {}
|
|
cmd = {}
|
|
cmd['flags'] = 'ugpc'
|
|
cmd['flags'] = 'ugpc'
|
|
-
|
|
|
|
|
|
+
|
|
if default:
|
|
if default:
|
|
cmd['flags'] += 'd'
|
|
cmd['flags'] += 'd'
|
|
|
|
|
|
@@ -607,13 +598,13 @@ class Map(object):
|
|
cmd['e'] = e
|
|
cmd['e'] = e
|
|
if w:
|
|
if w:
|
|
cmd['w'] = w
|
|
cmd['w'] = w
|
|
-
|
|
|
|
|
|
+
|
|
if rast:
|
|
if rast:
|
|
if zoom:
|
|
if zoom:
|
|
cmd['zoom'] = rast[0]
|
|
cmd['zoom'] = rast[0]
|
|
else:
|
|
else:
|
|
cmd['rast'] = ','.join(rast)
|
|
cmd['rast'] = ','.join(rast)
|
|
-
|
|
|
|
|
|
+
|
|
if vect:
|
|
if vect:
|
|
cmd['vect'] = ','.join(vect)
|
|
cmd['vect'] = ','.join(vect)
|
|
|
|
|
|
@@ -634,22 +625,22 @@ class Map(object):
|
|
"fix the problem.")
|
|
"fix the problem.")
|
|
e.Show()
|
|
e.Show()
|
|
return self.region
|
|
return self.region
|
|
-
|
|
|
|
|
|
+
|
|
for reg in ret.splitlines():
|
|
for reg in ret.splitlines():
|
|
key, val = reg.split("=", 1)
|
|
key, val = reg.split("=", 1)
|
|
try:
|
|
try:
|
|
region[key] = float(val)
|
|
region[key] = float(val)
|
|
except ValueError:
|
|
except ValueError:
|
|
region[key] = val
|
|
region[key] = val
|
|
-
|
|
|
|
|
|
+
|
|
# back to original gisrc
|
|
# back to original gisrc
|
|
if self.gisrc:
|
|
if self.gisrc:
|
|
os.environ["GISRC"] = gisrc_orig
|
|
os.environ["GISRC"] = gisrc_orig
|
|
-
|
|
|
|
|
|
+
|
|
# restore region
|
|
# restore region
|
|
if tmpreg:
|
|
if tmpreg:
|
|
os.environ["GRASS_REGION"] = tmpreg
|
|
os.environ["GRASS_REGION"] = tmpreg
|
|
-
|
|
|
|
|
|
+
|
|
Debug.msg (3, "Map.GetRegion(): %s" % region)
|
|
Debug.msg (3, "Map.GetRegion(): %s" % region)
|
|
|
|
|
|
if update:
|
|
if update:
|
|
@@ -662,17 +653,17 @@ class Map(object):
|
|
return self.region
|
|
return self.region
|
|
|
|
|
|
def SetRegion(self, windres=False):
|
|
def SetRegion(self, windres=False):
|
|
- """
|
|
|
|
- Render string for GRASS_REGION env. variable, so that the images will be rendered
|
|
|
|
- from desired zoom level.
|
|
|
|
-
|
|
|
|
- @param windres uses resolution from WIND file rather than display (for modules that require set
|
|
|
|
- resolution like d.rast.num)
|
|
|
|
|
|
+ """!Render string for GRASS_REGION env. variable, so that the
|
|
|
|
+ images will be rendered from desired zoom level.
|
|
|
|
+
|
|
|
|
+ @param windres uses resolution from WIND file rather than
|
|
|
|
+ display (for modules that require set resolution like
|
|
|
|
+ d.rast.num)
|
|
|
|
|
|
@return String usable for GRASS_REGION variable or None
|
|
@return String usable for GRASS_REGION variable or None
|
|
"""
|
|
"""
|
|
grass_region = ""
|
|
grass_region = ""
|
|
-
|
|
|
|
|
|
+
|
|
if windres:
|
|
if windres:
|
|
compRegion = self.GetRegion()
|
|
compRegion = self.GetRegion()
|
|
region = copy.copy(self.region)
|
|
region = copy.copy(self.region)
|
|
@@ -720,41 +711,39 @@ class Map(object):
|
|
continue
|
|
continue
|
|
else:
|
|
else:
|
|
grass_region += key + ": " + self.wind[key] + "; "
|
|
grass_region += key + ": " + self.wind[key] + "; "
|
|
-
|
|
|
|
|
|
+
|
|
Debug.msg (3, "Map.SetRegion(): %s" % grass_region)
|
|
Debug.msg (3, "Map.SetRegion(): %s" % grass_region)
|
|
-
|
|
|
|
|
|
+
|
|
return grass_region
|
|
return grass_region
|
|
-
|
|
|
|
|
|
+
|
|
except:
|
|
except:
|
|
return None
|
|
return None
|
|
-
|
|
|
|
|
|
+
|
|
def GetListOfLayers(self, l_type=None, l_mapset=None, l_name=None,
|
|
def GetListOfLayers(self, l_type=None, l_mapset=None, l_name=None,
|
|
l_active=None, l_hidden=None):
|
|
l_active=None, l_hidden=None):
|
|
- """
|
|
|
|
- Returns list of layers of selected properties or list of all
|
|
|
|
- layers.
|
|
|
|
|
|
+ """!Returns list of layers of selected properties or list of
|
|
|
|
+ all layers.
|
|
|
|
|
|
@param l_type layer type, e.g. raster/vector/wms/overlay (value or tuple of values)
|
|
@param l_type layer type, e.g. raster/vector/wms/overlay (value or tuple of values)
|
|
@param l_mapset all layers from given mapset (only for maplayers)
|
|
@param l_mapset all layers from given mapset (only for maplayers)
|
|
@param l_name all layers with given name
|
|
@param l_name all layers with given name
|
|
@param l_active only layers with 'active' attribute set to True or False
|
|
@param l_active only layers with 'active' attribute set to True or False
|
|
@param l_hidden only layers with 'hidden' attribute set to True or False
|
|
@param l_hidden only layers with 'hidden' attribute set to True or False
|
|
-
|
|
|
|
|
|
+
|
|
@return list of selected layers
|
|
@return list of selected layers
|
|
"""
|
|
"""
|
|
-
|
|
|
|
selected = []
|
|
selected = []
|
|
-
|
|
|
|
|
|
+
|
|
if type(l_type) == type(''):
|
|
if type(l_type) == type(''):
|
|
one_type = True
|
|
one_type = True
|
|
else:
|
|
else:
|
|
one_type = False
|
|
one_type = False
|
|
-
|
|
|
|
|
|
+
|
|
if one_type and l_type == 'overlay':
|
|
if one_type and l_type == 'overlay':
|
|
list = self.overlays
|
|
list = self.overlays
|
|
else:
|
|
else:
|
|
list = self.layers
|
|
list = self.layers
|
|
-
|
|
|
|
|
|
+
|
|
# ["raster", "vector", "wms", ... ]
|
|
# ["raster", "vector", "wms", ... ]
|
|
for layer in list:
|
|
for layer in list:
|
|
# specified type only
|
|
# specified type only
|
|
@@ -763,39 +752,39 @@ class Map(object):
|
|
continue
|
|
continue
|
|
elif not one_type and layer.type not in l_type:
|
|
elif not one_type and layer.type not in l_type:
|
|
continue
|
|
continue
|
|
-
|
|
|
|
|
|
+
|
|
# mapset
|
|
# mapset
|
|
if (l_mapset != None and type != 'overlay') and \
|
|
if (l_mapset != None and type != 'overlay') and \
|
|
layer.GetMapset() != l_mapset:
|
|
layer.GetMapset() != l_mapset:
|
|
continue
|
|
continue
|
|
-
|
|
|
|
|
|
+
|
|
# name
|
|
# name
|
|
if l_name != None and layer.name != l_name:
|
|
if l_name != None and layer.name != l_name:
|
|
continue
|
|
continue
|
|
-
|
|
|
|
|
|
+
|
|
# hidden and active layers
|
|
# hidden and active layers
|
|
if l_active != None and \
|
|
if l_active != None and \
|
|
l_hidden != None:
|
|
l_hidden != None:
|
|
if layer.active == l_active and \
|
|
if layer.active == l_active and \
|
|
layer.hidden == l_hidden:
|
|
layer.hidden == l_hidden:
|
|
selected.append(layer)
|
|
selected.append(layer)
|
|
-
|
|
|
|
|
|
+
|
|
# active layers
|
|
# active layers
|
|
elif l_active != None:
|
|
elif l_active != None:
|
|
if layer.active == l_active:
|
|
if layer.active == l_active:
|
|
selected.append(layer)
|
|
selected.append(layer)
|
|
-
|
|
|
|
|
|
+
|
|
# hidden layers
|
|
# hidden layers
|
|
elif l_hidden != None:
|
|
elif l_hidden != None:
|
|
if layer.hidden == l_hidden:
|
|
if layer.hidden == l_hidden:
|
|
selected.append(layer)
|
|
selected.append(layer)
|
|
-
|
|
|
|
|
|
+
|
|
# all layers
|
|
# all layers
|
|
else:
|
|
else:
|
|
selected.append(layer)
|
|
selected.append(layer)
|
|
-
|
|
|
|
|
|
+
|
|
Debug.msg (3, "Map.GetListOfLayers(): numberof=%d" % len(selected))
|
|
Debug.msg (3, "Map.GetListOfLayers(): numberof=%d" % len(selected))
|
|
-
|
|
|
|
|
|
+
|
|
return selected
|
|
return selected
|
|
|
|
|
|
def _renderLayers(self, force, mapWindow, maps, masks, opacities):
|
|
def _renderLayers(self, force, mapWindow, maps, masks, opacities):
|
|
@@ -828,11 +817,10 @@ class Map(object):
|
|
|
|
|
|
Debug.msg (3, "Map.Render() type=%s, layer=%s " % (layer.type, layer.name))
|
|
Debug.msg (3, "Map.Render() type=%s, layer=%s " % (layer.type, layer.name))
|
|
ilayer += 1
|
|
ilayer += 1
|
|
-
|
|
|
|
|
|
+
|
|
def Render(self, force=False, mapWindow=None, windres=False):
|
|
def Render(self, force=False, mapWindow=None, windres=False):
|
|
- """
|
|
|
|
- Creates final image composite
|
|
|
|
-
|
|
|
|
|
|
+ """!Creates final image composite
|
|
|
|
+
|
|
This function can conditionaly use high-level tools, which
|
|
This function can conditionaly use high-level tools, which
|
|
should be avaliable in wxPython library
|
|
should be avaliable in wxPython library
|
|
|
|
|
|
@@ -845,12 +833,12 @@ class Map(object):
|
|
maps = []
|
|
maps = []
|
|
masks =[]
|
|
masks =[]
|
|
opacities = []
|
|
opacities = []
|
|
-
|
|
|
|
|
|
+
|
|
# use external gisrc if defined
|
|
# use external gisrc if defined
|
|
gisrc_orig = os.getenv("GISRC")
|
|
gisrc_orig = os.getenv("GISRC")
|
|
if self.gisrc:
|
|
if self.gisrc:
|
|
os.environ["GISRC"] = self.gisrc
|
|
os.environ["GISRC"] = self.gisrc
|
|
-
|
|
|
|
|
|
+
|
|
tmp_region = os.getenv("GRASS_REGION")
|
|
tmp_region = os.getenv("GRASS_REGION")
|
|
os.environ["GRASS_REGION"] = self.SetRegion(windres)
|
|
os.environ["GRASS_REGION"] = self.SetRegion(windres)
|
|
os.environ["GRASS_WIDTH"] = str(self.width)
|
|
os.environ["GRASS_WIDTH"] = str(self.width)
|
|
@@ -865,7 +853,7 @@ class Map(object):
|
|
os.environ["GRASS_RENDER_IMMEDIATE"] = "png"
|
|
os.environ["GRASS_RENDER_IMMEDIATE"] = "png"
|
|
else:
|
|
else:
|
|
os.environ["GRASS_RENDER_IMMEDIATE"] = "TRUE"
|
|
os.environ["GRASS_RENDER_IMMEDIATE"] = "TRUE"
|
|
-
|
|
|
|
|
|
+
|
|
os.environ["GRASS_PNG_READ"] = "FALSE"
|
|
os.environ["GRASS_PNG_READ"] = "FALSE"
|
|
|
|
|
|
self._renderLayers(force, mapWindow, maps, masks, opacities)
|
|
self._renderLayers(force, mapWindow, maps, masks, opacities)
|
|
@@ -885,7 +873,7 @@ class Map(object):
|
|
maskstr += item.replace('\\', '/')
|
|
maskstr += item.replace('\\', '/')
|
|
maskstr = maskstr.rstrip(',')
|
|
maskstr = maskstr.rstrip(',')
|
|
mapoutstr = self.mapfile.replace('\\', '/')
|
|
mapoutstr = self.mapfile.replace('\\', '/')
|
|
-
|
|
|
|
|
|
+
|
|
# compose command
|
|
# compose command
|
|
bgcolor = ':'.join(map(str, UserSettings.Get(group='display', key='bgcolor',
|
|
bgcolor = ':'.join(map(str, UserSettings.Get(group='display', key='bgcolor',
|
|
subkey='color')))
|
|
subkey='color')))
|
|
@@ -918,21 +906,20 @@ class Map(object):
|
|
if ret != 0:
|
|
if ret != 0:
|
|
print >> sys.stderr, _("ERROR: Rendering failed")
|
|
print >> sys.stderr, _("ERROR: Rendering failed")
|
|
return None
|
|
return None
|
|
-
|
|
|
|
|
|
+
|
|
# back to original gisrc
|
|
# back to original gisrc
|
|
if self.gisrc:
|
|
if self.gisrc:
|
|
os.environ["GISRC"] = gisrc_orig
|
|
os.environ["GISRC"] = gisrc_orig
|
|
-
|
|
|
|
- Debug.msg (2, "Map.Render() force=%s file=%s" % (force, self.mapfile))
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ Debug.msg (3, "Map.Render() force=%s file=%s" % (force, self.mapfile))
|
|
|
|
+
|
|
return self.mapfile
|
|
return self.mapfile
|
|
|
|
|
|
def AddLayer(self, type, command, name=None,
|
|
def AddLayer(self, type, command, name=None,
|
|
l_active=True, l_hidden=False, l_opacity=1.0, l_render=False,
|
|
l_active=True, l_hidden=False, l_opacity=1.0, l_render=False,
|
|
pos=-1):
|
|
pos=-1):
|
|
- """
|
|
|
|
- Adds generic map layer to list of layers
|
|
|
|
-
|
|
|
|
|
|
+ """!Adds generic map layer to list of layers
|
|
|
|
+
|
|
@param type layer type ('raster', 'vector', etc.)
|
|
@param type layer type ('raster', 'vector', etc.)
|
|
@param command GRASS command given as list
|
|
@param command GRASS command given as list
|
|
@param name layer name
|
|
@param name layer name
|
|
@@ -941,18 +928,17 @@ class Map(object):
|
|
@param l_opacity opacity level range from 0(transparent) - 1(not transparent)
|
|
@param l_opacity opacity level range from 0(transparent) - 1(not transparent)
|
|
@param l_render render an image if True
|
|
@param l_render render an image if True
|
|
@param pos position in layer list (-1 for append)
|
|
@param pos position in layer list (-1 for append)
|
|
-
|
|
|
|
|
|
+
|
|
@return new layer on success
|
|
@return new layer on success
|
|
@return None on failure
|
|
@return None on failure
|
|
-
|
|
|
|
"""
|
|
"""
|
|
# l_opacity must be <0;1>
|
|
# l_opacity must be <0;1>
|
|
if l_opacity < 0: l_opacity = 0
|
|
if l_opacity < 0: l_opacity = 0
|
|
elif l_opacity > 1: l_opacity = 1
|
|
elif l_opacity > 1: l_opacity = 1
|
|
-
|
|
|
|
|
|
+
|
|
layer = MapLayer(type=type, name=name, cmd=command,
|
|
layer = MapLayer(type=type, name=name, cmd=command,
|
|
active=l_active, hidden=l_hidden, opacity=l_opacity)
|
|
active=l_active, hidden=l_hidden, opacity=l_opacity)
|
|
-
|
|
|
|
|
|
+
|
|
# add maplayer to the list of layers
|
|
# add maplayer to the list of layers
|
|
if pos > -1:
|
|
if pos > -1:
|
|
self.layers.insert(pos, layer)
|
|
self.layers.insert(pos, layer)
|
|
@@ -963,26 +949,24 @@ class Map(object):
|
|
if l_render:
|
|
if l_render:
|
|
if not layer.Render():
|
|
if not layer.Render():
|
|
raise gcmd.GStdError(_("Unable to render map layer <%s>.") % (name))
|
|
raise gcmd.GStdError(_("Unable to render map layer <%s>.") % (name))
|
|
-
|
|
|
|
|
|
+
|
|
return layer
|
|
return layer
|
|
|
|
|
|
def DeleteLayer(self, layer, overlay=False):
|
|
def DeleteLayer(self, layer, overlay=False):
|
|
- """
|
|
|
|
- Removes layer from list of layers
|
|
|
|
-
|
|
|
|
|
|
+ """!Removes layer from list of layers
|
|
|
|
+
|
|
@param layer layer instance in layer tree
|
|
@param layer layer instance in layer tree
|
|
@param overlay delete overlay (use self.DeleteOverlay() instead)
|
|
@param overlay delete overlay (use self.DeleteOverlay() instead)
|
|
|
|
|
|
@return removed layer on success or None
|
|
@return removed layer on success or None
|
|
"""
|
|
"""
|
|
-
|
|
|
|
Debug.msg (3, "Map.DeleteLayer(): name=%s" % layer.name)
|
|
Debug.msg (3, "Map.DeleteLayer(): name=%s" % layer.name)
|
|
-
|
|
|
|
|
|
+
|
|
if overlay:
|
|
if overlay:
|
|
list = self.overlays
|
|
list = self.overlays
|
|
else:
|
|
else:
|
|
list = self.layers
|
|
list = self.layers
|
|
-
|
|
|
|
|
|
+
|
|
if layer in list:
|
|
if layer in list:
|
|
if layer.mapfile:
|
|
if layer.mapfile:
|
|
base = os.path.split(layer.mapfile)[0]
|
|
base = os.path.split(layer.mapfile)[0]
|
|
@@ -994,29 +978,27 @@ class Map(object):
|
|
for f in glob.glob(basefile):
|
|
for f in glob.glob(basefile):
|
|
os.remove(f)
|
|
os.remove(f)
|
|
list.remove(layer)
|
|
list.remove(layer)
|
|
-
|
|
|
|
|
|
+
|
|
return layer
|
|
return layer
|
|
-
|
|
|
|
|
|
+
|
|
return None
|
|
return None
|
|
|
|
|
|
def ReorderLayers(self, layerList):
|
|
def ReorderLayers(self, layerList):
|
|
- """
|
|
|
|
- Reorder list to match layer tree
|
|
|
|
-
|
|
|
|
|
|
+ """!Reorder list to match layer tree
|
|
|
|
+
|
|
@param layerList list of layers
|
|
@param layerList list of layers
|
|
"""
|
|
"""
|
|
self.layers = layerList
|
|
self.layers = layerList
|
|
-
|
|
|
|
|
|
+
|
|
layerNameList = ""
|
|
layerNameList = ""
|
|
for layer in self.layers:
|
|
for layer in self.layers:
|
|
if layer.name:
|
|
if layer.name:
|
|
layerNameList += layer.name + ','
|
|
layerNameList += layer.name + ','
|
|
Debug.msg (4, "Map.ReoderLayers(): layers=%s" % \
|
|
Debug.msg (4, "Map.ReoderLayers(): layers=%s" % \
|
|
(layerNameList))
|
|
(layerNameList))
|
|
-
|
|
|
|
|
|
+
|
|
def ChangeLayer(self, layer, render=False, **kargs):
|
|
def ChangeLayer(self, layer, render=False, **kargs):
|
|
- """
|
|
|
|
- Change map layer properties
|
|
|
|
|
|
+ """!Change map layer properties
|
|
|
|
|
|
@param layer map layer instance
|
|
@param layer map layer instance
|
|
@param type layer type ('raster', 'vector', etc.)
|
|
@param type layer type ('raster', 'vector', etc.)
|
|
@@ -1027,7 +1009,6 @@ class Map(object):
|
|
@param opacity opacity level range from 0(transparent) - 1(not transparent)
|
|
@param opacity opacity level range from 0(transparent) - 1(not transparent)
|
|
@param render render an image if True
|
|
@param render render an image if True
|
|
"""
|
|
"""
|
|
-
|
|
|
|
Debug.msg (3, "Map.ChangeLayer(): layer=%s" % layer.name)
|
|
Debug.msg (3, "Map.ChangeLayer(): layer=%s" % layer.name)
|
|
|
|
|
|
if kargs.has_key('type'):
|
|
if kargs.has_key('type'):
|
|
@@ -1038,25 +1019,24 @@ class Map(object):
|
|
|
|
|
|
if kargs.has_key('name'):
|
|
if kargs.has_key('name'):
|
|
layer.SetName(kargs['name'])
|
|
layer.SetName(kargs['name'])
|
|
-
|
|
|
|
|
|
+
|
|
if kargs.has_key('active'):
|
|
if kargs.has_key('active'):
|
|
layer.SetActive(kargs['active'])
|
|
layer.SetActive(kargs['active'])
|
|
-
|
|
|
|
|
|
+
|
|
if kargs.has_key('hidden'):
|
|
if kargs.has_key('hidden'):
|
|
layer.SetHidden(kargs['hidden'])
|
|
layer.SetHidden(kargs['hidden'])
|
|
-
|
|
|
|
|
|
+
|
|
if kargs.has_key('opacity'):
|
|
if kargs.has_key('opacity'):
|
|
layer.SetOpacity(kargs['opacity'])
|
|
layer.SetOpacity(kargs['opacity'])
|
|
-
|
|
|
|
|
|
+
|
|
if render and not layer.Render():
|
|
if render and not layer.Render():
|
|
raise gcmd.GException(_("Unable to render map layer <%s>.") %
|
|
raise gcmd.GException(_("Unable to render map layer <%s>.") %
|
|
(name))
|
|
(name))
|
|
-
|
|
|
|
|
|
+
|
|
return layer
|
|
return layer
|
|
|
|
|
|
def ChangeOpacity(self, layer, l_opacity):
|
|
def ChangeOpacity(self, layer, l_opacity):
|
|
- """
|
|
|
|
- Changes opacity value of map layer
|
|
|
|
|
|
+ """!Changes opacity value of map layer
|
|
|
|
|
|
@param layer layer instance in layer tree
|
|
@param layer layer instance in layer tree
|
|
@param l_opacity opacity level <0;1>
|
|
@param l_opacity opacity level <0;1>
|
|
@@ -1064,27 +1044,25 @@ class Map(object):
|
|
# l_opacity must be <0;1>
|
|
# l_opacity must be <0;1>
|
|
if l_opacity < 0: l_opacity = 0
|
|
if l_opacity < 0: l_opacity = 0
|
|
elif l_opacity > 1: l_opacity = 1
|
|
elif l_opacity > 1: l_opacity = 1
|
|
-
|
|
|
|
|
|
+
|
|
layer.opacity = l_opacity
|
|
layer.opacity = l_opacity
|
|
Debug.msg (3, "Map.ChangeOpacity(): layer=%s, opacity=%f" % \
|
|
Debug.msg (3, "Map.ChangeOpacity(): layer=%s, opacity=%f" % \
|
|
(layer.name, layer.opacity))
|
|
(layer.name, layer.opacity))
|
|
|
|
|
|
def ChangeLayerActive(self, layer, active):
|
|
def ChangeLayerActive(self, layer, active):
|
|
- """
|
|
|
|
- Enable or disable map layer
|
|
|
|
-
|
|
|
|
|
|
+ """!Enable or disable map layer
|
|
|
|
+
|
|
@param layer layer instance in layer tree
|
|
@param layer layer instance in layer tree
|
|
@param active to be rendered (True)
|
|
@param active to be rendered (True)
|
|
"""
|
|
"""
|
|
layer.active = active
|
|
layer.active = active
|
|
-
|
|
|
|
|
|
+
|
|
Debug.msg (3, "Map.ChangeLayerActive(): name='%s' -> active=%d" % \
|
|
Debug.msg (3, "Map.ChangeLayerActive(): name='%s' -> active=%d" % \
|
|
(layer.name, layer.active))
|
|
(layer.name, layer.active))
|
|
|
|
|
|
def ChangeLayerName (self, layer, name):
|
|
def ChangeLayerName (self, layer, name):
|
|
- """
|
|
|
|
- Change name of the layer
|
|
|
|
-
|
|
|
|
|
|
+ """!Change name of the layer
|
|
|
|
+
|
|
@param layer layer instance in layer tree
|
|
@param layer layer instance in layer tree
|
|
@param name layer name to set up
|
|
@param name layer name to set up
|
|
"""
|
|
"""
|
|
@@ -1093,18 +1071,16 @@ class Map(object):
|
|
layer.name = name
|
|
layer.name = name
|
|
|
|
|
|
def RemoveLayer(self, name=None, id=None):
|
|
def RemoveLayer(self, name=None, id=None):
|
|
- """
|
|
|
|
- Removes layer from layer list
|
|
|
|
-
|
|
|
|
|
|
+ """!Removes layer from layer list
|
|
|
|
+
|
|
Layer is defined by name@mapset or id.
|
|
Layer is defined by name@mapset or id.
|
|
-
|
|
|
|
|
|
+
|
|
@param name layer name (must be unique)
|
|
@param name layer name (must be unique)
|
|
@param id layer index in layer list
|
|
@param id layer index in layer list
|
|
|
|
|
|
@return removed layer on success
|
|
@return removed layer on success
|
|
@return None on failure
|
|
@return None on failure
|
|
"""
|
|
"""
|
|
-
|
|
|
|
# delete by name
|
|
# delete by name
|
|
if name:
|
|
if name:
|
|
retlayer = None
|
|
retlayer = None
|
|
@@ -1118,13 +1094,12 @@ class Map(object):
|
|
# del by id
|
|
# del by id
|
|
elif id != None:
|
|
elif id != None:
|
|
return self.layers.pop(id)
|
|
return self.layers.pop(id)
|
|
-
|
|
|
|
|
|
+
|
|
return None
|
|
return None
|
|
|
|
|
|
def GetLayerIndex(self, layer, overlay=False):
|
|
def GetLayerIndex(self, layer, overlay=False):
|
|
- """
|
|
|
|
- Get index of layer in layer list.
|
|
|
|
-
|
|
|
|
|
|
+ """!Get index of layer in layer list.
|
|
|
|
+
|
|
@param layer layer instace in layer tree
|
|
@param layer layer instace in layer tree
|
|
@param overlay use list of overlays instead
|
|
@param overlay use list of overlays instead
|
|
|
|
|
|
@@ -1138,13 +1113,13 @@ class Map(object):
|
|
|
|
|
|
if layer in list:
|
|
if layer in list:
|
|
return list.index(layer)
|
|
return list.index(layer)
|
|
-
|
|
|
|
|
|
+
|
|
return -1
|
|
return -1
|
|
|
|
|
|
def AddOverlay(self, id, type, command,
|
|
def AddOverlay(self, id, type, command,
|
|
l_active=True, l_hidden=True, l_opacity=1.0, l_render=False):
|
|
l_active=True, l_hidden=True, l_opacity=1.0, l_render=False):
|
|
- """
|
|
|
|
- Adds overlay (grid, barscale, legend, etc.) to list of overlays
|
|
|
|
|
|
+ """!Adds overlay (grid, barscale, legend, etc.) to list of
|
|
|
|
+ overlays
|
|
|
|
|
|
@param id overlay id (PseudoDC)
|
|
@param id overlay id (PseudoDC)
|
|
@param type overlay type (barscale, legend)
|
|
@param type overlay type (barscale, legend)
|
|
@@ -1152,37 +1127,35 @@ class Map(object):
|
|
@param l_active overlay activated (True) or disabled (False)
|
|
@param l_active overlay activated (True) or disabled (False)
|
|
@param l_hidden overlay is not shown in layer tree (if True)
|
|
@param l_hidden overlay is not shown in layer tree (if True)
|
|
@param l_render render an image (if True)
|
|
@param l_render render an image (if True)
|
|
-
|
|
|
|
|
|
+
|
|
@return new layer on success
|
|
@return new layer on success
|
|
@retutn None on failure
|
|
@retutn None on failure
|
|
"""
|
|
"""
|
|
-
|
|
|
|
Debug.msg (2, "Map.AddOverlay(): cmd=%s, render=%d" % (command, l_render))
|
|
Debug.msg (2, "Map.AddOverlay(): cmd=%s, render=%d" % (command, l_render))
|
|
overlay = Overlay(id=id, type=type, cmd=command,
|
|
overlay = Overlay(id=id, type=type, cmd=command,
|
|
active=l_active, hidden=l_hidden, opacity=l_opacity)
|
|
active=l_active, hidden=l_hidden, opacity=l_opacity)
|
|
-
|
|
|
|
|
|
+
|
|
# add maplayer to the list of layers
|
|
# add maplayer to the list of layers
|
|
self.overlays.append(overlay)
|
|
self.overlays.append(overlay)
|
|
-
|
|
|
|
|
|
+
|
|
if l_render and command != '' and not overlay.Render():
|
|
if l_render and command != '' and not overlay.Render():
|
|
raise gcmd.GException(_("Unable render overlay <%s>.") %
|
|
raise gcmd.GException(_("Unable render overlay <%s>.") %
|
|
(name))
|
|
(name))
|
|
-
|
|
|
|
|
|
+
|
|
return self.overlays[-1]
|
|
return self.overlays[-1]
|
|
|
|
|
|
def ChangeOverlay(self, id, render=False, **kargs):
|
|
def ChangeOverlay(self, id, render=False, **kargs):
|
|
- """
|
|
|
|
- Change overlay properities
|
|
|
|
-
|
|
|
|
|
|
+ """!Change overlay properities
|
|
|
|
+
|
|
Add new overlay if overlay with 'id' doesn't exist.
|
|
Add new overlay if overlay with 'id' doesn't exist.
|
|
-
|
|
|
|
|
|
+
|
|
@param id overlay id (PseudoDC)
|
|
@param id overlay id (PseudoDC)
|
|
@param type overlay type (barscale, legend)
|
|
@param type overlay type (barscale, legend)
|
|
@param command GRASS command to render overlay
|
|
@param command GRASS command to render overlay
|
|
@param l_active overlay activated (True) or disabled (False)
|
|
@param l_active overlay activated (True) or disabled (False)
|
|
@param l_hidden overlay is not shown in layer tree (if True)
|
|
@param l_hidden overlay is not shown in layer tree (if True)
|
|
@param l_render render an image (if True)
|
|
@param l_render render an image (if True)
|
|
-
|
|
|
|
|
|
+
|
|
@return new layer on success
|
|
@return new layer on success
|
|
"""
|
|
"""
|
|
overlay = self.GetOverlay(id, list=False)
|
|
overlay = self.GetOverlay(id, list=False)
|
|
@@ -1197,10 +1170,10 @@ class Map(object):
|
|
|
|
|
|
if kargs.has_key('active'):
|
|
if kargs.has_key('active'):
|
|
overlay.SetActive(kargs['active'])
|
|
overlay.SetActive(kargs['active'])
|
|
-
|
|
|
|
|
|
+
|
|
if kargs.has_key('hidden'):
|
|
if kargs.has_key('hidden'):
|
|
overlay.SetHidden(kargs['hidden'])
|
|
overlay.SetHidden(kargs['hidden'])
|
|
-
|
|
|
|
|
|
+
|
|
if kargs.has_key('opacity'):
|
|
if kargs.has_key('opacity'):
|
|
overlay.SetOpacity(kargs['opacity'])
|
|
overlay.SetOpacity(kargs['opacity'])
|
|
|
|
|
|
@@ -1212,7 +1185,7 @@ class Map(object):
|
|
|
|
|
|
def GetOverlay(self, id, list=False):
|
|
def GetOverlay(self, id, list=False):
|
|
"""!Return overlay(s) with 'id'
|
|
"""!Return overlay(s) with 'id'
|
|
-
|
|
|
|
|
|
+
|
|
@param id overlay id
|
|
@param id overlay id
|
|
@param list return list of overlays of True
|
|
@param list return list of overlays of True
|
|
otherwise suppose 'id' to be unique
|
|
otherwise suppose 'id' to be unique
|
|
@@ -1231,23 +1204,22 @@ class Map(object):
|
|
return None
|
|
return None
|
|
else:
|
|
else:
|
|
return ovl[0]
|
|
return ovl[0]
|
|
-
|
|
|
|
|
|
+
|
|
return ovl
|
|
return ovl
|
|
|
|
|
|
def DeleteOverlay(self, overlay):
|
|
def DeleteOverlay(self, overlay):
|
|
"""!Delete overlay
|
|
"""!Delete overlay
|
|
-
|
|
|
|
|
|
+
|
|
@param id overlay id
|
|
@param id overlay id
|
|
-
|
|
|
|
|
|
+
|
|
@return removed overlay on success or None
|
|
@return removed overlay on success or None
|
|
"""
|
|
"""
|
|
return self.DeleteLayer(overlay, overlay=True)
|
|
return self.DeleteLayer(overlay, overlay=True)
|
|
|
|
|
|
def Clean(self):
|
|
def Clean(self):
|
|
- """
|
|
|
|
- Clean layer stack - go trough all layers and remove them from layer list
|
|
|
|
- Removes also l_mapfile and l_maskfile
|
|
|
|
-
|
|
|
|
|
|
+ """!Clean layer stack - go trough all layers and remove them
|
|
|
|
+ from layer list Removes also l_mapfile and l_maskfile
|
|
|
|
+
|
|
@return 1 on faulure
|
|
@return 1 on faulure
|
|
@return None on success
|
|
@return None on success
|
|
"""
|
|
"""
|
|
@@ -1265,7 +1237,7 @@ class Map(object):
|
|
for f in glob.glob(removepath):
|
|
for f in glob.glob(removepath):
|
|
os.remove(f)
|
|
os.remove(f)
|
|
self.layers.remove(layer)
|
|
self.layers.remove(layer)
|
|
-
|
|
|
|
|
|
+
|
|
for overlay in self.overlays:
|
|
for overlay in self.overlays:
|
|
if overlay.mapfile:
|
|
if overlay.mapfile:
|
|
dir = os.path.dirname(overlay.mapfile)
|
|
dir = os.path.dirname(overlay.mapfile)
|
|
@@ -1284,31 +1256,30 @@ class Map(object):
|
|
return self.layers.reverse()
|
|
return self.layers.reverse()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if __name__ == "__main__":
|
|
- """
|
|
|
|
- Test of Display class.
|
|
|
|
|
|
+ """!Test of Display class.
|
|
Usage: display=Render()
|
|
Usage: display=Render()
|
|
"""
|
|
"""
|
|
-
|
|
|
|
import gettext
|
|
import gettext
|
|
gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True)
|
|
gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True)
|
|
-
|
|
|
|
|
|
+
|
|
print "Initializing..."
|
|
print "Initializing..."
|
|
- os.system("g.region -d")
|
|
|
|
-
|
|
|
|
|
|
+ grass.run_command("g.region", flags="d")
|
|
|
|
+
|
|
map = Map()
|
|
map = Map()
|
|
map.width = 640
|
|
map.width = 640
|
|
map.height = 480
|
|
map.height = 480
|
|
-
|
|
|
|
|
|
+
|
|
map.AddLayer(type="raster",
|
|
map.AddLayer(type="raster",
|
|
name="elevation.dem",
|
|
name="elevation.dem",
|
|
command = ["d.rast", "elevation.dem@PERMANENT", "catlist=1000-1500", "-i"],
|
|
command = ["d.rast", "elevation.dem@PERMANENT", "catlist=1000-1500", "-i"],
|
|
l_opacity=.7)
|
|
l_opacity=.7)
|
|
-
|
|
|
|
|
|
+
|
|
map.AddLayer(type="vector",
|
|
map.AddLayer(type="vector",
|
|
name="streams",
|
|
name="streams",
|
|
command = ["d.vect", "streams@PERMANENT", "color=red", "width=3", "type=line"])
|
|
command = ["d.vect", "streams@PERMANENT", "color=red", "width=3", "type=line"])
|
|
-
|
|
|
|
|
|
+
|
|
image = map.Render(force=True)
|
|
image = map.Render(force=True)
|
|
-
|
|
|
|
|
|
+
|
|
if image:
|
|
if image:
|
|
os.system("display %s" % image)
|
|
os.system("display %s" % image)
|
|
|
|
+
|