db.in.ogr.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #!/usr/bin/env python
  2. ############################################################################
  3. #
  4. # MODULE: db.in.ogr
  5. # AUTHOR(S): Markus Neteler
  6. # PURPOSE: Imports attribute tables in various formats
  7. # Converted to Python by Glynn Clements
  8. # COPYRIGHT: (C) 2007-2016 by Markus Neteler and the GRASS Development Team
  9. #
  10. # This program is free software under the GNU General Public
  11. # License (>=v2). Read the file COPYING that comes with GRASS
  12. # for details.
  13. #
  14. #############################################################################
  15. #%Module
  16. #% description: Imports attribute tables in various formats.
  17. #% keyword: database
  18. #% keyword: import
  19. #% keyword: attribute table
  20. #% overwrite: yes
  21. #%End
  22. #%option G_OPT_F_BIN_INPUT
  23. #% description: Table file to be imported or DB connection string
  24. #%end
  25. #%option
  26. #% key: db_table
  27. #% type: string
  28. #% key_desc : name
  29. #% description: Name of table from given DB to be imported
  30. #% required : no
  31. #%end
  32. #%option G_OPT_DB_TABLE
  33. #% key: output
  34. #% description: Name for output table
  35. #% required : no
  36. #% guisection: Output
  37. #% gisprompt: new,dbtable,dbtable
  38. #%end
  39. #%option
  40. #% key: key
  41. #% type: string
  42. #% description: Name for auto-generated unique key column
  43. #% required : no
  44. #% guisection: Output
  45. #%end
  46. #%option
  47. #% key: encoding
  48. #% type: string
  49. #% label: Encoding value for attribute data
  50. #% descriptions: Overrides encoding interpretation, useful when importing DBF tables
  51. #% guisection: Output
  52. #%end
  53. import os
  54. import grass.script as grass
  55. from grass.exceptions import CalledModuleError
  56. def main():
  57. input = options['input']
  58. db_table = options['db_table']
  59. output = options['output']
  60. key = options['key']
  61. mapset = grass.gisenv()['MAPSET']
  62. if db_table:
  63. input = db_table
  64. if not output:
  65. tmpname = input.replace('.', '_')
  66. output = grass.basename(tmpname)
  67. # check if table exists
  68. try:
  69. nuldev = file(os.devnull, 'w+')
  70. s = grass.read_command('db.tables', flags = 'p', quiet=True, stderr=nuldev)
  71. nuldev.close()
  72. except CalledModuleError:
  73. # check connection parameters, set if uninitialized
  74. grass.read_command('db.connect', flags='c')
  75. s = grass.read_command('db.tables', flags = 'p', quiet=True)
  76. for l in s.splitlines():
  77. if l == output:
  78. if grass.overwrite():
  79. grass.warning(_("Table <%s> already exists and will be overwritten") % output)
  80. grass.write_command('db.execute', input = '-', stdin = "DROP TABLE %s" % output)
  81. break
  82. else:
  83. grass.fatal(_("Table <%s> already exists") % output)
  84. # treat DB as real vector map...
  85. if db_table:
  86. layer = db_table
  87. else:
  88. layer = None
  89. vopts = {}
  90. if options['encoding']:
  91. vopts['encoding'] = options['encoding']
  92. try:
  93. grass.run_command('v.in.ogr', flags='o', input=input, output=output,
  94. layer=layer, quiet=True, **vopts)
  95. except CalledModuleError:
  96. if db_table:
  97. grass.fatal(_("Input table <%s> not found or not readable") % input)
  98. else:
  99. grass.fatal(_("Input DSN <%s> not found or not readable") % input)
  100. # rename ID col if requested from cat to new name
  101. if key:
  102. grass.write_command('db.execute', quiet = True,
  103. input = '-',
  104. stdin = "ALTER TABLE %s ADD COLUMN %s integer" % (output, key) )
  105. grass.write_command('db.execute', quiet = True,
  106. input = '-',
  107. stdin = "UPDATE %s SET %s=cat" % (output, key) )
  108. # ... and immediately drop the empty geometry
  109. vectfile = grass.find_file(output, element = 'vector', mapset = mapset)['file']
  110. if not vectfile:
  111. grass.fatal(_("Something went wrong. Should not happen"))
  112. else:
  113. # remove the vector part
  114. grass.run_command('v.db.connect', quiet = True, map = output, layer = '1', flags = 'd')
  115. grass.run_command('g.remove', flags = 'f', quiet = True, type = 'vector', name = output)
  116. # get rid of superfluous auto-added cat column (and cat_ if present)
  117. nuldev = file(os.devnull, 'w+')
  118. grass.run_command('db.dropcolumn', quiet = True, flags = 'f', table = output,
  119. column = 'cat', stdout = nuldev, stderr = nuldev)
  120. nuldev.close()
  121. records = grass.db_describe(output)['nrows']
  122. grass.message(_("Imported table <%s> with %d rows") % (output, records))
  123. if __name__ == "__main__":
  124. options, flags = grass.parser()
  125. main()