r.in.aster.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #!/usr/bin/env python
  2. #
  3. ############################################################################
  4. #
  5. # MODULE: r_in_aster.py
  6. # AUTHOR(S): Michael Barton (michael.barton@asu.edu) and
  7. # Glynn Clements (glynn@gclements.plus.com)
  8. # Based on r.in.aster bash script for GRASS
  9. # by Michael Barton and Paul Kelly
  10. # PURPOSE: Rectifies, georeferences, & imports Terra-ASTER imagery
  11. # using gdalwarp
  12. # COPYRIGHT: (C) 2008 by the GRASS Development Team
  13. #
  14. # This program is free software under the GNU General Public
  15. # License (>=v2). Read the file COPYING that comes with GRASS
  16. # for details.
  17. #
  18. #############################################################################
  19. #
  20. # Requires:
  21. # gdalwarp
  22. # gdal compiled with HDF4 support
  23. #%Module
  24. #% description: Georeference, rectify, and import Terra-ASTER imagery and relative DEMs using gdalwarp.
  25. #% keyword: raster
  26. #% keyword: import
  27. #% keyword: imagery
  28. #% keyword: ASTER
  29. #% keyword: elevation
  30. #%End
  31. #%option G_OPT_F_INPUT
  32. #% description: Name of input ASTER image
  33. #%end
  34. #%option
  35. #% key: proctype
  36. #% type: string
  37. #% description: ASTER imagery processing type (Level 1A, Level 1B, or relative DEM)
  38. #% options: L1A,L1B,DEM
  39. #% answer: L1B
  40. #% required: yes
  41. #%end
  42. #%option
  43. #% key: band
  44. #% type: string
  45. #% description: List L1A or L1B band to translate (1,2,3n,...), or enter 'all' to translate all bands
  46. #% answer: all
  47. #% required: yes
  48. #%end
  49. #%option G_OPT_R_OUTPUT
  50. #% description: Base name for output raster map (band number will be appended to base name)
  51. #%end
  52. import sys
  53. import os
  54. import platform
  55. import grass.script as grass
  56. # i18N
  57. import gettext
  58. gettext.install('grassmods', os.path.join(os.getenv("GISBASE"), 'locale'))
  59. bands = {
  60. 'L1A': {
  61. '1': "VNIR_Band1:ImageData",
  62. '2': "VNIR_Band2:ImageData",
  63. '3n': "VNIR_Band3N:ImageData",
  64. '3b': "VNIR_Band3B:ImageData",
  65. '4': "SWIR_Band4:ImageData",
  66. '5': "SWIR_Band5:ImageData",
  67. '6': "SWIR_Band6:ImageData",
  68. '7': "SWIR_Band7:ImageData",
  69. '8': "SWIR_Band8:ImageData",
  70. '9': "SWIR_Band9:ImageData",
  71. '10': "TIR_Band10:ImageData",
  72. '11': "TIR_Band11:ImageData",
  73. '12': "TIR_Band12:ImageData",
  74. '13': "TIR_Band13:ImageData",
  75. '14': "TIR_Band14:ImageData"
  76. },
  77. 'L1B': {
  78. '1': "VNIR_Swath:ImageData1",
  79. '2': "VNIR_Swath:ImageData2",
  80. '3n': "VNIR_Swath:ImageData3N",
  81. '3b': "VNIR_Swath:ImageData3B",
  82. '4': "SWIR_Swath:ImageData4",
  83. '5': "SWIR_Swath:ImageData5",
  84. '6': "SWIR_Swath:ImageData6",
  85. '7': "SWIR_Swath:ImageData7",
  86. '8': "SWIR_Swath:ImageData8",
  87. '9': "SWIR_Swath:ImageData9",
  88. '10': "TIR_Swath:ImageData10",
  89. '11': "TIR_Swath:ImageData11",
  90. '12': "TIR_Swath:ImageData12",
  91. '13': "TIR_Swath:ImageData13",
  92. '14': "TIR_Swath:ImageData14"
  93. }
  94. }
  95. def main():
  96. input = options['input']
  97. proctype = options['proctype']
  98. output = options['output']
  99. band = options['band']
  100. # check whether gdalwarp is in path and executable
  101. if not grass.find_program('gdalwarp', '--help'):
  102. grass.fatal(_("gdalwarp is not in the path and executable"))
  103. # create temporary file to hold gdalwarp output before importing to GRASS
  104. tempfile = grass.read_command("g.tempfile", pid=os.getpid()).strip() + '.tif'
  105. # get projection information for current GRASS location
  106. proj = grass.read_command('g.proj', flags='jf').strip()
  107. # currently only runs in projected location
  108. if "XY location" in proj:
  109. grass.fatal(_("This module needs to be run in a projected location (found: %s)") % proj)
  110. # process list of bands
  111. allbands = ['1', '2', '3n', '3b', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14']
  112. if band == 'all':
  113. bandlist = allbands
  114. else:
  115. bandlist = band.split(',')
  116. # initialize datasets for L1A and L1B
  117. if proctype in ["L1A", "L1B"]:
  118. for band in bandlist:
  119. if band in allbands:
  120. dataset = bands[proctype][band]
  121. srcfile = "HDF4_EOS:EOS_SWATH:%s:%s" % (input, dataset)
  122. import_aster(proj, srcfile, tempfile, output, band)
  123. else:
  124. grass.fatal(_('band %s is not an available Terra/ASTER band') % band)
  125. elif proctype == "DEM":
  126. srcfile = input
  127. import_aster(proj, srcfile, tempfile, output, "DEM")
  128. # cleanup
  129. grass.message(_("Cleaning up ..."))
  130. grass.try_remove(tempfile)
  131. grass.message(_("Done."))
  132. return
  133. def import_aster(proj, srcfile, tempfile, output, band):
  134. # run gdalwarp with selected options (must be in $PATH)
  135. # to translate aster image to geotiff
  136. grass.message(_("Georeferencing aster image ..."))
  137. grass.debug("gdalwarp -t_srs %s %s %s" % (proj, srcfile, tempfile))
  138. if platform.system() == "Darwin":
  139. cmd = ["arch", "-i386", "gdalwarp", "-t_srs", proj, srcfile, tempfile]
  140. else:
  141. cmd = ["gdalwarp", "-t_srs", proj, srcfile, tempfile]
  142. p = grass.call(cmd)
  143. if p != 0:
  144. # check to see if gdalwarp executed properly
  145. return
  146. # import geotiff to GRASS
  147. grass.message(_("Importing into GRASS ..."))
  148. outfile = "%s.%s" % (output, band)
  149. grass.run_command("r.in.gdal", input=tempfile, output=outfile)
  150. # write cmd history
  151. grass.raster_history(outfile)
  152. if __name__ == "__main__":
  153. options, flags = grass.parser()
  154. main()