#!/usr/bin/env python3 ############################################################################ # # MODULE: r.pack # AUTHOR(S): Hamish Bowman, Otago University, New Zealand # Converted to Python by Martin Landa # PURPOSE: Pack up a raster map, collect raster map elements => gzip # COPYRIGHT: (C) 2004-2013 by the GRASS Development Team # # This program is free software under the GNU General # Public License (>=v2). Read the file COPYING that # comes with GRASS for details. # ############################################################################# # %module # % description: Exports a raster map as GRASS GIS specific archive file # % keyword: raster # % keyword: export # % keyword: copying # %end # %option G_OPT_R_INPUT # % description: Name of raster map to pack up # %end # %option G_OPT_F_OUTPUT # % description: Name for output file (default is .pack) # % required : no # %end # %flag # % key: c # % description: Switch the compression off # %end import os import sys import shutil import atexit import tarfile from grass.script.utils import try_rmdir, try_remove from grass.script import core as grass def cleanup(): try_rmdir(tmp) def main(): infile = options['input'] compression_off = flags['c'] mapset = None if '@' in infile: infile, mapset = infile.split('@') if options['output']: outfile_path, outfile_base = os.path.split(os.path.abspath(options['output'])) else: outfile_path, outfile_base = os.path.split(os.path.abspath(infile + ".pack")) outfile = os.path.join(outfile_path, outfile_base) global tmp tmp = grass.tempdir() tmp_dir = os.path.join(tmp, infile) os.mkdir(tmp_dir) grass.debug('tmp_dir = %s' % tmp_dir) gfile = grass.find_file(name=infile, element='cell', mapset=mapset) if not gfile['name']: grass.fatal(_("Raster map <%s> not found") % infile) if os.path.exists(outfile): if os.getenv('GRASS_OVERWRITE'): grass.warning(_("Pack file <%s> already exists and will be overwritten") % outfile) try_remove(outfile) else: grass.fatal(_("option : <%s> exists.") % outfile) grass.message(_("Packing <%s> to <%s>...") % (gfile['fullname'], outfile)) basedir = os.path.sep.join(os.path.normpath(gfile['file']).split(os.path.sep)[:-2]) olddir = os.getcwd() # copy elements info = grass.parse_command('r.info', flags='e', map=infile) vrt_files = {} if info['maptype'] == 'virtual': map_file = grass.find_file( name=infile, element='cell_misc', ) if map_file['file']: vrt = os.path.join(map_file['file'], 'vrt') if os.path.exists(vrt): with open(vrt, 'r') as f: for r in f.readlines(): map, mapset = r.split('@') map_basedir = os.path.sep.join( os.path.normpath( map_file['file'], ).split(os.path.sep)[:-2], ) vrt_files[map] = map_basedir for element in [ 'cats', 'cell', 'cellhd', 'cell_misc', 'colr', 'fcell', 'hist', ]: path = os.path.join(basedir, element, infile) if os.path.exists(path): grass.debug('copying %s' % path) if os.path.isfile(path): shutil.copyfile( path, os.path.join(tmp_dir, element), ) else: shutil.copytree( path, os.path.join(tmp_dir, element), ) # Copy vrt files if vrt_files: for f in vrt_files.keys(): f_tmp_dir = os.path.join(tmp, f) if not os.path.exists(f_tmp_dir): os.mkdir(f_tmp_dir) path = os.path.join(vrt_files[f], element, f) if os.path.exists(path): grass.debug("copying vrt file {}".format(path)) if os.path.isfile(path): shutil.copyfile( path, os.path.join(f_tmp_dir, element), ) else: shutil.copytree( path, os.path.join(f_tmp_dir, element), ) if not os.listdir(tmp_dir): grass.fatal(_("No raster map components found")) # copy projection info # (would prefer to use g.proj*, but this way is 5.3 and 5.7 compat) gisenv = grass.gisenv() for support in ['INFO', 'UNITS', 'EPSG']: path = os.path.join(gisenv['GISDBASE'], gisenv['LOCATION_NAME'], 'PERMANENT', 'PROJ_' + support) if os.path.exists(path): shutil.copyfile(path, os.path.join(tmp_dir, 'PROJ_' + support)) # pack it all up os.chdir(tmp) if compression_off: tar = tarfile.TarFile.open(name=outfile_base, mode='w:') else: tar = tarfile.TarFile.open(name=outfile_base, mode='w:gz') tar.add(infile, recursive=True) if vrt_files: for f in vrt_files.keys(): tar.add(f, recursive=True) tar.close() try: shutil.move(outfile_base, outfile) except shutil.Error as e: grass.fatal(e) os.chdir(olddir) grass.verbose(_("Raster map saved to '%s'" % outfile)) if __name__ == "__main__": options, flags = grass.parser() atexit.register(cleanup) sys.exit(main())