123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #!/usr/bin/env python
- ############################################################################
- #
- # MODULE: v.in.gns
- #
- # AUTHOR(S): Markus Neteler, neteler itc it
- # Converted to Python by Glynn Clements
- #
- # PURPOSE: Import GEOnet Names Server (GNS) country files into a GRASS vector map
- # http://earth-info.nga.mil/gns/html/
- # -> Download Names Files for Countries and Territories (FTP)
- #
- # Column names: http://earth-info.nga.mil/gns/html/help.htm
- #
- # COPYRIGHT: (c) 2005 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.
- #
- # TODO: - see below in the code
- # - add extra columns explaining some column acronyms,
- # e.g. FC (Feature Classification)
- #############################################################################
- #%module
- #% description: Imports US-NGA GEOnet Names Server (GNS) country files into a GRASS vector points map.
- #% keywords: vector
- #% keywords: import
- #% keywords: gazetteer
- #%end
- #%option G_OPT_F_INPUT
- #% description: Name of input uncompressed GNS file from NGA (with .txt extension)
- #%end
- #%option G_OPT_V_OUTPUT
- #% required: no
- #%end
- import sys
- import os
- from grass.script.utils import try_remove, basename, parse_key_val
- from grass.script import core as grass
- from grass.script import vector as vgrass
- def main():
- fileorig = options['input']
- filevect = options['output']
-
- if not filevect:
- filevect = basename(fileorig, 'txt')
- #are we in LatLong location?
- s = grass.read_command("g.proj", flags='j')
- kv = parse_key_val(s)
- if kv['+proj'] != 'longlat':
- grass.fatal(_("This module only operates in LatLong/WGS84 locations"))
- #### setup temporary file
- tmpfile = grass.tempfile()
- coldescs = [("RC", "rc integer"),
- ("UFI", "uf1 integer"),
- ("UNI", "uni integer"),
- ("LAT", "lat double precision"),
- ("LONG", "lon double precision"),
- ("DMS_LAT", "dms_lat varchar(6)"),
- ("DMS_LONG", "dms_long varchar(7)"),
- ("UTM", "utm varchar(4)"),
- ("JOG", "jog varchar(7)"),
- ("FC", "fc varchar(1)"),
- ("DSG", "dsg varchar(5)"),
- ("PC", "pc integer"),
- ("CC1", "cci varchar(2)"),
- ("ADM1", "adm1 varchar(2)"),
- ("ADM2", "adm2 varchar(200)"),
- ("DIM", "dim integer"),
- ("CC2", "cc2 varchar(2)"),
- ("NT", "nt varchar(1)"),
- ("LC", "lc varchar(3)"),
- ("SHORT_FORM", "shortform varchar(128)"),
- ("GENERIC", "generic varchar(128)"),
- ("SORT_NAME", "sortname varchar(200)"),
- ("FULL_NAME", "fullname varchar(200)"),
- ("FULL_NAME_ND","funamesd varchar(200)"),
- ("MODIFY_DATE", "mod_date date")]
- colnames = [desc[0] for desc in coldescs]
- coltypes = dict([(desc[0], 'integer' in desc[1]) for desc in coldescs])
- header = None
- num_places = 0
- inf = file(fileorig)
- outf = file(tmpfile, 'wb')
- for line in inf:
- fields = line.rstrip('\r\n').split('\t')
- if not header:
- header = fields
- continue
- vars = dict(zip(header, fields))
- fields2 = []
- for col in colnames:
- if col in vars:
- if coltypes[col] and vars[col] == '':
- fields2.append('0')
- else:
- fields2.append(vars[col])
- else:
- if coltypes[col]:
- fields2.append('0')
- else:
- fields2.append('')
- line2 = ';'.join(fields2) + '\n'
- outf.write(line2)
- num_places += 1
- outf.close()
- inf.close()
- grass.message(_("Converted %d place names.") % num_places)
- #TODO: fix dms_lat,dms_long DDMMSS -> DD:MM:SS
- # Solution:
- # IN=DDMMSS
- # DEG=`echo $IN | cut -b1,2`
- # MIN=`echo $IN | cut -b3,4`
- # SEC=`echo $IN | cut -b5,6`
- # DEG_STR="$DEG:$MIN:$SEC"
-
- #modifications (to match DBF 10 char column name limit):
- # short_form -> shortform
- # sort_name -> sortname
- # full_name -> fullname
- # full_name_sd -> funamesd
- # pump data into GRASS:
- columns = [desc[1] for desc in coldescs]
- grass.run_command('v.in.ascii', cat = 0, x = 5, y = 4, sep = ';',
- input = tmpfile, output = filevect,
- columns = columns)
- try_remove(tmpfile)
- # write cmd history:
- vgrass.vector_history(filevect)
- if __name__ == "__main__":
- options, flags = grass.parser()
- main()
|