123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #!/usr/bin/env python
- #
- ############################################################################
- #
- # MODULE: v.in.mapgen
- #
- # AUTHOR(S): Andreas Lange, andreas.lange@rhein-main.de
- # Updated for GRASS 6 by Hamish Bowman
- # Converted to Python by Glynn Clements
- #
- # PURPOSE: Import data from Mapgen or Matlab into a GRASS vector map
- #
- # COPYRIGHT: Original version (c) Andreas Lange
- # Updates by Hamish Bowman
- # (C) 2008, 2010 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.
- #############################################################################
- #
- # DATA AVAILABILITY: e.g., NOAA's Online Coastline Extractor
- # http://www.ngdc.noaa.gov/mgg/shorelines/shorelines.html
- #
- #%module
- #% description: Imports Mapgen or Matlab-ASCII vector maps into GRASS.
- #% keyword: vector
- #% keyword: import
- #%end
- #%flag
- #% key: f
- #% description: Input map is in Matlab format
- #%end
- #%flag
- #% key: z
- #% description: Create a 3D vector points map from 3 column Matlab data
- #%end
- #%option G_OPT_F_INPUT
- #% description: Name of input file in Mapgen/Matlab format
- #%end
- #%option G_OPT_V_OUTPUT
- #% description: Name for output vector map (omit for display to stdout)
- #% required: no
- #%end
- import sys
- import os
- import atexit
- import string
- import time
- import shutil
- from grass.script.utils import try_remove
- from grass.script import core as grass
- from grass.exceptions import CalledModuleError
- # i18N
- import gettext
- gettext.install('grassmods', os.path.join(os.getenv("GISBASE"), 'locale'))
- def cleanup():
- try_remove(tmp)
- try_remove(tmp + '.dig')
- def main():
- global tmp
- infile = options['input']
- output = options['output']
- matlab = flags['f']
- threeD = flags['z']
- prog = 'v.in.mapgen'
- opts = ""
- if not os.path.isfile(infile):
- grass.fatal(_("Input file <%s> not found") % infile)
- if output:
- name = output
- else:
- name = ''
- if threeD:
- matlab = True
- if threeD:
- do3D = 'z'
- else:
- do3D = ''
- tmp = grass.tempfile()
- # create ascii vector file
- inf = open(infile)
- outf = open(tmp, 'w')
- grass.message(_("Importing data..."))
- cat = 1
- if matlab:
- # HB: OLD v.in.mapgen.sh Matlab import command follows.
- # I have no idea what it's all about, so "new" matlab format will be
- # a series of x y with "nan nan" breaking lines. (as NOAA provides)
- # Old command:
- # tac $infile | $AWK 'BEGIN { FS="," ; R=0 }
- # $1~/\d*/ { printf("L %d\n", R) }
- # $1~/ .*/ { printf(" %lf %lf\n", $2, $1) ; ++R }
- # $1~/END/ { }' | tac > "$TMP"
- # matlab format.
- points = []
- for line in inf:
- f = line.split()
- if f[0].lower() == 'nan':
- if points != []:
- outf.write("L %d 1\n" % len(points))
- for point in points:
- outf.write(" %.15g %.15g %.15g\n" % tuple(map(float, point)))
- outf.write(" 1 %d\n" % cat)
- cat += 1
- points = []
- else:
- if len(f) == 2:
- f.append('0')
- points.append(f)
- if points != []:
- outf.write("L %d 1\n" % len(points))
- for point in points:
- try:
- outf.write(" %.15g %.15g %.15g\n" % tuple(map(float, point)))
- except ValueError:
- grass.fatal(_("An error occurred on line '%s', exiting.") % line.strip())
- outf.write(" 1 %d\n" % cat)
- cat += 1
- else:
- # mapgen format.
- points = []
- for line in inf:
- if line[0] == '#':
- if points != []:
- outf.write("L %d 1\n" % len(points))
- for point in points:
- outf.write(" %.15g %.15g\n" % tuple(map(float, point)))
- outf.write(" 1 %d\n" % cat)
- cat += 1
- points = []
- else:
- points.append(line.rstrip('\r\n').split('\t'))
- if points != []:
- outf.write("L %d 1\n" % len(points))
- for point in points:
- outf.write(" %.15g %.15g\n" % tuple(map(float, point)))
- outf.write(" 1 %d\n" % cat)
- cat += 1
- outf.close()
- inf.close()
- # create digit header
- digfile = tmp + '.dig'
- outf = open(digfile, 'w')
- t = string.Template(
- """ORGANIZATION: GRASSroots organization
- DIGIT DATE: $date
- DIGIT NAME: $user@$host
- MAP NAME: $name
- MAP DATE: $year
- MAP SCALE: 1
- OTHER INFO: Imported with $prog
- ZONE: 0
- MAP THRESH: 0
- VERTI:
- """)
- date = time.strftime("%m/%d/%y")
- year = time.strftime("%Y")
- user = os.getenv('USERNAME') or os.getenv('LOGNAME')
- host = os.getenv('COMPUTERNAME') or os.uname()[1]
- s = t.substitute(prog=prog, name=name, date=date, year=year,
- user=user, host=host)
- outf.write(s)
- # process points list to ascii vector file (merge in vertices)
- inf = open(tmp)
- shutil.copyfileobj(inf, outf)
- inf.close()
- outf.close()
- if not name:
- # if no name for vector file given, cat to stdout
- inf = open(digfile)
- shutil.copyfileobj(inf, sys.stdout)
- inf.close()
- else:
- # import to binary vector file
- grass.message(_("Importing with v.in.ascii..."))
- try:
- grass.run_command('v.in.ascii', flags=do3D, input=digfile,
- output=name, format='standard')
- except CalledModuleError:
- grass.fatal(_('An error occurred on creating "%s", please check') % name)
- if __name__ == "__main__":
- options, flags = grass.parser()
- atexit.register(cleanup)
- main()
|