r.in.aster.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #!/usr/bin/env python3
  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 os
  53. import platform
  54. import grass.script as grass
  55. bands = {
  56. "L1A": {
  57. "1": "VNIR_Band1:ImageData",
  58. "2": "VNIR_Band2:ImageData",
  59. "3n": "VNIR_Band3N:ImageData",
  60. "3b": "VNIR_Band3B:ImageData",
  61. "4": "SWIR_Band4:ImageData",
  62. "5": "SWIR_Band5:ImageData",
  63. "6": "SWIR_Band6:ImageData",
  64. "7": "SWIR_Band7:ImageData",
  65. "8": "SWIR_Band8:ImageData",
  66. "9": "SWIR_Band9:ImageData",
  67. "10": "TIR_Band10:ImageData",
  68. "11": "TIR_Band11:ImageData",
  69. "12": "TIR_Band12:ImageData",
  70. "13": "TIR_Band13:ImageData",
  71. "14": "TIR_Band14:ImageData",
  72. },
  73. "L1B": {
  74. "1": "VNIR_Swath:ImageData1",
  75. "2": "VNIR_Swath:ImageData2",
  76. "3n": "VNIR_Swath:ImageData3N",
  77. "3b": "VNIR_Swath:ImageData3B",
  78. "4": "SWIR_Swath:ImageData4",
  79. "5": "SWIR_Swath:ImageData5",
  80. "6": "SWIR_Swath:ImageData6",
  81. "7": "SWIR_Swath:ImageData7",
  82. "8": "SWIR_Swath:ImageData8",
  83. "9": "SWIR_Swath:ImageData9",
  84. "10": "TIR_Swath:ImageData10",
  85. "11": "TIR_Swath:ImageData11",
  86. "12": "TIR_Swath:ImageData12",
  87. "13": "TIR_Swath:ImageData13",
  88. "14": "TIR_Swath:ImageData14",
  89. },
  90. }
  91. def main():
  92. input = options["input"]
  93. proctype = options["proctype"]
  94. output = options["output"]
  95. band = options["band"]
  96. # check whether gdalwarp is in path and executable
  97. if not grass.find_program("gdalwarp", "--help"):
  98. grass.fatal(_("gdalwarp is not in the path and executable"))
  99. # create temporary file to hold gdalwarp output before importing to GRASS
  100. tempfile = grass.read_command("g.tempfile", pid=os.getpid()).strip() + ".tif"
  101. # get projection information for current GRASS location
  102. proj = grass.read_command("g.proj", flags="jf").strip()
  103. # currently only runs in projected location
  104. if "XY location" in proj:
  105. grass.fatal(
  106. _("This module needs to be run in a projected location (found: %s)") % proj
  107. )
  108. # process list of bands
  109. allbands = [
  110. "1",
  111. "2",
  112. "3n",
  113. "3b",
  114. "4",
  115. "5",
  116. "6",
  117. "7",
  118. "8",
  119. "9",
  120. "10",
  121. "11",
  122. "12",
  123. "13",
  124. "14",
  125. ]
  126. if band == "all":
  127. bandlist = allbands
  128. else:
  129. bandlist = band.split(",")
  130. # initialize datasets for L1A and L1B
  131. if proctype in ["L1A", "L1B"]:
  132. for band in bandlist:
  133. if band in allbands:
  134. dataset = bands[proctype][band]
  135. srcfile = "HDF4_EOS:EOS_SWATH:%s:%s" % (input, dataset)
  136. import_aster(proj, srcfile, tempfile, output, band)
  137. else:
  138. grass.fatal(_("band %s is not an available Terra/ASTER band") % band)
  139. elif proctype == "DEM":
  140. srcfile = input
  141. import_aster(proj, srcfile, tempfile, output, "DEM")
  142. # cleanup
  143. grass.message(_("Cleaning up ..."))
  144. grass.try_remove(tempfile)
  145. grass.message(_("Done."))
  146. return
  147. def import_aster(proj, srcfile, tempfile, output, band):
  148. # run gdalwarp with selected options (must be in $PATH)
  149. # to translate aster image to geotiff
  150. grass.message(_("Georeferencing aster image ..."))
  151. grass.debug("gdalwarp -t_srs %s %s %s" % (proj, srcfile, tempfile))
  152. if platform.system() == "Darwin":
  153. cmd = ["arch", "-i386", "gdalwarp", "-t_srs", proj, srcfile, tempfile]
  154. else:
  155. cmd = ["gdalwarp", "-t_srs", proj, srcfile, tempfile]
  156. p = grass.call(cmd)
  157. if p != 0:
  158. # check to see if gdalwarp executed properly
  159. return
  160. # import geotiff to GRASS
  161. grass.message(_("Importing into GRASS ..."))
  162. outfile = "%s.%s" % (output, band)
  163. grass.run_command("r.in.gdal", input=tempfile, output=outfile)
  164. # write cmd history
  165. grass.raster_history(outfile)
  166. if __name__ == "__main__":
  167. options, flags = grass.parser()
  168. main()