123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #!/usr/bin/env python3
- ############################################################################
- #
- # MODULE: v.in.e00
- #
- # AUTHOR(S): Markus Neteler, Otto Dassau
- # Converted to Python by Glynn Clements
- #
- # PURPOSE: Import E00 data into a GRASS vector map
- # Imports single and split E00 files (.e00, .e01, .e02 ...)
- #
- # COPYRIGHT: (c) 2004, 2005 GDF Hannover bR, http://www.gdf-hannover.de
- #
- # This program is free software under the GNU General Public
- # License (>=v2). Read the file COPYING that comes with GRASS
- # for details.
- #
- #############################################################################
- #
- # REQUIREMENTS:
- # - avcimport: http://avce00.maptools.org
- # %module
- # % description: Imports E00 file into a vector map.
- # % keyword: vector
- # % keyword: import
- # % keyword: E00
- # %end
- # %option G_OPT_F_BIN_INPUT
- # % description: Name of input E00 file
- # %end
- # %option G_OPT_V_TYPE
- # % options: point,line,area
- # % answer: point
- # % required: yes
- # %end
- # %option G_OPT_V_OUTPUT
- # %end
- import os
- import shutil
- import glob
- from grass.script.utils import try_rmdir, try_remove, basename
- from grass.script import vector as gvect
- from grass.script import core as gcore
- from grass.exceptions import CalledModuleError
- def main():
- filename = options["input"]
- type = options["type"]
- vect = options["output"]
- e00tmp = str(os.getpid())
- # check for avcimport
- if not gcore.find_program("avcimport"):
- gcore.fatal(
- _("'avcimport' program not found, install it first")
- + "\n"
- + "http://avce00.maptools.org"
- )
- # check for e00conv
- if not gcore.find_program("e00conv"):
- gcore.fatal(
- _("'e00conv' program not found, install it first")
- + "\n"
- + "http://avce00.maptools.org"
- )
- # check that the user didn't use all three, which gets past the parser.
- if type not in ["point", "line", "area"]:
- gcore.fatal(_('Must specify one of "point", "line", or "area".'))
- e00name = basename(filename, "e00")
- # avcimport only accepts 13 chars:
- e00shortname = e00name[:13]
- # check if this is a split E00 file (.e01, .e02 ...):
- merging = False
- if os.path.exists(e00name + ".e01") or os.path.exists(e00name + ".E01"):
- gcore.message(
- _("Found that E00 file is split into pieces (.e01, ...)." " Merging...")
- )
- merging = True
- if vect:
- name = vect
- else:
- name = e00name
- # do import
- # make a temporary directory
- tmpdir = gcore.tempfile()
- try_remove(tmpdir)
- os.mkdir(tmpdir)
- files = glob.glob(e00name + ".e[0-9][0-9]") + glob.glob(e00name + ".E[0-9][0-9]")
- for f in files:
- shutil.copy(f, tmpdir)
- # change to temporary directory to later avoid removal problems (rm -r ...)
- os.chdir(tmpdir)
- # check for binay E00 file (we can just check if import fails):
- # avcimport doesn't set exist status :-(
- if merging:
- files.sort()
- filename = "%s.cat.%s.e00" % (e00name, e00tmp)
- outf = open(filename, "wb")
- for f in files:
- inf = open(f, "rb")
- shutil.copyfileobj(inf, outf)
- inf.close()
- outf.close()
- nuldev = open(os.devnull, "w+")
- gcore.message(_("An error may appear next which will be ignored..."))
- if (
- gcore.call(["avcimport", filename, e00shortname], stdout=nuldev, stderr=nuldev)
- == 1
- ):
- gcore.message(
- _("E00 ASCII found and converted to Arc Coverage in " "current directory")
- )
- else:
- gcore.message(_("E00 Compressed ASCII found. Will uncompress first..."))
- try_remove(e00shortname)
- gcore.call(["e00conv", filename, e00tmp + ".e00"])
- gcore.message(_("...converted to Arc Coverage in current directory"))
- gcore.call(["avcimport", e00tmp + ".e00", e00shortname], stderr=nuldev)
- # SQL name fix:
- name = name.replace("-", "_")
- # let's import...
- gcore.message(_("Importing %ss...") % type)
- layer = dict(point="LAB", line="ARC", area=["LAB", "ARC"])
- itype = dict(point="point", line="line", area="centroid")
- try:
- gcore.run_command(
- "v.in.ogr",
- flags="o",
- input=e00shortname,
- layer=layer[type],
- type=itype[type],
- output=name,
- )
- except CalledModuleError:
- gcore.fatal(_("An error occurred while running v.in.ogr"))
- gcore.message(_("Imported <%s> vector map <%s>.") % (type, name))
- # clean up the mess
- for root, dirs, files in os.walk(".", False):
- for f in files:
- path = os.path.join(root, f)
- try_remove(path)
- for d in dirs:
- path = os.path.join(root, d)
- try_rmdir(path)
- os.chdir("..")
- os.rmdir(tmpdir)
- # end
- gcore.message(_("Done."))
- # write cmd history:
- gvect.vector_history(name)
- if __name__ == "__main__":
- options, flags = gcore.parser()
- main()
|