浏览代码

Added t.unregister as replacement for tr.unregister, tv.unregister
and tr3.unregister to reduce the complexity of the temporal GIS framework
and to avoid redundant functionality.


git-svn-id: https://svn.osgeo.org/grass/grass/trunk@50787 15284696-431f-4ddb-bdfa-cd5b030d7da7

Soeren Gebbert 13 年之前
父节点
当前提交
ea68c757c2

+ 6 - 11
temporal/Makefile

@@ -8,28 +8,23 @@ SUBDIRS = \
 	t.info \
 	t.info \
 	t.remove \
 	t.remove \
 	t.sample \
 	t.sample \
-	t.time.abs \
-	t.time.rel \
+	t.register \
+	t.unregister \
 	tr.aggregate \
 	tr.aggregate \
 	tr.aggregate.ds \
 	tr.aggregate.ds \
-	tr.register \
 	tr.to.rast3 \
 	tr.to.rast3 \
 	tr.univar \
 	tr.univar \
 	tr.list \
 	tr.list \
-	tv.list \
-	tr3.list \
 	tr.series \
 	tr.series \
 	tr.export \
 	tr.export \
 	tr.out.vtk \
 	tr.out.vtk \
 	tr.import \
 	tr.import \
 	tr.extract \
 	tr.extract \
+	tr3.list \
 	tr3.extract \
 	tr3.extract \
-	tr3.register \
-	tv.register \
-	tr.unregister \
-	tr3.unregister \
-	tv.unregister \
-	tv.what.rast 
+	tv.list \
+	tv.what.rast \
+	tv.oberve.rast 
 
 
 PGM = tgisintro
 PGM = tgisintro
 
 

+ 10 - 105
temporal/t.register/t.register.py

@@ -41,10 +41,10 @@
 #%option
 #%option
 #% key: type
 #% key: type
 #% type: string
 #% type: string
-#% description: Input space time dataset type
+#% description: Type of the input map(s)
 #% required: no
 #% required: no
-#% options: strds, stvds, str3ds
-#% answer: strds
+#% options: rast, vect, rast3d
+#% answer: rast
 #%end
 #%end
 
 
 #%option
 #%option
