r.unpack.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/usr/bin/env python
  2. ############################################################################
  3. #
  4. # MODULE: r.unpack
  5. # AUTHOR(S): Hamish Bowman, Otago University, New Zealand
  6. # Converted to Python by Martin Landa <landa.martin gmail.com>
  7. # PURPOSE: Unpack up a raster map packed with r.pack
  8. # COPYRIGHT: (C) 2004-2008, 2010-2012 by the GRASS Development Team
  9. #
  10. # This program is free software under the GNU General
  11. # Public License (>=v2). Read the file COPYING that
  12. # comes with GRASS for details.
  13. #
  14. #############################################################################
  15. #%module
  16. #% description: Unpacks a raster map packed with r.pack.
  17. #% keywords: raster
  18. #% keywords: import
  19. #% keywords: copying
  20. #%end
  21. #%option G_OPT_F_INPUT
  22. #% description: Name of input pack file
  23. #% gisprompt: old,bin,file
  24. #% key_desc: name.pack
  25. #%end
  26. #%option G_OPT_R_OUTPUT
  27. #% description: Name for output raster map (default: taken from input file internals)
  28. #% required: no
  29. #% guisection: Output settings
  30. #%end
  31. #%flag
  32. #% key: o
  33. #% description: Override projection check (use current location's projection)
  34. #% guisection: Output settings
  35. #%end
  36. import os
  37. import sys
  38. import shutil
  39. import tarfile
  40. import atexit
  41. from grass.script.utils import diff_files, try_rmdir
  42. from grass.script import core as grass
  43. def cleanup():
  44. try_rmdir(tmp_dir)
  45. def main():
  46. infile = options['input']
  47. global tmp_dir
  48. tmp_dir = grass.tempdir()
  49. grass.debug('tmp_dir = %s' % tmp_dir)
  50. if not os.path.exists(infile):
  51. grass.fatal(_("File <%s> not found") % infile)
  52. gisenv = grass.gisenv()
  53. mset_dir = os.path.join(gisenv['GISDBASE'],
  54. gisenv['LOCATION_NAME'],
  55. gisenv['MAPSET'])
  56. input_base = os.path.basename(infile)
  57. shutil.copyfile(infile, os.path.join(tmp_dir, input_base))
  58. os.chdir(tmp_dir)
  59. tar = tarfile.TarFile.open(name=input_base, mode='r')
  60. try:
  61. data_name = tar.getnames()[0]
  62. except:
  63. grass.fatal(_("Pack file unreadable"))
  64. if options['output']:
  65. map_name = options['output']
  66. else:
  67. map_name = data_name.split('@')[0]
  68. gfile = grass.find_file(name=map_name, element='cell', mapset='.')
  69. if gfile['file']:
  70. if os.environ.get('GRASS_OVERWRITE', '0') != '1':
  71. grass.fatal(_("Raster map <%s> already exists") % map_name)
  72. else:
  73. grass.warning(_("Raster map <%s> already exists and will be overwritten") % map_name)
  74. # extract data
  75. tar.extractall()
  76. os.chdir(data_name)
  77. # check projection compatibility in a rather crappy way
  78. diff_result_1 = diff_result_2 = None
  79. proj_info_file_1 = 'PROJ_INFO'
  80. proj_info_file_2 = os.path.join(mset_dir, '..', 'PERMANENT', 'PROJ_INFO')
  81. if not grass.compare_key_value_text_files(filename_a=proj_info_file_1,
  82. filename_b=proj_info_file_2,
  83. proj=True):
  84. diff_result_1 = diff_files(proj_info_file_1, proj_info_file_2)
  85. proj_units_file_1 = 'PROJ_UNITS'
  86. proj_units_file_2 = os.path.join(mset_dir, '..', 'PERMANENT', 'PROJ_UNITS')
  87. if not grass.compare_key_value_text_files(filename_a=proj_units_file_1,
  88. filename_b=proj_units_file_2,
  89. units=True):
  90. diff_result_2 = diff_files(proj_units_file_1, proj_units_file_2)
  91. if diff_result_1 or diff_result_2:
  92. if flags['o']:
  93. grass.warning(_("Projection information does not match. Proceeding..."))
  94. else:
  95. if diff_result_1:
  96. grass.warning(_("Difference between PROJ_INFO file of packed map "
  97. "and of current location:\n{diff}").format(diff=''.join(diff_result_1)))
  98. if diff_result_2:
  99. grass.warning(_("Difference between PROJ_UNITS file of packed map "
  100. "and of current location:\n{diff}").format(diff=''.join(diff_result_2)))
  101. grass.fatal(_("Projection information does not match. Aborting."))
  102. # install in $MAPSET
  103. for element in ['cats', 'cell', 'cellhd', 'cell_misc', 'colr', 'fcell', 'hist']:
  104. if not os.path.exists(element):
  105. continue
  106. path = os.path.join(mset_dir, element)
  107. if not os.path.exists(path):
  108. os.mkdir(path)
  109. if element == 'cell_misc':
  110. path = os.path.join(mset_dir, element, map_name)
  111. if os.path.exists(path):
  112. shutil.rmtree(path)
  113. shutil.copytree('cell_misc', path)
  114. else:
  115. shutil.copyfile(element, os.path.join(mset_dir, element, map_name))
  116. grass.message(_("Raster map <%s> unpacked") % map_name)
  117. if __name__ == "__main__":
  118. options, flags = grass.parser()
  119. atexit.register(cleanup)
  120. sys.exit(main())