open_stds.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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) 2008-2011 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 raise a ScriptError 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. # Check if the dataset name contains the mapset as well
  32. if name.find("@") < 0:
  33. id = name + "@" + mapset
  34. else:
  35. id = name
  36. if type == "strds" or type == "rast" or type == "raster":
  37. sp = dataset_factory("strds", id)
  38. elif type == "str3ds" or type == "rast3d" or type == "raster3d":
  39. sp = dataset_factory("str3ds", id)
  40. elif type == "stvds" or type == "vect" or type == "vector":
  41. sp = dataset_factory("stvds", id)
  42. else:
  43. core.fatal(_("Unkown type: %s") % (type))
  44. dbif, connected = init_dbif(dbif)
  45. if not sp.is_in_db(dbif):
  46. dbif.close()
  47. core.fatal(_("Space time %(sp)s dataset <%(name)s> no found") %
  48. {'sp': sp.get_new_map_instance(None).get_type(),
  49. 'name': name})
  50. # Read content from temporal database
  51. sp.select(dbif)
  52. if connected:
  53. dbif.close()
  54. return sp
  55. ###############################################################################
  56. def check_new_space_time_dataset(name, type, dbif=None, overwrite=False):
  57. """!Check if a new space time dataset of a specific type can be created
  58. @param name The name of the new space time dataset
  59. @param type The type of the new space time dataset (strd, str3ds, stvds,
  60. raster, vector, raster3d)
  61. @param dbif The temporal database interface to be used
  62. @param overwrite Flag to allow overwriting
  63. @return A space time dataset object that must be filled with
  64. content before insertion in the temporal database
  65. This function will raise a ScriptError in case of an error.
  66. """
  67. #Get the current mapset to create the id of the space time dataset
  68. mapset = get_current_mapset()
  69. if name.find("@") < 0:
  70. id = name + "@" + mapset
  71. else:
  72. n, m = name.split("@")
  73. if mapset != m:
  74. core.fatal(_("Space time datasets can only be created in the "
  75. "current mapset"))
  76. id = name
  77. if type == "strds" or type == "rast" or type == "raster":
  78. sp = dataset_factory("strds", id)
  79. elif type == "str3ds" or type == "rast3d" or type == "raster3d":
  80. sp = dataset_factory("str3ds", id)
  81. elif type == "stvds" or type == "vect" or type == "vector":
  82. sp = dataset_factory("stvds", id)
  83. else:
  84. core.error(_("Unkown type: %s") % (type))
  85. return None
  86. dbif, connected = init_dbif(dbif)
  87. if sp.is_in_db(dbif) and overwrite is False:
  88. core.fatal(_("Space time %(sp)s dataset <%(name)s> is already in the"
  89. " database. Use the overwrite flag.") % {
  90. 'sp': sp.get_new_map_instance(None).get_type(),
  91. 'name': name})
  92. if connected:
  93. dbif.close()
  94. return sp
  95. ###############################################################################
  96. def open_new_space_time_dataset(name, type, temporaltype, title, descr, semantic,
  97. dbif=None, overwrite=False):
  98. """!Create a new space time dataset of a specific type
  99. @param name The name of the new space time dataset
  100. @param type The type of the new space time dataset (strd, str3ds, stvds,
  101. raster, vector, raster3d)
  102. @param temporaltype The temporal type (relative or absolute)
  103. @param title The title
  104. @param descr The dataset description
  105. @param semantic Semantical information
  106. @param dbif The temporal database interface to be used
  107. @param overwrite Flag to allow overwriting
  108. @param dry Do not create the space time dataset in the temporal database,
  109. make a dry run with including all checks
  110. @return The new created space time dataset
  111. This function will raise a ScriptError in case of an error.
  112. """
  113. dbif, connected = init_dbif(dbif)
  114. sp = check_new_space_time_dataset(name, type, dbif, overwrite)
  115. if sp.is_in_db(dbif):
  116. core.warning(_("Overwrite space time %(sp)s dataset <%(name)s> and "
  117. "unregister all maps.") % {
  118. 'sp': sp.get_new_map_instance(None).get_type(),
  119. 'name': name})
  120. id = sp.get_id()
  121. sp.delete(dbif)
  122. sp = sp.get_new_instance(id)
  123. core.verbose(_("Create new space time %s dataset.") %
  124. sp.get_new_map_instance(None).get_type())
  125. sp.set_initial_values(temporal_type=temporaltype, semantic_type=semantic,
  126. title=title, description=descr)
  127. sp.insert(dbif)
  128. if connected:
  129. dbif.close()
  130. return sp
  131. ############################################################################
  132. def check_new_map_dataset(name, layer=None, type="raster",
  133. overwrite=False, dbif=None):
  134. """!Check if a new map dataset of a specific type can be created in
  135. the temporal database
  136. @param name The name of the new map dataset
  137. @param layer The layer of the new map dataset
  138. @param type The type of the new map dataset (raster, vector, raster3d)
  139. @param dbif The temporal database interface to be used
  140. @param overwrite Flag to allow overwriting
  141. @return A map dataset object
  142. This function will raise a ScriptError in case of an error.
  143. """
  144. mapset = get_current_mapset()
  145. dbif, connected = init_dbif(dbif)
  146. map_id = AbstractMapDataset.build_id(name, mapset, layer)
  147. new_map = dataset_factory(type, map_id)
  148. # Check if new map is in the temporal database
  149. if new_map.is_in_db(dbif):
  150. if not overwrite:
  151. if connected:
  152. dbif.close()
  153. core.fatal(_("Map <%s> is already in temporal database,"
  154. " use overwrite flag to overwrite") % (map_id))
  155. if connected:
  156. dbif.close()
  157. return new_map
  158. ############################################################################
  159. def open_new_map_dataset(name, layer=None, type="raster",
  160. temporal_extent=None, overwrite=False,
  161. dbif=None):
  162. """!Create a new map dataset object of a specific type that can be
  163. registered in the temporal database
  164. @param name The name of the new map dataset
  165. @param layer The layer of the new map dataset
  166. @param type The type of the new map dataset (raster, vector, raster3d)
  167. @param dbif The temporal database interface to be used
  168. @param overwrite Flag to allow overwriting
  169. @return A map dataset object
  170. This function will raise a ScriptError in case of an error.
  171. """
  172. mapset = get_current_mapset()
  173. dbif, connected = init_dbif(dbif)
  174. new_map = check_new_map_dataset(name, layer, "raster", overwrite, dbif)
  175. # Check if new map is in the temporal database
  176. if new_map.is_in_db(dbif):
  177. # Remove the existing temporal database entry
  178. map_id = new_map.get_id()
  179. new_map.delete(dbif)
  180. new_map = new_map.get_new_instance(map_id)
  181. if temporal_extent:
  182. new_map.set_temporal_extent(temporal_extent)
  183. if connected:
  184. dbif.close()
  185. return new_map