@@ -139,7 +139,7 @@ def register_maps_in_space_time_dataset(type, name, maps=None, file=None, start=
        It takes care of the correct update of the space time datasets from all
        It takes care of the correct update of the space time datasets from all
        registered maps.
        registered maps.
 
 
-       @param type: The type of the maps raster, raster3d or vector
+       @param type: The type of the maps rast, rast3d or vect
        @param name: The name of the space time dataset
        @param name: The name of the space time dataset
        @param maps: A comma separated list of map names
        @param maps: A comma separated list of map names
        @param file: Input file one map with start and optional end time, one per line
        @param file: Input file one map with start and optional end time, one per line
@@ -175,7 +175,12 @@ def register_maps_in_space_time_dataset(type, name, maps=None, file=None, start=
     else:
     else:
         id = name
         id = name
 
 
-    sp = tgis.dataset_factory(type, id)
+    if type == "rast":
+        sp = tgis.dataset_factory("strds", id)
+    if type == "rast3d":
+        sp = tgis.dataset_factory("str3ds", id)
+    if type == "vect":
+        sp = tgis.dataset_factory("stvds", id)
 
 
     connect = False
     connect = False
 
 
@@ -316,106 +321,6 @@ def register_maps_in_space_time_dataset(type, name, maps=None, file=None, start=
         
         
 ###############################################################################
 ###############################################################################
 
 
-def unregister_maps_from_space_time_datasets(type, name, maps, file=None, dbif=None):
-    """Unregister maps from a single space time dataset or, in case no dataset name is provided,
-       unregister from all datasets within the maps are registered.
-
-       @param type: The type of the maps raster, vector or raster3d
-       @param name: Name of an existing space time raster dataset. If no name is provided the raster map(s) are unregistered from all space time datasets in which they are registered.
-       @param maps: A comma separated list of map names
-       @param file: Input file one map per line
-       @param dbif: The database interface to be used
-    """
-
-    if maps and file:
-        grass.fatal(_("%s= and %s= are mutually exclusive") % ("input","file"))
-
-    mapset =  grass.gisenv()["MAPSET"]
-
-    if dbif == None:
-        dbif = sql_database_interface()
-        dbif.connect()
-        connect = True
-
-    # In case a space time dataset is specified
-    if name:
-        # Check if the dataset name contains the mapset as well
-        if name.find("@") < 0:
-            id = name + "@" + mapset
-        else:
-            id = name
-
-        if type == "rast":
-            sp = dataset_factory("strds", id)
-        if type == "rast3d":
-            sp = dataset_factory("str3ds", id)
-        if type == "vect":
-            sp = dataset_factory("stvds", id)
-
-        if sp.is_in_db(dbif) == False:
-            dbif.close()
-            grass.fatal("Space time " + sp.get_new_map_instance(None).get_type() + " dataset <" + name + "> not found")
-
-    maplist = []
-
-    dummy = raster_dataset(None)
-
-    # Map names as comma separated string
-    if maps != None:
-	if maps.find(",") == -1:
-	    maplist = [maps,]
-	else:
-	    maplist = maps.split(",")
-	    
-	# Build the maplist
-	for count in range(len(maplist)):
-	    mapname = maplist[count]
-	    mapid = dummy.build_id(mapname, mapset)
-            maplist[count] = mapid
-            
-    # Read the map list from file
-    if file:
-        fd = open(file, "r")
-
-        line = True
-        while True:
-            line = fd.readline()
-            if not line:
-                break
-
-            line_list = line.split(fs)
-            mapname = line_list[0].strip()
-	    mapid = dummy.build_id(mapname, mapset)
-            maplist.append(mapid)
-            
-    num_maps = len(maplist)
-    count = 0
-    for mapid in maplist:
-	grass.percent(count, num_maps, 1)
-            
-        print mapid
-        map = dataset_factory(type, mapid)
-
-        # Unregister map if in database
-        if map.is_in_db(dbif) == True:
-            if name:
-                sp.select(dbif)
-                sp.unregister_map(map, dbif)
-            else:
-                map.select(dbif)
-                map.unregister(dbif)
-		
-	count += 1
-
-    if name:
-        sp.update_from_registered_maps(dbif)
-
-    if connect == True:
-        dbif.close()
-	
-    grass.percent(num_maps, num_maps, 1)
-
-
 if __name__ == "__main__":
 if __name__ == "__main__":
     options, flags = grass.parser()
     options, flags = grass.parser()
     main()
     main()

+ 6 - 6
temporal/t.register/test.t.register.raster.file.reltime.sh

@@ -61,33 +61,33 @@ t.register -i input=precip_abs8 file="${n1}" start=0 increment=7 unit=days
 t.info type=strds input=precip_abs8
 t.info type=strds input=precip_abs8
 tr.list input=precip_abs8
 tr.list input=precip_abs8
 # File 1
 # File 1
-t.remove --v type=rast file="${n1}"
+t.unregister --v type=rast file="${n1}"
 t.register input=precip_abs8 file="${n1}" start=20 unit=years
 t.register input=precip_abs8 file="${n1}" start=20 unit=years
 t.info type=strds input=precip_abs8
 t.info type=strds input=precip_abs8
 tr.list input=precip_abs8
 tr.list input=precip_abs8
 # File 2
 # File 2
-t.remove --v type=rast file="${n1}"
+t.unregister --v type=rast file="${n1}"
 t.register input=precip_abs8 file="${n2}" unit=minutes
 t.register input=precip_abs8 file="${n2}" unit=minutes
 t.info type=strds input=precip_abs8
 t.info type=strds input=precip_abs8
 tr.list input=precip_abs8
 tr.list input=precip_abs8
 # File 2 ERROR ERROR -- Increment computation needs to be fixed
 # File 2 ERROR ERROR -- Increment computation needs to be fixed
-t.remove --v type=rast file="${n1}"
+t.unregister --v type=rast file="${n1}"
 t.register input=precip_abs8 file="${n2}" increment=14 unit=days
 t.register input=precip_abs8 file="${n2}" increment=14 unit=days
 t.info type=strds input=precip_abs8
 t.info type=strds input=precip_abs8
 tr.list input=precip_abs8
 tr.list input=precip_abs8
 # File 2 ERROR ERROR -- Increment computation needs to be fixed
 # File 2 ERROR ERROR -- Increment computation needs to be fixed
-t.remove --v type=rast file="${n1}"
+t.unregister --v type=rast file="${n1}"
 t.register -i input=precip_abs8 file="${n2}" increment=14 unit=days
 t.register -i input=precip_abs8 file="${n2}" increment=14 unit=days
 t.info type=strds input=precip_abs8
 t.info type=strds input=precip_abs8
 tr.list input=precip_abs8
 tr.list input=precip_abs8
 
 
 # File 3
 # File 3
-t.remove --v type=rast file="${n1}"
+t.unregister --v type=rast file="${n1}"
 t.register -i input=precip_abs8 file="${n3}" unit=seconds
 t.register -i input=precip_abs8 file="${n3}" unit=seconds
 t.info type=strds input=precip_abs8
 t.info type=strds input=precip_abs8
 tr.list input=precip_abs8
 tr.list input=precip_abs8
 
 
-t.remove --v type=rast file="${n1}"
+t.unregister --v type=rast file="${n1}"
 
 
 # @test of correct @failure handling
 # @test of correct @failure handling
 t.register -i input=precip_abs8 maps=preac_1,prec_2 file="${n3}" # Maps and file set
 t.register -i input=precip_abs8 maps=preac_1,prec_2 file="${n3}" # Maps and file set

+ 1 - 1
temporal/t.register/test.t.register.raster.file.sh

@@ -78,4 +78,4 @@ t.info type=strds input=precip_abs8
 tr.list input=precip_abs8
 tr.list input=precip_abs8
 
 
 t.remove --v type=strds input=precip_abs8
 t.remove --v type=strds input=precip_abs8
-t.remove --v type=rast file="${n1}"
+t.unregister --v type=rast file="${n1}"

+ 2 - 2
temporal/t.register/test.t.register.raster.sh

@@ -90,7 +90,7 @@ r.info map=prec_1
 tr.list input=precip_abs7
 tr.list input=precip_abs7
 t.topology input=precip_abs7
 t.topology input=precip_abs7
 
 
-t.remove type=rast input=prec_1,prec_2,prec_3
+t.unregister type=rast maps=prec_1,prec_2,prec_3
 t.remove type=strds input=precip_abs1,precip_abs2,precip_abs3,precip_abs4,precip_abs5,precip_abs6,precip_abs7
 t.remove type=strds input=precip_abs1,precip_abs2,precip_abs3,precip_abs4,precip_abs5,precip_abs6,precip_abs7
-t.remove type=rast input=prec_4,prec_5,prec_6
+t.unregister type=rast maps=prec_4,prec_5,prec_6
 r.info map=prec_1
 r.info map=prec_1

+ 11 - 12
temporal/t.register/test.t.register.raster3d.sh

@@ -28,12 +28,12 @@ t.create --v --o type=str3ds temporaltype=absolute output=volume_abs5 title="A t
 t.create --v --o type=str3ds temporaltype=absolute output=volume_abs6 title="A test" descr="A test"
 t.create --v --o type=str3ds temporaltype=absolute output=volume_abs6 title="A test" descr="A test"
 t.create --v --o type=str3ds temporaltype=absolute output=volume_abs7 title="A test" descr="A test"
 t.create --v --o type=str3ds temporaltype=absolute output=volume_abs7 title="A test" descr="A test"
 
 
-t.register type=str3ds --v -i input=volume_abs1 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="1 seconds"
+t.register type=rast3d --v -i input=volume_abs1 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="1 seconds"
 t.info type=str3ds input=volume_abs1
 t.info type=str3ds input=volume_abs1
 tr3.unregister --v input=volume_abs1 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6
 tr3.unregister --v input=volume_abs1 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6
 t.info type=str3ds input=volume_abs1
 t.info type=str3ds input=volume_abs1
 
 
-t.register type=str3ds --v -i input=volume_abs2 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="20 seconds, 5 minutes"
+t.register type=rast3d --v -i input=volume_abs2 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="20 seconds, 5 minutes"
 t.info type=str3ds input=volume_abs2
 t.info type=str3ds input=volume_abs2
 r3.info volume_1
 r3.info volume_1
 r3.info volume_2
 r3.info volume_2
@@ -42,29 +42,28 @@ r3.info volume_4
 r3.info volume_5
 r3.info volume_5
 r3.info volume_6
 r3.info volume_6
 
 
-t.register type=str3ds --v -i input=volume_abs3 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="8 hours"
+t.register type=rast3d --v -i input=volume_abs3 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="8 hours"
 t.info type=str3ds input=volume_abs3
 t.info type=str3ds input=volume_abs3
-tr3.unregister --v maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6
+t.unregister --v type=rast3d maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6
 t.info type=str3ds input=volume_abs3
 t.info type=str3ds input=volume_abs3
 
 
-t.register type=str3ds input=volume_abs4 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="3 days"
+t.register type=rast3d input=volume_abs4 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="3 days"
 t.info type=str3ds input=volume_abs4
 t.info type=str3ds input=volume_abs4
 
 
-t.register type=str3ds input=volume_abs5 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="4 weeks"
+t.register type=rast3d input=volume_abs5 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="4 weeks"
 t.info type=str3ds input=volume_abs5
 t.info type=str3ds input=volume_abs5
 
 
-t.register type=str3ds input=volume_abs6 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-08-01" increment="2 months"
+t.register type=rast3d input=volume_abs6 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-08-01" increment="2 months"
 t.info type=str3ds input=volume_abs6
 t.info type=str3ds input=volume_abs6
 
 
-t.register type=str3ds input=volume_abs7 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="20 years, 3 months, 1 days, 4 hours"
+t.register type=rast3d input=volume_abs7 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="20 years, 3 months, 1 days, 4 hours"
 t.info type=str3ds input=volume_abs7
 t.info type=str3ds input=volume_abs7
 # Register with different valid time again
 # Register with different valid time again
-t.register type=str3ds input=volume_abs7 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="99 years, 9 months, 9 days, 9 hours"
+t.register type=rast3d input=volume_abs7 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="99 years, 9 months, 9 days, 9 hours"
 t.info type=str3ds input=volume_abs7
 t.info type=str3ds input=volume_abs7
 # Register with different valid time again creating intervals
 # Register with different valid time again creating intervals
-t.register type=str3ds -i input=volume_abs7 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="99 years, 9 months, 9 days, 9 hours"
+t.register type=rast3d -i input=volume_abs7 maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6 start="2001-01-01" increment="99 years, 9 months, 9 days, 9 hours"
 t.info type=str3ds input=volume_abs7
 t.info type=str3ds input=volume_abs7
 
 
-t.remove --v type=rast3d input=volume_1,volume_2,volume_3
+t.unregister --v type=rast3d maps=volume_1,volume_2,volume_3,volume_4,volume_5,volume_6
 t.remove --v type=str3ds input=volume_abs1,volume_abs2,volume_abs3,volume_abs4,volume_abs5,volume_abs6,volume_abs7
 t.remove --v type=str3ds input=volume_abs1,volume_abs2,volume_abs3,volume_abs4,volume_abs5,volume_abs6,volume_abs7
-t.remove --v type=rast3d input=volume_4,volume_5,volume_6

+ 70 - 0
temporal/t.register/test.t.register.vector.file.layer.sh

@@ -0,0 +1,70 @@
+# This is a test to absolute time for vector maps with layer support
+# We need to set a specific region in the
+# @preprocess step of this test. We generate
+# vector with v.random.
+# The region setting should work for UTM and LL test locations
+g.region s=0 n=80 w=0 e=120 b=0 t=50 res=10 res3=10 -p3
+
+v.random --o -z output=lidar_abs_1 n=5 zmin=0 zmax=100 
+
+n1=`g.tempfile pid=4 -d` # Only map names and layer
+n2=`g.tempfile pid=5 -d` # Map names, layer and start time 
+n3=`g.tempfile pid=6 -d` # Map names, layer, start time and increment
+# The vector map
+v.random --o -z seed=1 output=lidar_abs_orig n=100 zmin=0 zmax=100 column=sand
+# Adding new layer with categories
+v.category input=lidar_abs_orig out=lidar_abs_1 option=transfer layer=1,2,3,4,5,6 --o
+
+cat > "${n1}" << EOF
+lidar_abs_1:1
+lidar_abs_1:2
+lidar_abs_1:3
+lidar_abs_1:4
+lidar_abs_1:5
+lidar_abs_1:6
+EOF
+cat "${n1}"
+
+cat > "${n2}" << EOF
+lidar_abs_1:1|2001-01-01
+lidar_abs_1:2|2001-02-01
+lidar_abs_1:3|2001-03-01
+lidar_abs_1:4|2001-04-01
+lidar_abs_1:5|2001-05-01
+lidar_abs_1:6|2001-06-01
+EOF
+cat "${n2}"
+
+cat > "${n3}" << EOF
+lidar_abs_1:1|2001-01-01|2001-04-01
+lidar_abs_1:2|2001-04-01|2001-07-01
+lidar_abs_1:3|2001-07-01|2001-10-01
+lidar_abs_1:4|2001-10-01|2002-01-01
+lidar_abs_1:5|2002-01-01|2002-04-01
+lidar_abs_1:6|2002-04-01|2002-07-01
+EOF
+cat "${n3}"
+
+t.create --v --o type=stvds temporaltype=absolute output=lidar_abs_ds1 title="A test" descr="A test"
+
+# The first @test
+# Test with input files
+# File 1
+t.register --v type=vect input=lidar_abs_ds1 file="${n1}" start="2001-01-01" increment="1 months"
+t.list type=vect columns=id,name,start_time,end_time where='name = "lidar_abs_1"'
+# File 1
+t.register --v type=vect input=lidar_abs_ds1 file="${n1}" start="2001-01-01"
+t.list type=vect columns=id,name,start_time,end_time where='name = "lidar_abs_1"'
+# File 2
+t.register --v type=vect input=lidar_abs_ds1 file="${n2}" 
+t.list type=vect columns=id,name,start_time,end_time where='name = "lidar_abs_1"'
+# File 2
+t.register --v type=vect input=lidar_abs_ds1 -i file="${n2}" start=file increment="1 months"
+t.list type=vect columns=id,name,start_time,end_time where='name = "lidar_abs_1"'
+# File 3
+t.register --v type=vect input=lidar_abs_ds1 file="${n3}" start=file 
+t.list type=vect columns=id,name,start_time,end_time where='name = "lidar_abs_1"'
+
+t.unregister --v type=vect maps=lidar_abs_1:1,lidar_abs_1:2,lidar_abs_1:3,lidar_abs_1:4,lidar_abs_1:5,lidar_abs_1:6
+t.remove type=stvds input=lidar_abs_ds1
+g.remove vect=lidar_abs_1,lidar_abs_orig

+ 13 - 13
temporal/t.register/test.t.register.vector.sh

@@ -28,37 +28,37 @@ t.create --v --o type=stvds temporaltype=absolute output=lidar_abs_ds5 title="A
 t.create --v --o type=stvds temporaltype=absolute output=lidar_abs_ds6 title="A test" descr="A test"
 t.create --v --o type=stvds temporaltype=absolute output=lidar_abs_ds6 title="A test" descr="A test"
 t.create --v --o type=stvds temporaltype=absolute output=lidar_abs_ds7 title="A test" descr="A test"
 t.create --v --o type=stvds temporaltype=absolute output=lidar_abs_ds7 title="A test" descr="A test"
 
 
-t.register type=stvds --v -i input=lidar_abs_ds1 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="1 seconds"
+t.register type=vect --v -i input=lidar_abs_ds1 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="1 seconds"
 t.info type=stvds input=lidar_abs_ds1
 t.info type=stvds input=lidar_abs_ds1
-tv.unregister --v input=lidar_abs_ds1 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6
+t.unregister --v type=vect input=lidar_abs_ds1 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6
 t.info type=stvds input=lidar_abs_ds1
 t.info type=stvds input=lidar_abs_ds1
 
 
-t.register type=stvds --v -i input=lidar_abs_ds2 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="20 seconds, 5 minutes"
+t.register type=vect --v -i input=lidar_abs_ds2 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="20 seconds, 5 minutes"
 t.info type=stvds input=lidar_abs_ds2
 t.info type=stvds input=lidar_abs_ds2
 
 
-t.register type=stvds --v -i input=lidar_abs_ds3 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="8 hours"
+t.register type=vect --v -i input=lidar_abs_ds3 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="8 hours"
 t.info type=stvds input=lidar_abs_ds3
 t.info type=stvds input=lidar_abs_ds3
-tv.unregister --v maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6
+t.unregister --v type=vect maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6
 t.info type=stvds input=lidar_abs_ds3
 t.info type=stvds input=lidar_abs_ds3
 
 
-t.register type=stvds input=lidar_abs_ds4 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="3 days"
+t.register type=vect input=lidar_abs_ds4 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="3 days"
 t.info type=stvds input=lidar_abs_ds4
 t.info type=stvds input=lidar_abs_ds4
 
 
-t.register type=stvds input=lidar_abs_ds5 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="4 weeks"
+t.register type=vect input=lidar_abs_ds5 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="4 weeks"
 t.info type=stvds input=lidar_abs_ds5
 t.info type=stvds input=lidar_abs_ds5
 
 
-t.register type=stvds input=lidar_abs_ds6 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-08-01" increment="2 months"
+t.register type=vect input=lidar_abs_ds6 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-08-01" increment="2 months"
 t.info type=stvds input=lidar_abs_ds6
 t.info type=stvds input=lidar_abs_ds6
 
 
-t.register type=stvds input=lidar_abs_ds7 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="20 years, 3 months, 1 days, 4 hours"
+t.register type=vect input=lidar_abs_ds7 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="20 years, 3 months, 1 days, 4 hours"
 t.info type=stvds input=lidar_abs_ds7
 t.info type=stvds input=lidar_abs_ds7
 # Register with different valid time again
 # Register with different valid time again
-t.register type=stvds input=lidar_abs_ds7 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="99 years, 9 months, 9 days, 9 hours"
+t.register type=vect input=lidar_abs_ds7 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="99 years, 9 months, 9 days, 9 hours"
 t.info type=stvds input=lidar_abs_ds7
 t.info type=stvds input=lidar_abs_ds7
 # Register with different valid time again creating an interval
 # Register with different valid time again creating an interval
-t.register type=stvds -i input=lidar_abs_ds7 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="99 years, 9 months, 9 days, 9 hours"
+t.register type=vect -i input=lidar_abs_ds7 maps=lidar_abs_1,lidar_abs_2,lidar_abs_3,lidar_abs_4,lidar_abs_5,lidar_abs_6 start="2001-01-01" increment="99 years, 9 months, 9 days, 9 hours"
 t.info type=stvds input=lidar_abs_ds7
 t.info type=stvds input=lidar_abs_ds7
 
 
-t.remove --v type=vect input=lidar_abs_1,lidar_abs_2,lidar_abs_3
+t.unregister --v type=vect maps=lidar_abs_1,lidar_abs_2,lidar_abs_3
 t.remove --v type=stvds input=lidar_abs_ds1,lidar_abs_ds2,lidar_abs_ds3,lidar_abs_ds4,lidar_abs_ds5,lidar_abs_ds6,lidar_abs_ds7
 t.remove --v type=stvds input=lidar_abs_ds1,lidar_abs_ds2,lidar_abs_ds3,lidar_abs_ds4,lidar_abs_ds5,lidar_abs_ds6,lidar_abs_ds7
-t.remove --v type=vect input=lidar_abs_4,lidar_abs_5,lidar_abs_6
+t.unregister --v type=vect maps=lidar_abs_4,lidar_abs_5,lidar_abs_6

+ 2 - 2
temporal/t.support/t.support.py

@@ -35,8 +35,8 @@
 #% description: The semantic type of the space time dataset
 #% description: The semantic type of the space time dataset
 #% required: no
 #% required: no
 #% multiple: no
 #% multiple: no
-#% options: event, const, continuous
-#% answer: event
+#% options: min,max,sum,mean
+#% answer: mean
 #%end
 #%end
 
 
 #%option
 #%option

+ 21 - 1
temporal/t.topology/test.t.topology.abstime.sh

@@ -16,12 +16,17 @@ r.mapcalc --o expr="prec_3 = rand(0, 320)"
 r.mapcalc --o expr="prec_4 = rand(0, 510)"
 r.mapcalc --o expr="prec_4 = rand(0, 510)"
 r.mapcalc --o expr="prec_5 = rand(0, 300)"
 r.mapcalc --o expr="prec_5 = rand(0, 300)"
 r.mapcalc --o expr="prec_6 = rand(0, 650)"
 r.mapcalc --o expr="prec_6 = rand(0, 650)"
+r.mapcalc --o expr="A = 1"
+r.mapcalc --o expr="B = 2"
+r.mapcalc --o expr="C = 3"
+r.mapcalc --o expr="D = 3"
 
 
 n1=`g.tempfile pid=1 -d` 
 n1=`g.tempfile pid=1 -d` 
 n2=`g.tempfile pid=2 -d`
 n2=`g.tempfile pid=2 -d`
 n3=`g.tempfile pid=3 -d`
 n3=`g.tempfile pid=3 -d`
 n4=`g.tempfile pid=4 -d`
 n4=`g.tempfile pid=4 -d`
 n5=`g.tempfile pid=5 -d`
 n5=`g.tempfile pid=5 -d`
+n6=`g.tempfile pid=6 -d`
 
 
 cat > "${n1}" << EOF
 cat > "${n1}" << EOF
 prec_1
 prec_1
@@ -68,10 +73,19 @@ prec_5|2001-05-01|2001-05-01
 prec_6|2001-06-01|2001-07-01
 prec_6|2001-06-01|2001-07-01
 EOF
 EOF
 
 
+cat > "${n6}" << EOF
+A|1990-06-01|1990-06-05
+B|1990-06-05|1990-06-18
+C|1990-06-10|1990-06-13
+D|1990-06-16|1990-06-20
+EOF
+
+
 
 
 # The first @test
 # The first @test
 # We create the space time raster inputs and register the raster maps with absolute time interval
 # We create the space time raster inputs and register the raster maps with absolute time interval
 t.create --o type=strds temporaltype=absolute output=precip_abs title="A test with input files" descr="A test with input files"
 t.create --o type=strds temporaltype=absolute output=precip_abs title="A test with input files" descr="A test with input files"
+t.create --o type=strds temporaltype=absolute output=maps title="A test with maps in input files" descr="A test with maps in input files"
 
 
 tr.register -i input=precip_abs file="${n1}" start="2001-01-01" increment="1 months"
 tr.register -i input=precip_abs file="${n1}" start="2001-01-01" increment="1 months"
 cat "${n1}"
 cat "${n1}"
@@ -98,5 +112,11 @@ cat "${n5}"
 t.topology    input=precip_abs
 t.topology    input=precip_abs
 t.topology -m input=precip_abs
 t.topology -m input=precip_abs
 
 
-t.remove type=strds input=precip_abs
+tr.register -i input=maps file="${n6}" start=file end=file
+cat "${n6}"
+t.topology    input=maps
+t.topology -m input=maps
+
+t.remove type=strds input=precip_abs,maps
 t.remove type=rast file="${n1}"
 t.remove type=rast file="${n1}"
+t.remove type=rast input=A,B,C,D

+ 7 - 0
temporal/t.unregister/Makefile

@@ -0,0 +1,7 @@
+MODULE_TOPDIR = ../../
+
+PGM = t.unregister
+
+include $(MODULE_TOPDIR)/include/Make/Script.make
+
+default: script $(TEST_DST)

+ 0 - 0
temporal/t.unregister/t.unregister.html


+ 212 - 0
temporal/t.unregister/t.unregister.py

@@ -0,0 +1,212 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+############################################################################
+#
+# MODULE:	t.unregister
+# AUTHOR(S):	Soeren Gebbert
+#               
+# PURPOSE:	Unregister raster, vector and raster3d maps from the temporal database or a specific space time dataset
+# COPYRIGHT:	(C) 2011 by the GRASS Development Team
+#
+#		This program is free software under the GNU General Public
+#		License (version 2). Read the file COPYING that comes with GRASS
+#		for details.
+#
+#############################################################################
+
+#%module
+#% description: Unregister raster, vector and raster3d maps from the temporal database or a specific space time dataset
+#% keywords: temporal
+#% keywords: raster
+#% keywords: vector
+#% keywords: raster3d
+#% keywords: strds
+#% keywords: stvds
+#% keywords: str3ds
+#%end
+
+#%option
+#% key: input
+#% type: string
+#% description: Name of an existing space time raster dataset. If no name is provided the raster map(s) are unregistered from all space time datasets in which they are registered.
+#% required: no
+#% multiple: no
+#%end
+
+#%option
+#% key: file
+#% type: string
+#% description: Input file with map names, one per line
+#% required: no
+#% multiple: no
+#%end
+
+#%option
+#% key: type
+#% type: string
+#% description: Type of the input map(s)
+#% required: no
+#% options: rast, vect, rast3d
+#% answer: rast
+#%end
+
+
+#%option
+#% key: maps
+#% type: string
+#% description: Name(s) of existing raster, vector or raster3d map(s) to unregister
+#% required: no
+#% multiple: yes
+#%end
+
+import grass.script as grass
+import grass.temporal as tgis
+
+############################################################################
+
+def main():
+
+    # Get the options
+    file = options["file"]
+    name = options["input"]
+    maps = options["maps"]
+    type = options["type"]
+
+    # Make sure the temporal database exists
+    tgis.create_temporal_database()
+    # Unregister maps
+    unregister_maps_from_space_time_datasets(type=type, name=name, maps=maps, file=file, dbif=None)
+
+############################################################################
+
+def unregister_maps_from_space_time_datasets(type, name, maps, file=None, dbif=None):
+    """Unregister maps from a single space time dataset or, in case no dataset name is provided,
+       unregister from all datasets within the maps are registered.
+
+       @param type: The type of the maps raster, vector or raster3d
+       @param name: Name of an existing space time raster dataset. If no name is provided the raster map(s) are unregistered from all space time datasets in which they are registered.
+       @param maps: A comma separated list of map names
+       @param file: Input file one map per line
+       @param dbif: The database interface to be used
+    """
+
+    if maps and file:
+        grass.fatal(_("%s= and %s= are mutually exclusive") % ("input","file"))
+
+    if not maps and not file:
+        grass.fatal(_("%s= or %s= must be specified") % ("input","file"))
+
+
+    mapset =  grass.gisenv()["MAPSET"]
+
+    if dbif == None:
+        dbif = tgis.sql_database_interface()
+        dbif.connect()
+        connect = True
+
+    # In case a space time dataset is specified
+    if name:
+        # Check if the dataset name contains the mapset as well
+        if name.find("@") < 0:
+            id = name + "@" + mapset
+        else:
+            id = name
+
+        if type == "rast":
+            sp = tgis.dataset_factory("strds", id)
+        if type == "rast3d":
+            sp = tgis.dataset_factory("str3ds", id)
+        if type == "vect":
+            sp = tgis.dataset_factory("stvds", id)
+
+        if sp.is_in_db(dbif) == False:
+            dbif.close()
+            grass.fatal("Space time " + sp.get_new_map_instance(None).get_type() + " dataset <" + name + "> not found")
+
+    maplist = []
+
+    dummy = tgis.raster_dataset(None)
+
+    # Map names as comma separated string
+    if maps != None:
+	if maps.find(",") == -1:
+	    maplist = [maps,]
+	else:
+	    maplist = maps.split(",")
+	    
+	# Build the maplist
+	for count in range(len(maplist)):
+	    mapname = maplist[count]
+	    mapid = dummy.build_id(mapname, mapset)
+            maplist[count] = mapid
+            
+    # Read the map list from file
+    if file:
+        fd = open(file, "r")
+
+        line = True
+        while True:
+            line = fd.readline()
+            if not line:
+                break
+
+            mapname = line.strip()
+	    mapid = dummy.build_id(mapname, mapset)
+            maplist.append(mapid)
+            
+    num_maps = len(maplist)
+    update_dict = {}
+    count = 0
+    for mapid in maplist:
+	grass.percent(count, num_maps, 1)
+            
+        print mapid
+        map = tgis.dataset_factory(type, mapid)
+
+        # Unregister map if in database
+        if map.is_in_db(dbif) == True:
+            # Unregister from a single dataset
+            if name:
+                sp.select(dbif)
+                sp.unregister_map(map, dbif)
+            # Unregister from temporal database
+            else:
+                # We need to update all datasets after the removement of maps
+                map.select(dbif)
+                datasets = map.get_registered_datasets(dbif)
+                # Store all unique dataset ids in a dictionary
+                if datasets:
+                    for dataset in datasets:
+                        update_dict[dataset["id"]] = dataset["id"]
+                map.delete(dbif, update=False)
+		
+	count += 1
+
+    # Update space time datasets
+    if name:
+        sp.update_from_registered_maps(dbif)
+    elif len(update_dict) > 0:
+        for key in update_dict.keys():
+            id = update_dict[key]
+            if type == "rast":
+                sp = tgis.dataset_factory("strds", id)
+            elif type == "rast3d":
+                sp = tgis.dataset_factory("str3ds", id)
+            elif type == "vect":
+                sp = tgis.dataset_factory("stvds", id)
+            else:
+                break
+
+            sp.select(dbif)
+            sp.update_from_registered_maps(dbif)
+
+    if connect == True:
+        dbif.close()
+	
+    grass.percent(num_maps, num_maps, 1)
+
+###############################################################################
+
+if __name__ == "__main__":
+    options, flags = grass.parser()
+    main()