"""
Functions to open or create space time datasets
Usage:
.. code-block:: python
import grass.temporal as tgis
tgis.register_maps_in_space_time_dataset(type, name, maps)
(C) 2012-2014 by the 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.
:authors: Soeren Gebbert
"""
from .core import init_dbif, get_current_mapset, get_tgis_message_interface
from .factory import dataset_factory
from .abstract_map_dataset import AbstractMapDataset
###############################################################################
[docs]def open_old_stds(name, type, dbif=None):
"""This function opens an existing space time dataset and return the
created and initialized object of the specified type.
This function will call exit() or raise a
grass.pygrass.messages.FatalError in case the type is wrong,
or the space time dataset was not found.
:param name: The name of the space time dataset, if the name does not
contain the mapset (name@mapset) then the current mapset
will be used to identifiy the space time dataset
:param type: The type of the space time dataset (strd, str3ds, stvds,
raster, vector, raster3d)
:param dbif: The optional database interface to be used
:return: New stds object
"""
mapset = get_current_mapset()
msgr = get_tgis_message_interface()
# Check if the dataset name contains the mapset as well
if name.find("@") < 0:
id = name + "@" + mapset
else:
id = name
if type == "strds" or type == "rast" or type == "raster":
sp = dataset_factory("strds", id)
elif type == "str3ds" or type == "raster3d" or type == "rast3d" or type == "raster_3d":
sp = dataset_factory("str3ds", id)
elif type == "stvds" or type == "vect" or type == "vector":
sp = dataset_factory("stvds", id)
else:
msgr.fatal(_("Unknown type: %s") % (type))
dbif, connected = init_dbif(dbif)
if not sp.is_in_db(dbif):
dbif.close()
msgr.fatal(_("Space time %(sp)s dataset <%(name)s> not found") %
{'sp': sp.get_new_map_instance(None).get_type(),
'name': name})
# Read content from temporal database
sp.select(dbif)
if connected:
dbif.close()
return sp
###############################################################################
[docs]def check_new_stds(name, type, dbif=None, overwrite=False):
"""Check if a new space time dataset of a specific type can be created
:param name: The name of the new space time dataset
:param type: The type of the new space time dataset (strd, str3ds,
stvds, raster, vector, raster3d)
:param dbif: The temporal database interface to be used
:param overwrite: Flag to allow overwriting
:return: A space time dataset object that must be filled with
content before insertion in the temporal database
This function will raise a FatalError in case of an error.
"""
# Get the current mapset to create the id of the space time dataset
mapset = get_current_mapset()
msgr = get_tgis_message_interface()
if name.find("@") < 0:
id = name + "@" + mapset
else:
n, m = name.split("@")
if mapset != m:
msgr.fatal(_("Space time datasets can only be created in the "
"current mapset"))
id = name
if type == "strds" or type == "rast" or type == "raster":
sp = dataset_factory("strds", id)
elif type == "str3ds" or type == "raster3d" or type == "rast3d "or type == "raster_3d":
sp = dataset_factory("str3ds", id)
elif type == "stvds" or type == "vect" or type == "vector":
sp = dataset_factory("stvds", id)
else:
msgr.error(_("Unknown type: %s") % (type))
return None
dbif, connected = init_dbif(dbif)
if sp.is_in_db(dbif) and overwrite is False:
msgr.fatal(_("Space time %(sp)s dataset <%(name)s> is already in the"
" database. Use the overwrite flag.") % {
'sp': sp.get_new_map_instance(None).get_type(),
'name': name})
if connected:
dbif.close()
return sp
###############################################################################
[docs]def open_new_stds(name, type, temporaltype, title, descr, semantic,
dbif=None, overwrite=False):
"""Create a new space time dataset of a specific type
:param name: The name of the new space time dataset
:param type: The type of the new space time dataset (strd, str3ds,
stvds, raster, vector, raster3d)
:param temporaltype: The temporal type (relative or absolute)
:param title: The title
:param descr: The dataset description
:param semantic: Semantical information
:param dbif: The temporal database interface to be used
:param overwrite: Flag to allow overwriting
:return: The new created space time dataset
This function will raise a FatalError in case of an error.
"""
dbif, connected = init_dbif(dbif)
msgr = get_tgis_message_interface()
sp = check_new_stds(name, type, dbif, overwrite)
if sp.is_in_db(dbif):
msgr.warning(_("Overwriting space time %(sp)s dataset <%(name)s> and "
"unregistering all maps") % {
'sp': sp.get_new_map_instance(None).get_type(),
'name': name})
id = sp.get_id()
sp.delete(dbif)
sp = sp.get_new_instance(id)
msgr.verbose(_("Creating a new space time %s dataset") %
sp.get_new_map_instance(None).get_type())
sp.set_initial_values(temporal_type=temporaltype, semantic_type=semantic,
title=title, description=descr)
sp.insert(dbif)
if connected:
dbif.close()
return sp
############################################################################
[docs]def check_new_map_dataset(name, layer=None, type="raster",
overwrite=False, dbif=None):
"""Check if a new map dataset of a specific type can be created in
the temporal database
:param name: The name of the new map dataset
:param layer: The layer of the new map dataset
:param type: The type of the new map dataset (raster, vector, raster3d)
:param dbif: The temporal database interface to be used
:param overwrite: Flag to allow overwriting
:return: A map dataset object
This function will raise a FatalError in case of an error.
"""
mapset = get_current_mapset()
msgr = get_tgis_message_interface()
dbif, connected = init_dbif(dbif)
map_id = AbstractMapDataset.build_id(name, mapset, layer)
new_map = dataset_factory(type, map_id)
# Check if new map is in the temporal database
if new_map.is_in_db(dbif):
if not overwrite:
if connected:
dbif.close()
msgr.fatal(_("Map <%s> is already in temporal database,"
" use overwrite flag to overwrite") % (map_id))
if connected:
dbif.close()
return new_map
############################################################################
[docs]def open_new_map_dataset(name, layer=None, type="raster",
temporal_extent=None, overwrite=False,
dbif=None):
"""Create a new map dataset object of a specific type that can be
registered in the temporal database
:param name: The name of the new map dataset
:param layer: The layer of the new map dataset
:param type: The type of the new map dataset (raster, vector, raster3d)
:param dbif: The temporal database interface to be used
:param overwrite: Flag to allow overwriting
:return: A map dataset object
"""
mapset = get_current_mapset()
dbif, connected = init_dbif(dbif)
new_map = check_new_map_dataset(name, layer, type, overwrite, dbif)
# Check if new map is in the temporal database
if new_map.is_in_db(dbif):
# Remove the existing temporal database entry
map_id = new_map.get_id()
new_map.delete(dbif)
new_map = new_map.get_new_instance(map_id)
if temporal_extent:
new_map.set_temporal_extent(temporal_extent)
if connected:
dbif.close()
return new_map