v.in.mapgen.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #!/usr/bin/env python
  2. #
  3. ############################################################################
  4. #
  5. # MODULE: v.in.mapgen
  6. #
  7. # AUTHOR(S): Andreas Lange, andreas.lange@rhein-main.de
  8. # Updated for GRASS 6 by Hamish Bowman
  9. # Converted to Python by Glynn Clements
  10. #
  11. # PURPOSE: Import data from Mapgen or Matlab into a GRASS vector map
  12. #
  13. # COPYRIGHT: Original version (c) Andreas Lange
  14. # Updates by Hamish Bowman
  15. # (C) 2008, 2010 the GRASS Development Team
  16. #
  17. # This program is free software under the GNU General Public
  18. # License (>=v2). Read the file COPYING that comes with GRASS
  19. # for details.
  20. #############################################################################
  21. #
  22. # DATA AVAILABILITY: e.g., NOAA's Online Coastline Extractor
  23. # http://www.ngdc.noaa.gov/mgg/shorelines/shorelines.html
  24. #
  25. #%module
  26. #% description: Imports Mapgen or Matlab-ASCII vector maps into GRASS.
  27. #% keyword: vector
  28. #% keyword: import
  29. #%end
  30. #%flag
  31. #% key: f
  32. #% description: Input map is in Matlab format
  33. #%end
  34. #%flag
  35. #% key: z
  36. #% description: Create a 3D vector points map from 3 column Matlab data
  37. #%end
  38. #%option G_OPT_F_INPUT
  39. #% description: Name of input file in Mapgen/Matlab format
  40. #%end
  41. #%option G_OPT_V_OUTPUT
  42. #% description: Name for output vector map (omit for display to stdout)
  43. #% required: no
  44. #%end
  45. import sys
  46. import os
  47. import atexit
  48. import string
  49. import time
  50. import shutil
  51. from grass.script.utils import try_remove
  52. from grass.script import core as grass
  53. from grass.exceptions import CalledModuleError
  54. def cleanup():
  55. try_remove(tmp)
  56. try_remove(tmp + '.dig')
  57. def main():
  58. global tmp
  59. infile = options['input']
  60. output = options['output']
  61. matlab = flags['f']
  62. threeD = flags['z']
  63. prog = 'v.in.mapgen'
  64. opts = ""
  65. if not os.path.isfile(infile):
  66. grass.fatal(_("Input file <%s> not found") % infile)
  67. if output:
  68. name = output
  69. else:
  70. name = ''
  71. if threeD:
  72. matlab = True
  73. if threeD:
  74. do3D = 'z'
  75. else:
  76. do3D = ''
  77. tmp = grass.tempfile()
  78. #### create ascii vector file
  79. inf = file(infile)
  80. outf = file(tmp, 'w')
  81. grass.message(_("Importing data..."))
  82. cat = 1
  83. if matlab:
  84. ## HB: OLD v.in.mapgen.sh Matlab import command follows.
  85. ## I have no idea what it's all about, so "new" matlab format will be
  86. ## a series of x y with "nan nan" breaking lines. (as NOAA provides)
  87. ## Old command:
  88. # tac $infile | $AWK 'BEGIN { FS="," ; R=0 }
  89. # $1~/\d*/ { printf("L %d\n", R) }
  90. # $1~/ .*/ { printf(" %lf %lf\n", $2, $1) ; ++R }
  91. # $1~/END/ { }' | tac > "$TMP"
  92. ## matlab format.
  93. points = []
  94. for line in inf:
  95. f = line.split()
  96. if f[0].lower() == 'nan':
  97. if points != []:
  98. outf.write("L %d 1\n" % len(points))
  99. for point in points:
  100. outf.write(" %.15g %.15g %.15g\n" % tuple(map(float,point)))
  101. outf.write(" 1 %d\n" % cat)
  102. cat += 1
  103. points = []
  104. else:
  105. if len(f) == 2:
  106. f.append('0')
  107. points.append(f)
  108. if points != []:
  109. outf.write("L %d 1\n" % len(points))
  110. for point in points:
  111. try:
  112. outf.write(" %.15g %.15g %.15g\n" % tuple(map(float, point)))
  113. except ValueError:
  114. grass.fatal(_("An error occurred on line '%s', exiting.") % line.strip())
  115. outf.write(" 1 %d\n" % cat)
  116. cat += 1
  117. else:
  118. ## mapgen format.
  119. points = []
  120. for line in inf:
  121. if line[0] == '#':
  122. if points != []:
  123. outf.write("L %d 1\n" % len(points))
  124. for point in points:
  125. outf.write(" %.15g %.15g\n" % tuple(map(float,point)))
  126. outf.write(" 1 %d\n" % cat)
  127. cat += 1
  128. points = []
  129. else:
  130. points.append(line.rstrip('\r\n').split('\t'))
  131. if points != []:
  132. outf.write("L %d 1\n" % len(points))
  133. for point in points:
  134. outf.write(" %.15g %.15g\n" % tuple(map(float,point)))
  135. outf.write(" 1 %d\n" % cat)
  136. cat += 1
  137. outf.close()
  138. inf.close()
  139. #### create digit header
  140. digfile = tmp + '.dig'
  141. outf = file(digfile, 'w')
  142. t = string.Template(\
  143. """ORGANIZATION: GRASSroots organization
  144. DIGIT DATE: $date
  145. DIGIT NAME: $user@$host
  146. MAP NAME: $name
  147. MAP DATE: $year
  148. MAP SCALE: 1
  149. OTHER INFO: Imported with $prog
  150. ZONE: 0
  151. MAP THRESH: 0
  152. VERTI:
  153. """)
  154. date = time.strftime("%m/%d/%y")
  155. year = time.strftime("%Y")
  156. user = os.getenv('USERNAME') or os.getenv('LOGNAME')
  157. host = os.getenv('COMPUTERNAME') or os.uname()[1]
  158. s = t.substitute(prog = prog, name = name, date = date, year = year,
  159. user = user, host = host)
  160. outf.write(s)
  161. #### process points list to ascii vector file (merge in vertices)
  162. inf = file(tmp)
  163. shutil.copyfileobj(inf, outf)
  164. inf.close()
  165. outf.close()
  166. if not name:
  167. #### if no name for vector file given, cat to stdout
  168. inf = file(digfile)
  169. shutil.copyfileobj(inf, sys.stdout)
  170. inf.close()
  171. else:
  172. #### import to binary vector file
  173. grass.message(_("Importing with v.in.ascii..."))
  174. try:
  175. grass.run_command('v.in.ascii', flags=do3D, input=digfile,
  176. output=name, format='standard')
  177. except CalledModuleError:
  178. grass.fatal(_('An error occurred on creating "%s", please check') % name)
  179. if __name__ == "__main__":
  180. options, flags = grass.parser()
  181. atexit.register(cleanup)
  182. main()