db.in.ogr.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 "
  80. "overwritten") % output)
  81. grass.write_command('db.execute', input='-',
  82. stdin="DROP TABLE %s" % output)
  83. break
  84. else:
  85. grass.fatal(_("Table <%s> already exists") % output)
  86. # treat DB as real vector map...
  87. layer = db_table if db_table else None
  88. vopts = {}
  89. if options['encoding']:
  90. vopts['encoding'] = options['encoding']
  91. try:
  92. grass.run_command('v.in.ogr', flags='o', input=input, output=output,
  93. layer=layer, quiet=True, **vopts)
  94. except CalledModuleError:
  95. if db_table:
  96. grass.fatal(
  97. _("Input table <%s> not found or not readable") %
  98. input)
  99. else:
  100. grass.fatal(_("Input DSN <%s> not found or not readable") % input)
  101. # rename ID col if requested from cat to new name
  102. if key:
  103. grass.write_command('db.execute', quiet=True, input='-',
  104. stdin="ALTER TABLE %s ADD COLUMN %s integer" %
  105. (output, key))
  106. grass.write_command('db.execute', quiet=True, 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',
  115. flags='d')
  116. grass.run_command('g.remove', flags='f', quiet=True, type='vector',
  117. name=output)
  118. # get rid of superfluous auto-added cat column (and cat_ if present)
  119. nuldev = file(os.devnull, 'w+')
  120. grass.run_command('db.dropcolumn', quiet=True, flags='f', table=output,
  121. column='cat', stdout=nuldev, stderr=nuldev)
  122. nuldev.close()
  123. records = grass.db_describe(output)['nrows']
  124. grass.message(_("Imported table <%s> with %d rows") % (output, records))
  125. if __name__ == "__main__":
  126. options, flags = grass.parser()
  127. main()