123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- # -*- coding: utf-8 -*-
- #!/usr/bin/env python2.7
- from __future__ import print_function
- #import os
- from os import listdir
- from os.path import join
- import ctypes as ct
- import fnmatch
- from grass import script
- #from grass.script import setup
- #
- #
- #GISBASE = "/home/pietro/docdat/src/gis/grass/grass70/dist.x86_64-unknown-linux-gnu"
- #LOCATION = "nc_basic_spm_grass7'"
- #GISDBASE = "/home/pietro/docdat/gis"
- #MAPSET = "sqlite"
- #GUI = "wxpython"
- #
- #setup.init(GISBASE, GISDBASE, LOCATION, MAPSET)
- script.gisenv()
- import grass.lib.gis as libgis
- from grass.pygrass.functions import getenv
- from grass.pygrass.errors import GrassError
- import region
- #write dec to check if user have permissions or not
- ETYPE = {'rast': libgis.G_ELEMENT_RASTER,
- 'rast3d': libgis.G_ELEMENT_RASTER3D,
- 'vect': libgis.G_ELEMENT_VECTOR,
- 'oldvect': libgis.G_ELEMENT_OLDVECTOR,
- 'asciivect': libgis.G_ELEMENT_ASCIIVECTOR,
- 'icon': libgis.G_ELEMENT_ICON,
- 'labels': libgis.G_ELEMENT_LABEL,
- 'sites': libgis.G_ELEMENT_SITE,
- 'region': libgis.G_ELEMENT_REGION,
- 'region3d': libgis.G_ELEMENT_REGION3D,
- 'group': libgis.G_ELEMENT_GROUP,
- 'view3d': libgis.G_ELEMENT_3DVIEW}
- CHECK_IS = {"GISBASE": libgis.G_is_gisbase,
- "GISDBASE": lambda x: True,
- "LOCATION_NAME": libgis.G_is_location,
- "MAPSET": libgis.G_is_mapset}
- def _check(value, path, type):
- #import pdb; pdb.set_trace()
- if value and CHECK_IS[type](join(path, value)):
- return value
- elif value is '':
- return getenv(type)
- else:
- raise GrassError("%s <%s> not found." % (type.title(),
- join(path, value)))
- class Gisdbase(object):
- """Return Gisdbase object. ::
- >>> from grass.script.core import gisenv
- >>> gisdbase = Gisdbase()
- >>> gisdbase.name == gisenv()['GISDBASE']
- True
- """
- def __init__(self, gisdbase=''):
- self.name = gisdbase
- def _get_name(self):
- return self._name
- def _set_name(self, name):
- self._name = _check(name, '', "GISDBASE")
- name = property(fget=_get_name, fset=_set_name)
- def __str__(self):
- return self.name
- def __repr__(self):
- return 'Gisdbase(%s)' % self.name
- def __getitem__(self, location):
- """Return a Location object. ::
- >>> from grass.script.core import gisenv
- >>> loc_env = gisenv()['LOCATION_NAME']
- >>> gisdbase = Gisdbase()
- >>> loc_py = gisdbase[loc_env]
- >>> loc_env == loc_py.name
- True
- ..
- """
- if location in self.locations():
- return Location(location, self.name)
- else:
- raise KeyError('Location: %s does not exist' % location)
- def __iter__(self):
- for loc in self.locations():
- yield Location(loc, self.name)
- def new_location(self):
- if libgis.G__make_location() != 0:
- raise GrassError("I cannot create a new mapset.")
- def locations(self):
- """Return a list of locations that are available in the gisdbase: ::
- >>> gisdbase = Gisdbase()
- >>> gisdbase.locations() # doctest: +ELLIPSIS
- [...]
- ..
- """
- locations = []
- for loc in listdir(self.name):
- if libgis.G_is_location(join(self.name, loc)):
- locations.append(loc)
- locations.sort()
- return locations
- class Location(object):
- """Location object ::
- >>> from grass.script.core import gisenv
- >>> location = Location()
- >>> location # doctest: +ELLIPSIS
- Location(...)
- >>> location.gisdbase == gisenv()['GISDBASE']
- True
- >>> location.name == gisenv()['LOCATION_NAME']
- True
- """
- def __init__(self, location='', gisdbase=''):
- self.gisdbase = gisdbase
- self.name = location
- def _get_gisdb(self):
- return self._gisdb
- def _set_gisdb(self, gisdb):
- self._gisdb = _check(gisdb, '', "GISDBASE")
- gisdbase = property(fget=_get_gisdb, fset=_set_gisdb)
- def _get_name(self):
- return self._name
- def _set_name(self, name):
- self._name = _check(name, self._gisdb, "LOCATION_NAME")
- name = property(fget=_get_name, fset=_set_name)
- def __getitem__(self, mapset):
- if mapset in self.mapsets():
- return Mapset(mapset)
- else:
- raise KeyError('Mapset: %s does not exist' % mapset)
- def __iter__(self):
- for mapset in libgis.G_available_mapsets():
- mapset_name = ct.cast(mapset, ct.c_char_p).value
- if mapset_name and libgis.G__mapset_permissions(mapset):
- yield mapset_name
- else:
- break
- def __len__(self):
- return len(self.mapsets())
- def __str__(self):
- return self.name
- def __repr__(self):
- return 'Location(%r)' % self.name
- def mapsets(self):
- """Return a list of the available mapsets. ::
- >>> location = Location()
- >>> location.mapsets()
- ['PERMANENT', 'user1']
- """
- return [mapset for mapset in self]
- def new_mapset(self, mapset):
- if libgis.G__make_mapset(self.gisdbase, self.location, mapset) != 0:
- raise GrassError("I cannot create a new mapset.")
- class Mapset(object):
- """Mapset ::
- >>> mapset = Mapset()
- >>> mapset
- Mapset('user1')
- >>> mapset.gisdbase # doctest: +ELLIPSIS
- '/home/...'
- >>> mapset.location
- 'nc_basic_spm_grass7'
- >>> mapset.name
- 'user1'
- """
- def __init__(self, mapset='', location='', gisdbase=''):
- self.gisdbase = gisdbase
- self.location = location
- self.name = mapset
- def _get_gisdb(self):
- return self._gisdb
- def _set_gisdb(self, gisdb):
- self._gisdb = _check(gisdb, '', "GISDBASE")
- gisdbase = property(fget=_get_gisdb, fset=_set_gisdb)
- def _get_loc(self):
- return self._loc
- def _set_loc(self, loc):
- self._loc = _check(loc, self._gisdb, "LOCATION_NAME")
- location = property(fget=_get_loc, fset=_set_loc)
- def _get_name(self):
- return self._name
- def _set_name(self, name):
- self._name = _check(name, join(self._gisdb, self._loc), "MAPSET")
- name = property(fget=_get_name, fset=_set_name)
- def __str__(self):
- return self.name
- def __repr__(self):
- return 'Mapset(%r)' % self.name
- def glist(self, type, pattern=None):
- """Return a list of grass types like:
- * 'asciivect',
- * 'group',
- * 'icon',
- * 'labels',
- * 'oldvect',
- * 'rast',
- * 'rast3d',
- * 'region',
- * 'region3d',
- * 'sites',
- * 'vect',
- * 'view3d'
- ::
- >>> mapset = Mapset('PERMANENT')
- >>> rast = mapset.glist('rast')
- >>> rast.sort()
- >>> rast # doctest: +ELLIPSIS
- ['basins', 'elevation', ...]
- >>> mapset.glist('rast', pattern='el*')
- ['elevation_shade', 'elevation']
- """
- if type not in ETYPE:
- str_err = "Type %s is not valid, valid types are: %s."
- raise TypeError(str_err % (type, ', '.join(ETYPE.keys())))
- clist = libgis.G_list(ETYPE[type], self.gisdbase,
- self.location, self.name)
- elist = []
- for el in clist:
- el_name = ct.cast(el, ct.c_char_p).value
- if el_name:
- elist.append(el_name)
- else:
- if pattern:
- return fnmatch.filter(elist, pattern)
- return elist
|