浏览代码

Makefile to store sql scripts. Basic structures for spatio-temporal datasets implemented. Vector info implemented in python grass library.

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@48173 15284696-431f-4ddb-bdfa-cd5b030d7da7
Soeren Gebbert 13 年之前
父节点
当前提交
ec4d72f43d

+ 1 - 1
lib/python/raster3d.py

@@ -33,7 +33,7 @@ from core import *
 # run "r3.info -rstgip ..." and parse output
 # run "r3.info -rstgip ..." and parse output
 
 
 def raster3d_info(map):
 def raster3d_info(map):
-    """!Return information about a raster map (interface to
+    """!Return information about a raster3d map (interface to
     `r3.info'). Example:
     `r3.info'). Example:
 
 
     \code
     \code

+ 186 - 18
lib/python/temporal.py

@@ -9,6 +9,7 @@ Usage:
 @code
 @code
 from grass.script import temporal as grass
 from grass.script import temporal as grass
 
 
+grass.create_temporal_database()
 ...
 ...
 @endcode
 @endcode
 
 
@@ -19,32 +20,36 @@ for details.
 
 
 @author Soeren Gebbert
 @author Soeren Gebbert
 """
 """
-
+import os
 import sqlite3
 import sqlite3
 import os
 import os
 from datetime import datetime, date, time
 from datetime import datetime, date, time
+import getpass
 import core
 import core
 import raster
 import raster
+import vector
 import raster3d
 import raster3d
-import getpass
 
 
 def get_grass_location_db_path():
 def get_grass_location_db_path():
     grassenv = core.gisenv()
     grassenv = core.gisenv()
     dbpath = os.path.join(grassenv["GISDBASE"], grassenv["LOCATION_NAME"])
     dbpath = os.path.join(grassenv["GISDBASE"], grassenv["LOCATION_NAME"])
-    print os.path.join(dbpath, "grass.db")
     return os.path.join(dbpath, "grass.db")
     return os.path.join(dbpath, "grass.db")
 
 
 def get_sql_template_path():
 def get_sql_template_path():
-    return "./"
+    base = os.getenv("GISBASE")
+    base_etc  = os.path.join(base, "etc")
+    return os.path.join(base_etc, "sql")
 
 
 ###############################################################################
 ###############################################################################
 
 
 def create_temporal_database():
 def create_temporal_database():
     """This function creates the grass location database structure for raster, vector and raster3d maps
     """This function creates the grass location database structure for raster, vector and raster3d maps
     as well as for the space-time datasets strds, str3ds and stvds"""
     as well as for the space-time datasets strds, str3ds and stvds"""
+    
+    database = get_grass_location_db_path()
 
 
     # Check if it already exists
     # Check if it already exists
-    if os.path.exists(get_grass_location_db_path()):
+    if os.path.exists(database):
         return False
         return False
 
 
     # Read all SQL scripts and templates
     # Read all SQL scripts and templates
@@ -82,7 +87,7 @@ def create_temporal_database():
     sqlite3.complete_statement(str3ds_metadata_sql)
     sqlite3.complete_statement(str3ds_metadata_sql)
 
 
     # Connect to database
     # Connect to database
-    connection = sqlite3.connect(get_grass_location_db_path())
+    connection = sqlite3.connect(database)
     cursor = connection.cursor()
     cursor = connection.cursor()
 
 
     # Execute the SQL statements
     # Execute the SQL statements
@@ -212,12 +217,15 @@ class dict_sql_serializer():
 
 
 class sql_database_interface(dict_sql_serializer):
 class sql_database_interface(dict_sql_serializer):
     """This is the sql database interface to sqlite3"""
     """This is the sql database interface to sqlite3"""
-    def __init__(self, table=None, ident=None):
+    def __init__(self, table=None, ident=None, database=None):
 
 
         dict_sql_serializer.__init__(self)
         dict_sql_serializer.__init__(self)
 
 
         self.table = table # Name of the table, set in the subclass
         self.table = table # Name of the table, set in the subclass
-	self.database = get_grass_location_db_path()
+        if database == None:
+            self.database = get_grass_location_db_path()
+        else:
+            self.database = database
         self.ident = ident
         self.ident = ident
 
 
     def connect(self):
     def connect(self):
@@ -454,6 +462,48 @@ class vector_base(dataset_identifer):
 
 
 ###############################################################################
 ###############################################################################
 
 
+class stds_base(dataset_identifer):
+    def __init__(self, table=None, ident=None, name=None, mapset=None, semantic_type=None, creator=None, creation_time=None,\
+		    modification_time=None, temporal_type=None, revision=1):
+        dataset_identifer.__init__(self, table, ident, name, mapset, creator, creation_time,\
+	            modification_time, temporal_type, revision)
+
+	self.set_semantic_type(semantic_type)
+
+    def set_semantic_type(self, semantic_type):
+	"""Set the sematnic type of the space time dataset"""
+	self.D["semantic_type"] = semantic_type
+
+    def get_semantic_type(self):
+	"""Get the semantic_type of the space time dataset
+	   @return None if not found"""
+	if self.D.has_key("semantic_type"):
+	    return self.D["semantic_type"]
+        else:
+	    return None
+
+###############################################################################
+
+class strds_base(stds_base):
+    def __init__(self, ident=None, name=None, mapset=None,semantic_type=None,  creator=None, creation_time=None,\
+		    modification_time=None, temporal_type=None, revision=1):
+        stds_base.__init__(self, "strds_base", ident, name, mapset, semantic_type, creator, creation_time,\
+	            modification_time, temporal_type, revision)
+
+class str3ds_base(stds_base):
+    def __init__(self, ident=None, name=None, mapset=None,semantic_type=None,  creator=None, creation_time=None,\
+		    modification_time=None, temporal_type=None, revision=1):
+        stds_base.__init__(self, "str3ds_base", ident, name, mapset, semantic_type, creator, creation_time,\
+	            modification_time, temporal_type, revision)
+
+class stvds_base(stds_base):
+    def __init__(self, ident=None, name=None, mapset=None, semantic_type=None,  creator=None, creation_time=None,\
+		    modification_time=None, temporal_type=None, revision=1):
+        stds_base.__init__(self, "stvds_base", ident, name, mapset, semantic_type, creator, creation_time,\
+	            modification_time, temporal_type, revision)
+
+###############################################################################
+
 class absolute_timestamp(sql_database_interface):
 class absolute_timestamp(sql_database_interface):
     """This is the absolute time base class for all maps and spacetime datasets"""
     """This is the absolute time base class for all maps and spacetime datasets"""
     def __init__(self, table=None, ident=None, start_time=None, end_time=None, timezone=None):
     def __init__(self, table=None, ident=None, start_time=None, end_time=None, timezone=None):
@@ -709,6 +759,40 @@ class vector_absolute_time(absolute_timestamp):
 
 
 ###############################################################################
 ###############################################################################
 
 
+class stds_absolute_time(absolute_timestamp):
+    def __init__(self, table=None, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
+        absolute_timestamp.__init__(self, table, ident, start_time, end_time, timezone)
+
+	self.set_granularity(granularity)
+
+    def set_granularity(self, granularity):
+	"""Set the granularity of the space time dataset"""
+	self.D["granularity"] = granularity
+
+    def get_granularity(self):
+	"""Get the granularity of the space time dataset
+	   @return None if not found"""
+	if self.D.has_key("granularity"):
+	    return self.D["granularity"]
+        else:
+	    return None
+
+###############################################################################
+
+class strds_absolute_time(stds_absolute_time):
+    def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
+        stds_absolute_time.__init__(self, "strds_absolute_time", ident, start_time, end_time, granularity, timezone)
+
+class str3ds_absolute_time(stds_absolute_time):
+    def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
+        stds_absolute_time.__init__(self, "str3ds_absolute_time", ident, start_time, end_time, granularity, timezone)
+
+class stvds_absolute_time(stds_absolute_time):
+    def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
+        stds_absolute_time.__init__(self, "stvds_absolute_time", ident, start_time, end_time, granularity, timezone)
+
+###############################################################################
+
 class relative_timestamp(sql_database_interface):
 class relative_timestamp(sql_database_interface):
     """This is the relative time base class for all maps and spacetime datasets"""
     """This is the relative time base class for all maps and spacetime datasets"""
     def __init__(self, table=None, ident=None, interval=None):
     def __init__(self, table=None, ident=None, interval=None):
@@ -799,6 +883,40 @@ class raster3d_relative_time(relative_timestamp):
 class vector_relative_time(relative_timestamp):
 class vector_relative_time(relative_timestamp):
     def __init__(self, ident=None, interval=None):
     def __init__(self, ident=None, interval=None):
         relative_timestamp.__init__(self, "vector_relative_time", ident, interval)
         relative_timestamp.__init__(self, "vector_relative_time", ident, interval)
+        
+###############################################################################
+
+class stds_relative_time(relative_timestamp):
+    def __init__(self, table=None, ident=None, interval=None, granularity=None):
+        relative_timestamp.__init__(self, table, ident, interval)
+
+	self.set_granularity(granularity)
+
+    def set_granularity(self, granularity):
+	"""Set the granularity of the space time dataset"""
+	self.D["granularity"] = granularity
+
+    def get_granularity(self):
+	"""Get the granularity of the space time dataset
+	   @return None if not found"""
+	if self.D.has_key("granularity"):
+	    return self.D["granularity"]
+        else:
+	    return None
+
+###############################################################################
+
+class strds_relative_time(stds_relative_time):
+    def __init__(self, ident=None, interval=None, granularity=None):
+        stds_relative_time.__init__(self, "strds_relative_time", ident, interval, granularity)
+
+class str3ds_relative_time(stds_relative_time):
+    def __init__(self, ident=None, interval=None, granularity=None):
+        stds_relative_time.__init__(self, "str3ds_relative_time", ident, interval, granularity)
+
+class stvds_relative_time(stds_relative_time):
+    def __init__(self, ident=None, interval=None, granularity=None):
+        stds_relative_time.__init__(self, "stvds_relative_time", ident, interval, granularity)
 
 
 ###############################################################################
 ###############################################################################
 
 
@@ -914,17 +1032,29 @@ class spatial_extent(sql_database_interface):
 ###############################################################################
 ###############################################################################
 
 
 class raster_spatial_extent(spatial_extent):
 class raster_spatial_extent(spatial_extent):
-    def __init__(self, ident=None, interval=None, north=None, south=None, east=None, west=None, top=None, bottom=None):
+    def __init__(self, ident=None, north=None, south=None, east=None, west=None, top=None, bottom=None):
         spatial_extent.__init__(self, "raster_spatial_extent", ident, north, south, east, west, top, bottom)
         spatial_extent.__init__(self, "raster_spatial_extent", ident, north, south, east, west, top, bottom)
 
 
 class raster3d_spatial_extent(spatial_extent):
 class raster3d_spatial_extent(spatial_extent):
-    def __init__(self, ident=None, interval=None, north=None, south=None, east=None, west=None, top=None, bottom=None):
+    def __init__(self, ident=None, north=None, south=None, east=None, west=None, top=None, bottom=None):
         spatial_extent.__init__(self, "raster3d_spatial_extent", ident, north, south, east, west, top, bottom)
         spatial_extent.__init__(self, "raster3d_spatial_extent", ident, north, south, east, west, top, bottom)
 
 
 class vector_spatial_extent(spatial_extent):
 class vector_spatial_extent(spatial_extent):
-    def __init__(self, ident=None, interval=None, north=None, south=None, east=None, west=None, top=None, bottom=None):
+    def __init__(self, ident=None, north=None, south=None, east=None, west=None, top=None, bottom=None):
         spatial_extent.__init__(self, "vector_spatial_extent", ident, north, south, east, west, top, bottom)
         spatial_extent.__init__(self, "vector_spatial_extent", ident, north, south, east, west, top, bottom)
 
 
+class strds_spatial_extent(spatial_extent):
+    def __init__(self, ident=None, north=None, south=None, east=None, west=None, top=None, bottom=None):
+        spatial_extent.__init__(self, "strds_spatial_extent", ident, north, south, east, west, top, bottom)
+
+class str3ds_spatial_extent(spatial_extent):
+    def __init__(self, ident=None, north=None, south=None, east=None, west=None, top=None, bottom=None):
+        spatial_extent.__init__(self, "str3ds_spatial_extent", ident, north, south, east, west, top, bottom)
+
+class stvds_spatial_extent(spatial_extent):
+    def __init__(self, ident=None, north=None, south=None, east=None, west=None, top=None, bottom=None):
+        spatial_extent.__init__(self, "stvds_spatial_extent", ident, north, south, east, west, top, bottom)
+
 ###############################################################################
 ###############################################################################
 
 
 class raster_metadata_base(sql_database_interface):
 class raster_metadata_base(sql_database_interface):
@@ -1218,9 +1348,6 @@ class abstract_dataset():
 	    self.relative_time.print_self()
 	    self.relative_time.print_self()
 	self.spatial_extent.print_self()
 	self.spatial_extent.print_self()
 	self.metadata.print_self()
 	self.metadata.print_self()
-
-    def load_from_file(self):
-        raise IOError("This method must be implemented in the subclasses")
     
     
     def is_time_absolute(self):
     def is_time_absolute(self):
 	if self.base.D.has_key("temporal_type"):
 	if self.base.D.has_key("temporal_type"):
@@ -1258,7 +1385,8 @@ class raster_dataset(abstract_dataset):
 	self.spatial_extent = raster_spatial_extent(ident=ident)
 	self.spatial_extent = raster_spatial_extent(ident=ident)
 	self.metadata = raster_metadata(ident=ident)
 	self.metadata = raster_metadata(ident=ident)
 
 
-    def load_from_file(self):
+    def load(self):
+        """Load all info from an existing raster map into the internal structure"""
         
         
         # Get the data from an existing raster map
         # Get the data from an existing raster map
         kvp = raster.raster_info(self.ident)
         kvp = raster.raster_info(self.ident)
@@ -1294,7 +1422,6 @@ class raster_dataset(abstract_dataset):
         self.metadata.set_cols(cols)
         self.metadata.set_cols(cols)
         self.metadata.set_rows(rows)
         self.metadata.set_rows(rows)
         self.metadata.set_number_of_cells(ncells)
         self.metadata.set_number_of_cells(ncells)
-        
 
 
 ###############################################################################
 ###############################################################################
 
 
@@ -1312,7 +1439,8 @@ class raster3d_dataset(abstract_dataset):
 	self.spatial_extent = raster3d_spatial_extent(ident=ident)
 	self.spatial_extent = raster3d_spatial_extent(ident=ident)
 	self.metadata = raster3d_metadata(ident=ident)
 	self.metadata = raster3d_metadata(ident=ident)
 
 
-    def load_from_file(self):
+    def load(self):
+        """Load all info from an existing raster3d map into the internal structure"""
         
         
         # Get the data from an existing raster map
         # Get the data from an existing raster map
         kvp = raster3d.raster3d_info(self.ident)
         kvp = raster3d.raster3d_info(self.ident)
@@ -1336,7 +1464,7 @@ class raster3d_dataset(abstract_dataset):
         
         
         self.metadata.set_nsres(kvp["nsres"])
         self.metadata.set_nsres(kvp["nsres"])
         self.metadata.set_ewres(kvp["ewres"])
         self.metadata.set_ewres(kvp["ewres"])
-        self.metadata.set_ewres(kvp["tbres"])
+        self.metadata.set_tbres(kvp["tbres"])
         self.metadata.set_datatype(kvp["datatype"])
         self.metadata.set_datatype(kvp["datatype"])
         self.metadata.set_min(kvp["min"])
         self.metadata.set_min(kvp["min"])
         self.metadata.set_max(kvp["max"])
         self.metadata.set_max(kvp["max"])
@@ -1352,3 +1480,43 @@ class raster3d_dataset(abstract_dataset):
         self.metadata.set_depths(rows)
         self.metadata.set_depths(rows)
         self.metadata.set_number_of_cells(ncells)
         self.metadata.set_number_of_cells(ncells)
         
         
+
+###############################################################################
+
+class vector_dataset(abstract_dataset):
+    def __init__(self, ident):
+	self.reset(ident)
+        
+    def reset(self, ident):
+	"""Reset the internal structure and set the identifier"""
+	self.ident = ident
+
+	self.base = vector_base(ident=ident)
+	self.absolute_time = vector_absolute_time(ident=ident)
+	self.relative_time = vector_relative_time(ident=ident)
+	self.spatial_extent = vector_spatial_extent(ident=ident)
+	self.metadata = vector_metadata(ident=ident)
+
+    def load(self):
+        """Load all info from an existing vector map into the internal structure"""
+        
+        # Get the data from an existing raster map
+        kvp = vector.vector_info(self.ident)
+        
+        # Fill base information
+        
+        self.base.set_name(self.ident.split("@")[0])
+        self.base.set_mapset(self.ident.split("@")[1])
+        self.base.set_creator(str(getpass.getuser()))
+        
+        # Fill spatial extent
+                
+        self.spatial_extent.set_north(kvp["north"])
+        self.spatial_extent.set_south(kvp["south"])
+        self.spatial_extent.set_west(kvp["west"])
+        self.spatial_extent.set_east(kvp["east"])
+        self.spatial_extent.set_top(kvp["top"])
+        self.spatial_extent.set_bottom(kvp["bottom"])
+        
+        # Fill metadata .. no metadata yet
+        

+ 42 - 0
lib/python/vector.py

@@ -163,6 +163,48 @@ def vector_info_topo(map):
     
     
     return ret
     return ret
 
 
+
+# run "v.info -get ..." and parse output
+
+def vector_info(map):
+    """!Return information about a vector map (interface to
+    `v.info'). Example:
+
+    \code
+    >>> grass.vector_info('random_points')
+    {'comment': '', 'projection': 'x,y', 'creator': 'soeren', 'holes': 0, 
+     'primitives': 20, 'kernels': 0, 'scale': '1:1', 'title': '', 
+     'west': 0.046125489999999998, 'top': 2376.133159, 'boundaries': 0, 
+     'location': 'XYLocation', 'nodes': 0, 'east': 0.97305646000000001, 
+     'source_date': 'Mon Aug 29 10:55:57 2011', 'north': 0.9589993, 
+     'format': 'native', 'faces': 0, 'centroids': 0, 
+     'digitization_threshold': '0.000000', 'islands': 0, 'level': 2, 
+     'mapset': 'test', 'areas': 0, 'name': 'random_points', 
+     'database': '/home/soeren/grassdata', 'bottom': 22.186596999999999, 
+     'lines': 0, 'points': 20, 'map3d': True, 'volumes': 0, 'num_dblinks': 0, 
+     'organization': '', 'south': 0.066047099999999997}
+    
+    \endcode
+    @param map map name
+    
+    @return parsed vector info
+    """
+
+    s = read_command('v.info', flags = 'get', map = map)
+    
+    kv = parse_key_val(s)
+    for k in ['north', 'south', 'east', 'west', 'top', 'bottom']:
+	kv[k] = float(kv[k])
+    for k in ['level', 'num_dblinks']:
+	kv[k] = int(kv[k])
+    for k in ['nodes', 'points', 'lines', 'boundaries', 'centroids', 'areas', 'islands', \
+              'faces', 'kernels', 'volumes', 'holes', 'primitives']:
+	kv[k] = int(kv[k])
+    if 'map3d' in kv:
+        kv['map3d'] = bool(kv['map3d'])
+    return kv
+
+
 # interface for v.db.select
 # interface for v.db.select
 
 
 def vector_db_select(map, layer = 1, **kwargs):
 def vector_db_select(map, layer = 1, **kwargs):

+ 15 - 0
lib/temporal/Makefile

@@ -0,0 +1,15 @@
+MODULE_TOPDIR = ../..
+
+include $(MODULE_TOPDIR)/include/Make/Other.make
+
+SQLDIR = $(ETC)/sql
+
+SQLFILES:= $(wildcard *.sql)
+
+default: copy_sql_files
+
+copy_sql_files: $(SQLDIR)
+	for i in $(SQLFILES); do $(INSTALL_DATA) $$i $(SQLDIR)/; done
+
+$(SQLDIR): 
+	$(MKDIR) $@

+ 3 - 3
lib/temporal/raster3d_metadata_table.sql

@@ -13,7 +13,7 @@ PRAGMA foreign_keys = ON;
 CREATE TABLE  raster3d_metadata (
 CREATE TABLE  raster3d_metadata (
   id VARCHAR NOT NULL,                  -- The id (PFK) is the unique identifier for all tables, it is based on name and mapset (name@mapset) and is used as primary foreign key
   id VARCHAR NOT NULL,                  -- The id (PFK) is the unique identifier for all tables, it is based on name and mapset (name@mapset) and is used as primary foreign key
   str3ds_register VARCHAR, -- The name of the table storing all space-time raster3d datasets in which this map is registered
   str3ds_register VARCHAR, -- The name of the table storing all space-time raster3d datasets in which this map is registered
-  maptype VARCHAR NOT NULL,
+  datatype VARCHAR NOT NULL,
   cols INTEGER NOT NULL,
   cols INTEGER NOT NULL,
   rows INTEGER NOT NULL,
   rows INTEGER NOT NULL,
   depths INTEGER NOT NULL,
   depths INTEGER NOT NULL,
@@ -36,7 +36,7 @@ CREATE VIEW raster3d_view_abs_time AS SELECT
             A1.revision, A1.creator, 
             A1.revision, A1.creator, 
 	    A2.start_time, A2.end_time, 
 	    A2.start_time, A2.end_time, 
             A3.north, A3.south, A3.east, A3.west,
             A3.north, A3.south, A3.east, A3.west,
-	    A4.maptype, A4.cols, A4.rows, A4.depths,
+	    A4.datatype, A4.cols, A4.rows, A4.depths,
             A4.nsres, A4.ewres, A4.tbres,
             A4.nsres, A4.ewres, A4.tbres,
             A4.min, A4.max,
             A4.min, A4.max,
 	    A4.str3ds_register,
 	    A4.str3ds_register,
@@ -52,7 +52,7 @@ CREATE VIEW raster3d_view_rel_time AS SELECT
             A1.revision, A1.creator, 
             A1.revision, A1.creator, 
 	    A2.interval,
 	    A2.interval,
             A3.north, A3.south, A3.east, A3.west,
             A3.north, A3.south, A3.east, A3.west,
-	    A4.maptype, A4.cols, A4.rows, A4.depths,
+	    A4.datatype, A4.cols, A4.rows, A4.depths,
             A4.nsres, A4.ewres, A4.tbres,
             A4.nsres, A4.ewres, A4.tbres,
             A4.min, A4.max,
             A4.min, A4.max,
 	    A4.str3ds_register,
 	    A4.str3ds_register,

+ 4 - 4
lib/temporal/stds_tables_template.sql

@@ -16,8 +16,8 @@ CREATE TABLE  STDS_base (
   creator VARCHAR NOT NULL,            -- Name of the creator
   creator VARCHAR NOT NULL,            -- Name of the creator
   temporal_type VARCHAR NOT NULL,      -- The temporal type of the dataset "absolute" or "relative" 
   temporal_type VARCHAR NOT NULL,      -- The temporal type of the dataset "absolute" or "relative" 
   semantic_type VARCHAR NOT NULL,      -- The semantic data description used for aggregation/decomposition algorithm selection
   semantic_type VARCHAR NOT NULL,      -- The semantic data description used for aggregation/decomposition algorithm selection
-  creation_time TIMESTAMP NOT NULL,     -- The time of creation of the space-time dataset
-  modification_time TIMESTAMP NOT NULL, -- The time of the last modification of the space-time dataset
+  creation_time TIMESTAMP NOT NULL,    -- The time of creation of the space-time dataset
+  modification_time TIMESTAMP NOT NULL,-- The time of the last modification of the space-time dataset
   revision SMALLINT NOT NULL,          -- The revision number
   revision SMALLINT NOT NULL,          -- The revision number
   PRIMARY KEY (id)
   PRIMARY KEY (id)
 );
 );
@@ -32,8 +32,8 @@ CREATE TABLE  STDS_relative_time (
 
 
 CREATE TABLE  STDS_absolute_time (
 CREATE TABLE  STDS_absolute_time (
   id VARCHAR NOT NULL,            -- Id of the space-time dataset, this is the primary foreign key
   id VARCHAR NOT NULL,            -- Id of the space-time dataset, this is the primary foreign key
-  start_time TIMESTAMP,            -- Start of the valid time, can be NULL if no map is registered
-  end_time TIMESTAMP,              -- End of the valid time, can be NULL if no map is registered
+  start_time TIMESTAMP,           -- Start of the valid time, can be NULL if no map is registered
+  end_time TIMESTAMP,             -- End of the valid time, can be NULL if no map is registered
   granularity VARCHAR,            -- The granularity "NNN seconds, NNN minutes, NNN hours, NNN days, NNN weeks, NNN months, NNN years"
   granularity VARCHAR,            -- The granularity "NNN seconds, NNN minutes, NNN hours, NNN days, NNN weeks, NNN months, NNN years"
   timezone SMALLINT,              -- The time zone number
   timezone SMALLINT,              -- The time zone number
   PRIMARY KEY (id),  
   PRIMARY KEY (id),  

+ 218 - 20
lib/temporal/test.temporal.py

@@ -1,5 +1,6 @@
-from temporal import *
 import os
 import os
+from grass.script.temporal import *
+import grass.script as grass
 
 
 ###############################################################################
 ###############################################################################
 
 
@@ -20,7 +21,7 @@ def test_dataset_identifer():
 	    base.print_self()
 	    base.print_self()
 
 
 	for i in range(2):
 	for i in range(2):
-	    base = raster3d_base(ident="soil" + str(i) + "@PERMANENT", name="soil" + str(i), mapset="PERMANENT", creator="soeren")
+	    base = raster3d_base(ident="soil" + str(i) + "@PERMANENT", name="soil" + str(i), mapset="PERMANENT", temporal_type="absolute", creator="soeren")
 	    base.insert()
 	    base.insert()
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
@@ -31,7 +32,7 @@ def test_dataset_identifer():
 	    base.print_self()
 	    base.print_self()
 
 
 	for i in range(2):
 	for i in range(2):
-	    base = vector_base(ident="soil" + str(i) + "@PERMANENT", name="soil" + str(i), mapset="PERMANENT", creator="soeren")
+	    base = vector_base(ident="soil" + str(i) + "@PERMANENT", name="soil" + str(i), mapset="PERMANENT", temporal_type="absolute", creator="soeren")
 	    base.insert()
 	    base.insert()
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
@@ -41,6 +42,39 @@ def test_dataset_identifer():
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
 
 
+	for i in range(2):
+	    base = strds_base(ident="soil" + str(i) + "@PERMANENT", name="soil" + str(i), mapset="PERMANENT", creator="soeren", semantic_type="event", temporal_type="absolute", revision=1)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_creator("rene")
+	    base.update()
+	    base.select()
+	    base.print_self()
+
+	for i in range(2):
+	    base = str3ds_base(ident="soil" + str(i) + "@PERMANENT", name="soil" + str(i), mapset="PERMANENT", temporal_type="absolute", semantic_type="event", creator="soeren")
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_creator("rene")
+	    base.update()
+	    base.select()
+	    base.print_self()
+
+	for i in range(2):
+	    base = stvds_base(ident="soil" + str(i) + "@PERMANENT", name="soil" + str(i), mapset="PERMANENT", temporal_type="absolute", semantic_type="event", creator="soeren")
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_creator("rene")
+	    base.update()
+	    base.select()
+	    base.print_self()
+            
 def test_absolute_timestamp():
 def test_absolute_timestamp():
 	for i in range(2):
 	for i in range(2):
 	    base = raster_absolute_time(ident="soil" + str(i) + "@PERMANENT", start_time=datetime(2011,01,01), end_time=datetime(2011,07,01), timezone=1)
 	    base = raster_absolute_time(ident="soil" + str(i) + "@PERMANENT", start_time=datetime(2011,01,01), end_time=datetime(2011,07,01), timezone=1)
@@ -74,7 +108,40 @@ def test_absolute_timestamp():
 	    base.update()
 	    base.update()
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
+            
+	for i in range(2):
+	    base = strds_absolute_time(ident="soil" + str(i) + "@PERMANENT", start_time=datetime(2011,01,01), end_time=datetime(2011,07,01), granularity="1 day", timezone=1)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_start_time(datetime(2010,01,01))
+	    base.update()
+	    base.select()
+	    base.print_self()
+
+	for i in range(2):
+	    base = str3ds_absolute_time(ident="soil" + str(i) + "@PERMANENT", start_time=datetime(2011,01,01), end_time=datetime(2011,07,01), granularity="1 day", timezone=1)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_start_time(datetime(2010,01,01))
+	    base.update()
+	    base.select()
+	    base.print_self()
 
 
+	for i in range(2):
+	    base = stvds_absolute_time(ident="soil" + str(i) + "@PERMANENT", start_time=datetime(2011,01,01), end_time=datetime(2011,07,01), granularity="1 day", timezone=1)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_start_time(datetime(2010,01,01))
+	    base.update()
+	    base.select()
+	    base.print_self()
+            
 def test_spatial_extent():
 def test_spatial_extent():
 	for i in range(2):
 	for i in range(2):
 	    base = raster_spatial_extent(ident="soil" + str(i) + "@PERMANENT", north=100 + i, south=10+i, east=50+i, west=20+i, top=i, bottom=0)
 	    base = raster_spatial_extent(ident="soil" + str(i) + "@PERMANENT", north=100 + i, south=10+i, east=50+i, west=20+i, top=i, bottom=0)
@@ -108,6 +175,39 @@ def test_spatial_extent():
 	    base.update()
 	    base.update()
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
+            
+	for i in range(2):
+	    base = strds_spatial_extent(ident="soil" + str(i) + "@PERMANENT", north=100 + i, south=10+i, east=50+i, west=20+i, top=i, bottom=0)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_north(120+i)
+	    base.update()
+	    base.select()
+	    base.print_self()
+
+	for i in range(2):
+	    base = str3ds_spatial_extent(ident="soil" + str(i) + "@PERMANENT", north=100 + i, south=10+i, east=50+i, west=20+i, top=i, bottom=0)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_north(120+i)
+	    base.update()
+	    base.select()
+	    base.print_self()
+
+	for i in range(2):
+	    base = stvds_spatial_extent(ident="soil" + str(i) + "@PERMANENT", north=100 + i, south=10+i, east=50+i, west=20+i, top=i, bottom=0)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_north(120+i)
+	    base.update()
+	    base.select()
+	    base.print_self()
 
 
 def test_relative_timestamp():
 def test_relative_timestamp():
 	for i in range(2):
 	for i in range(2):
@@ -142,28 +242,61 @@ def test_relative_timestamp():
 	    base.update()
 	    base.update()
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
+            
+	for i in range(2):
+	    base = strds_relative_time(ident="soil" + str(i) + "@PERMANENT", interval=i, granularity=5.5)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_interval(i+1)
+	    base.update()
+	    base.select()
+	    base.print_self()
 
 
+	for i in range(2):
+	    base = str3ds_relative_time(ident="soil" + str(i) + "@PERMANENT", interval=i, granularity=5.5)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_interval(i+1)
+	    base.update()
+	    base.select()
+	    base.print_self()
+
+	for i in range(2):
+	    base = stvds_relative_time(ident="soil" + str(i) + "@PERMANENT", interval=i, granularity=5.5)
+	    base.insert()
+	    base.select()
+	    base.print_self()
+	    base.clear()
+	    base.set_interval(i+1)
+	    base.update()
+	    base.select()
+	    base.print_self()
+            
 def test_map_metadata():
 def test_map_metadata():
 	for i in range(2):
 	for i in range(2):
-	    base = raster_metadata(ident="soil" + str(i) + "@PERMANENT", strds_register="PERMANENT_soil_strds-register", maptype="CELL", \
+	    base = raster_metadata(ident="soil" + str(i) + "@PERMANENT", strds_register="PERMANENT_soil_strds-register", datatype="CELL", \
 			    cols=500, rows=400, number_of_cells=200000,nsres=1, ewres=1, min=0, max=33)
 			    cols=500, rows=400, number_of_cells=200000,nsres=1, ewres=1, min=0, max=33)
 	    base.insert()
 	    base.insert()
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
 	    base.clear()
 	    base.clear()
-	    base.set_maptype("FCELL")
+	    base.set_datatype("FCELL")
 	    base.update()
 	    base.update()
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
 
 
 	for i in range(2):
 	for i in range(2):
-	    base = raster3d_metadata(ident="soil" + str(i) + "@PERMANENT", str3ds_register="PERMANENT_soil_str3ds-register", maptype="FCELL", \
+	    base = raster3d_metadata(ident="soil" + str(i) + "@PERMANENT", str3ds_register="PERMANENT_soil_str3ds-register", datatype="FCELL", \
 			    cols=500, rows=400, depths=20, number_of_cells=200000,nsres=1, ewres=1, tbres=10, min=0, max=33)
 			    cols=500, rows=400, depths=20, number_of_cells=200000,nsres=1, ewres=1, tbres=10, min=0, max=33)
 	    base.insert()
 	    base.insert()
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
 	    base.clear()
 	    base.clear()
-	    base.set_maptype("DCELL")
+	    base.set_datatype("DCELL")
 	    base.update()
 	    base.update()
 	    base.select()
 	    base.select()
 	    base.print_self()
 	    base.print_self()
@@ -244,10 +377,10 @@ def test_base_absolute_time_extent_metadata():
 	for i in range(10):
 	for i in range(10):
 	    base = vector_metadata(ident="water" + str(i) + "@PERMANENT", stvds_register="PERMANENT_water_stvds_register")
 	    base = vector_metadata(ident="water" + str(i) + "@PERMANENT", stvds_register="PERMANENT_water_stvds_register")
 	    base.insert()
 	    base.insert()
-	    base = raster_metadata(ident="water" + str(i) + "@PERMANENT", strds_register="PERMANENT_water_strds-register", maptype="CELL", \
+	    base = raster_metadata(ident="water" + str(i) + "@PERMANENT", strds_register="PERMANENT_water_strds-register", datatype="CELL", \
 			    cols=500, rows=400, number_of_cells=200000,nsres=1, ewres=1, min=0, max=33)
 			    cols=500, rows=400, number_of_cells=200000,nsres=1, ewres=1, min=0, max=33)
 	    base.insert()
 	    base.insert()
-	    base = raster3d_metadata(ident="water" + str(i) + "@PERMANENT", str3ds_register="PERMANENT_water_str3ds-register", maptype="FCELL", \
+	    base = raster3d_metadata(ident="water" + str(i) + "@PERMANENT", str3ds_register="PERMANENT_water_str3ds-register", datatype="FCELL", \
 			    cols=500, rows=400, depths=20, number_of_cells=200000,nsres=1, ewres=1, tbres=10, min=0, max=33)
 			    cols=500, rows=400, depths=20, number_of_cells=200000,nsres=1, ewres=1, tbres=10, min=0, max=33)
 	    base.insert()
 	    base.insert()
 
 
@@ -256,10 +389,10 @@ def test_base_absolute_time_extent_metadata():
 	    base.set_stvds_register("PERMANENT_water_stvds_register")
 	    base.set_stvds_register("PERMANENT_water_stvds_register")
 	    base.update()
 	    base.update()
 	    base = raster_metadata(ident="water" + str(i) + "@PERMANENT")
 	    base = raster_metadata(ident="water" + str(i) + "@PERMANENT")
-	    base.set_maptype("DCELL")
+	    base.set_datatype("DCELL")
 	    base.update()
 	    base.update()
 	    base = raster3d_metadata(ident="water" + str(i) + "@PERMANENT")
 	    base = raster3d_metadata(ident="water" + str(i) + "@PERMANENT")
-	    base.set_maptype("DCELL")
+	    base.set_datatype("DCELL")
 	    base.update()
 	    base.update()
 
 
 	for i in range(10):
 	for i in range(10):
@@ -342,33 +475,98 @@ def test_absolut_time_temporal_relations():
 
 
 
 
 def test_raster_dataset():
 def test_raster_dataset():
+    
+    grass.raster.mapcalc("test = sin(x()) + cos(y())", overwrite = True)
+    
+    name = "test"
+    mapset =  grass.gisenv()["MAPSET"]
+    
     print "Create a raster object"
     print "Create a raster object"
 
 
-    rds = raster_dataset("a@test")
+    rds = raster_dataset(name + "@" + mapset)
     
     
-    rds.load_from_file()
+    rds.load()
     
     
-    print "Is in db: ", rds.base.is_in_db()
+    print "Is in db: ", rds.is_in_db()
     
     
     rds.base.set_ttype("absolue")
     rds.base.set_ttype("absolue")
     rds.absolute_time.set_start_time(datetime(year=2000, month=1, day=1))
     rds.absolute_time.set_start_time(datetime(year=2000, month=1, day=1))
     rds.absolute_time.set_end_time(datetime(year=2010, month=1, day=1))
     rds.absolute_time.set_end_time(datetime(year=2010, month=1, day=1))
     
     
     # Remove the entry if it is in the db
     # Remove the entry if it is in the db
-    rds.base.delete()
+    rds.delete()
     
     
     rds.insert()
     rds.insert()
     rds.print_self()
     rds.print_self()
 
 
     print rds.temporal_relation(rds)
     print rds.temporal_relation(rds)
 
 
+def test_raster3d_dataset():
+    
+    grass.raster3d.mapcalc3d("test = sin(x()) + cos(y()) + sin(z())", overwrite = True)
+    
+    name = "test"
+    mapset =  grass.gisenv()["MAPSET"]
+    
+    print "Create a raster3d object"
+
+    r3ds = raster3d_dataset(name + "@" + mapset)
+    
+    r3ds.load()
+    
+    print "Is in db: ", r3ds.is_in_db()
+    r3ds.print_self()
+    
+    r3ds.base.set_ttype("absolue")
+    r3ds.absolute_time.set_start_time(datetime(year=2000, month=1, day=1))
+    r3ds.absolute_time.set_end_time(datetime(year=2010, month=1, day=1))
+    
+    # Remove the entry if it is in the db
+    r3ds.delete()
+    
+    r3ds.insert()
+    r3ds.print_self()
+
+    print r3ds.temporal_relation(r3ds)
+
+def test_vector_dataset():
+    
+    grass.run_command("v.random", output="test", n=20, column="height", zmin=0, \
+                      zmax=100, flags="z", overwrite = True)
+    
+    name = "test"
+    mapset =  grass.gisenv()["MAPSET"]
+    
+    print "Create a vector object"
+
+    vds = vector_dataset(name + "@" + mapset)
+    
+    vds.load()
+    
+    print "Is in db: ", vds.is_in_db()
+    vds.print_self()
+    
+    vds.base.set_ttype("absolue")
+    vds.absolute_time.set_start_time(datetime(year=2000, month=1, day=1))
+    vds.absolute_time.set_end_time(datetime(year=2010, month=1, day=1))
+    
+    # Remove the entry if it is in the db
+    vds.delete()
+    
+    vds.insert()
+    vds.print_self()
+
+    print vds.temporal_relation(vds)
+
 #test_dict_sql_serializer()
 #test_dict_sql_serializer()
 create_temporal_database()
 create_temporal_database()
-#test_dataset_identifer()
-#test_absolute_timestamp()
-#test_relative_timestamp()
-#test_spatial_extent()
+test_dataset_identifer()
+test_absolute_timestamp()
+test_relative_timestamp()
+test_spatial_extent()
 #test_map_metadata()
 #test_map_metadata()
 #test_base_absolute_time_extent_metadata()
 #test_base_absolute_time_extent_metadata()
 #test_absolut_time_temporal_relations()
 #test_absolut_time_temporal_relations()
-test_raster_dataset()
+#test_raster_dataset()
+#test_raster3d_dataset()
+#test_vector_dataset()