open_stds.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. """!@package grass.temporal
  2. @brief GRASS Python scripting module (temporal GIS functions)
  3. Temporal GIS related functions to be used in Python scripts.
  4. Usage:
  5. @code
  6. import grass.temporal as tgis
  7. tgis.register_maps_in_space_time_dataset(type, name, maps)
  8. ...
  9. @endcode
  10. (C) 2012-2013 by the GRASS Development Team
  11. This program is free software under the GNU General Public
  12. License (>=v2). Read the file COPYING that comes with GRASS
  13. for details.
  14. @author Soeren Gebbert
  15. """
  16. from factory import *
  17. ###############################################################################
  18. def open_old_space_time_dataset(name, type, dbif=None):
  19. """!This function opens an existing space time dataset and return the
  20. created and intialized object of the specified type.
  21. This function will call exit() or raise a grass.pygrass.messages.FatalError in case the type is wrong,
  22. or the space time dataset was not found.
  23. @param name The name of the space time dataset, if the name does not
  24. contain the mapset (name@mapset) then the current mapset
  25. will be used to identifiy the space time dataset
  26. @param type The type of the space time dataset (strd, str3ds, stvds,
  27. raster, vector, raster3d)
  28. @param dbif The optional database interface to be used
  29. """
  30. mapset = get_current_mapset()
  31. msgr = get_tgis_message_interface()
  32. # Check if the dataset name contains the mapset as well
  33. if name.find("@") < 0:
  34. id = name + "@" + mapset
  35. else:
  36. id = name
  37. if type == "strds" or type == "rast" or type == "raster":
  38. sp = dataset_factory("strds", id)
  39. elif type == "str3ds" or type == "rast3d" or type == "raster3d":
  40. sp = dataset_factory("str3ds", id)
  41. elif type == "stvds" or type == "vect" or type == "vector":
  42. sp = dataset_factory("stvds", id)
  43. else:
  44. msgr.fatal(_("Unkown type: %s") % (type))
  45. dbif, connected = init_dbif(dbif)
  46. if not sp.is_in_db(dbif):
  47. dbif.close()
  48. msgr.fatal(_("Space time %(sp)s dataset <%(name)s> no found") %
  49. {'sp': sp.get_new_map_instance(None).get_type(),
  50. 'name': name})
  51. # Read content from temporal database
  52. sp.select(dbif)
  53. if connected:
  54. dbif.close()
  55. return sp
  56. ###############################################################################
  57. def check_new_space_time_dataset(name, type, dbif=None, overwrite=False):
  58. """!Check if a new space time dataset of a specific type can be created
  59. @param name The name of the new space time dataset
  60. @param type The type of the new space time dataset (strd, str3ds, stvds,
  61. raster, vector, raster3d)
  62. @param dbif The temporal database interface to be used
  63. @param overwrite Flag to allow overwriting
  64. @return A space time dataset object that must be filled with
  65. content before insertion in the temporal database
  66. This function will raise a ScriptError in case of an error.
  67. """
  68. #Get the current mapset to create the id of the space time dataset
  69. mapset = get_current_mapset()
  70. msgr = get_tgis_message_interface()
  71. if name.find("@") < 0:
  72. id = name + "@" + mapset
  73. else:
  74. n, m = name.split("@")
  75. if mapset != m:
  76. msgr.fatal(_("Space time datasets can only be created in the "
  77. "current mapset"))
  78. id = name
  79. if type == "strds" or type == "rast" or type == "raster":
  80. sp = dataset_factory("strds", id)
  81. elif type == "str3ds" or type == "rast3d" or type == "raster3d":
  82. sp = dataset_factory("str3ds", id)
  83. elif type == "stvds" or type == "vect" or type == "vector":
  84. sp = dataset_factory("stvds", id)
  85. else:
  86. msgr.error(_("Unkown type: %s") % (type))
  87. return None
  88. dbif, connected = init_dbif(dbif)
  89. if sp.is_in_db(dbif) and overwrite is False:
  90. msgr.fatal(_("Space time %(sp)s dataset <%(name)s> is already in the"
  91. " database. Use the overwrite flag.") % {
  92. 'sp': sp.get_new_map_instance(None).get_type(),
  93. 'name': name})
  94. if connected:
  95. dbif.close()
  96. return sp
  97. ###############################################################################
  98. def open_new_space_time_dataset(name, type, temporaltype, title, descr, semantic,
  99. dbif=None, overwrite=False):
  100. """!Create a new space time dataset of a specific type
  101. @param name The name of the new space time dataset
  102. @param type The type of the new space time dataset (strd, str3ds, stvds,
  103. raster, vector, raster3d)
  104. @param temporaltype The temporal type (relative or absolute)
  105. @param title The title
  106. @param descr The dataset description
  107. @param semantic Semantical information
  108. @param dbif The temporal database interface to be used
  109. @param overwrite Flag to allow overwriting
  110. @return The new created space time dataset
  111. This function will raise a FatalError in case of an error.
  112. """
  113. dbif, connected = init_dbif(dbif)
  114. msgr = get_tgis_message_interface()
  115. sp = check_new_space_time_dataset(name, type, dbif, overwrite)
  116. if sp.is_in_db(dbif):
  117. msgr.warning(_("Overwrite space time %(sp)s dataset <%(name)s> and "
  118. "unregister all maps.") % {
  119. 'sp': sp.get_new_map_instance(None).get_type(),
  120. 'name': name})
  121. id = sp.get_id()
  122. sp.delete(dbif)
  123. sp = sp.get_new_instance(id)
  124. msgr.verbose(_("Create new space time %s dataset.") %
  125. sp.get_new_map_instance(None).get_type())
  126. sp.set_initial_values(temporal_type=temporaltype, semantic_type=semantic,
  127. title=title, description=descr)
  128. sp.insert(dbif)
  129. if connected:
  130. dbif.close()
  131. return sp
  132. ############################################################################
  133. def check_new_map_dataset(name, layer=None, type="raster",
  134. overwrite=False, dbif=None):
  135. """!Check if a new map dataset of a specific type can be created in
  136. the temporal database
  137. @param name The name of the new map dataset
  138. @param layer The layer of the new map dataset
  139. @param type The type of the new map dataset (raster, vector, raster3d)
  140. @param dbif The temporal database interface to be used
  141. @param overwrite Flag to allow overwriting
  142. @return A map dataset object
  143. This function will raise a ScriptError in case of an error.
  144. """
  145. mapset = get_current_mapset()
  146. msgr = get_tgis_message_interface()
  147. dbif, connected = init_dbif(dbif)
  148. map_id = AbstractMapDataset.build_id(name, mapset, layer)
  149. new_map = dataset_factory(type, map_id)
  150. # Check if new map is in the temporal database
  151. if new_map.is_in_db(dbif):
  152. if not overwrite:
  153. if connected:
  154. dbif.close()
  155. msgr.fatal(_("Map <%s> is already in temporal database,"
  156. " use overwrite flag to overwrite") % (map_id))
  157. if connected:
  158. dbif.close()
  159. return new_map
  160. ############################################################################
  161. def open_new_map_dataset(name, layer=None, type="raster",
  162. temporal_extent=None, overwrite=False,
  163. dbif=None):
  164. """!Create a new map dataset object of a specific type that can be
  165. registered in the temporal database
  166. @param name The name of the new map dataset
  167. @param layer The layer of the new map dataset
  168. @param type The type of the new map dataset (raster, vector, raster3d)
  169. @param dbif The temporal database interface to be used
  170. @param overwrite Flag to allow overwriting
  171. @return A map dataset object
  172. This function will raise a ScriptError in case of an error.
  173. """
  174. mapset = get_current_mapset()
  175. dbif, connected = init_dbif(dbif)
  176. new_map = check_new_map_dataset(name, layer, "raster", overwrite, dbif)
  177. # Check if new map is in the temporal database
  178. if new_map.is_in_db(dbif):
  179. # Remove the existing temporal database entry
  180. map_id = new_map.get_id()
  181. new_map.delete(dbif)
  182. new_map = new_map.get_new_instance(map_id)
  183. if temporal_extent:
  184. new_map.set_temporal_extent(temporal_extent)
  185. if connected:
  186. dbif.close()
  187. return new_map