[GRASS-SVN] r48770 - grass/trunk/lib/python/temporal
svn_grass at osgeo.org
svn_grass at osgeo.org
Thu Oct 13 07:04:02 EDT 2011
Author: huhabla
Date: 2011-10-13 04:04:02 -0700 (Thu, 13 Oct 2011)
New Revision: 48770
Modified:
grass/trunk/lib/python/temporal/space_time_datasets_tools.py
Log:
Added file option to several temporal modules
Modified: grass/trunk/lib/python/temporal/space_time_datasets_tools.py
===================================================================
--- grass/trunk/lib/python/temporal/space_time_datasets_tools.py 2011-10-12 20:54:20 UTC (rev 48769)
+++ grass/trunk/lib/python/temporal/space_time_datasets_tools.py 2011-10-13 11:04:02 UTC (rev 48770)
@@ -26,7 +26,7 @@
###############################################################################
-def register_maps_in_space_time_dataset(type, name, maps, start=None, increment=None, dbif = None, interval=False):
+def register_maps_in_space_time_dataset(type, name, maps=None, file=None, start=None, end=None, increment=None, dbif = None, interval=False, fs="|"):
"""Use this method to register maps in space time datasets. This function is generic and
can handle raster, vector and raster3d maps as well as there space time datasets.
@@ -39,12 +39,35 @@
@param type: The type of the maps raster, raster3d or vector
@param name: The name of the space time dataset
@param maps: A comma separated list of map names
+ @param file: Input file one map with optional start and end time, one per line
@param start: The start date and time of the first raster map, in case the map has no date (format absolute: "yyyy-mm-dd HH:MM:SS" or "yyyy-mm-dd", format relative 5.0)
@param increment: Time increment between maps for time stamp creation (format absolute: NNN seconds, minutes, hours, days, weeks, months, years; format relative: 1.0)
@param dbif: The database interface to be used
@param interval: If True, time intervals are created in case the start time and an increment is provided
+ @param fs: Field separator used in input file
"""
+ start_time_in_file = False
+ end_time_in_file = False
+
+ if maps and file:
+ core.fata(_("%s= and %s= are mutually exclusive") % ("input","file"))
+
+ if end and increment:
+ core.fata(_("%s= and %s= are mutually exclusive") % ("end","increment"))
+
+ if end and not start:
+ core.fata(_("Please specify %s= and %s=") % ("start_time","end_time"))
+
+ if not maps and not file:
+ core.fata(_("Please specify %s= or %s=") % ("input","file"))
+
+ if start and start == "file":
+ start_time_in_file = True
+
+ if end and end == "file":
+ end_time_in_file = True
+
# We may need the mapset
mapset = core.gisenv()["MAPSET"]
@@ -54,11 +77,11 @@
else:
id = name
- if type == "raster":
+ if type == "rast":
sp = space_time_raster_dataset(id)
- if type == "raster3d":
+ if type == "rast3d":
sp = space_time_raster3d_dataset(id)
- if type == "vector":
+ if type == "vect":
sp = space_time_vector_dataset(id)
connect = False
@@ -73,34 +96,77 @@
if sp.is_in_db(dbif) == False:
dbif.close()
- core.fatal("Space time " + sp.get_new_map_instance(None).get_type() + " dataset <" + name + "> not found")
+ core.fatal(_("Space time %s dataset <%s> no found") % (sp.get_new_map_instance(None).get_type(). name))
- if maps.find(",") == -1:
- maplist = (maps,)
- else:
- maplist = tuple(maps.split(","))
+ maplist = []
+ # Map names as comma separated string
+ if maps:
+ if maps.find(",") == -1:
+ maplist = (maps,)
+ else:
+ maplist = tuple(maps.split(","))
+
+ # 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()
+
+ if mapname.find("@") < 0:
+ mapid = mapname + "@" + mapset
+ else:
+ mapid = mapname
+
+ row = {}
+ row["id"] = mapid
+
+ if start_time_in_file and end_time_in_file:
+ row["start"] = line_list[1].strip()
+ row["end"] = line_list[2].strip()
+
+ if start_time_in_file and not end_time_in_file:
+ row["start"] = line_list[1].strip()
+
+ maplist.append(row)
+
num_maps = len(maplist)
count = 0
- for mapname in maplist:
+ for entry in maplist:
core.percent(count, num_maps, 1)
- mapname = mapname.strip()
- # Check if the map name contains the mapset as well
- if mapname.find("@") < 0:
- mapid = mapname + "@" + mapset
+
+ # Get a new instance of the space time dataset map type
+ if file:
+ map = sp.get_new_map_instance(entry["id"])
else:
- mapid = mapname
- # Get a new instance of the space time dataset map type
- map = sp.get_new_map_instance(mapid)
+ if entry.find("@") < 0:
+ mapid = entry + "@" + mapset
+ else:
+ mapid = entry
- # In case the map is already registered print a message and continue to the next map
+ map = sp.get_new_map_instance(mapid)
+ # Use the time data from file
+ if start_time_in_file:
+ start = entry["start"]
+ if end_time_in_file:
+ end = entry["end"]
+
# Put the map into the database
if map.is_in_db(dbif) == False:
# Break in case no valid time is provided
if start == "" or start == None:
dbif.close()
- core.fatal("Unable to register " + map.get_type() + " map <" + map.get_id() + ">. The map has no valid time and the start time is not set.")
+ core.fatal(_("Unable to register %s map <%s>. The map has no valid time and the start time is not set.") % \
+ (map.get_type(), map.get_id() ))
# Load the data from the grass file database
map.load()
@@ -114,11 +180,15 @@
map.select(dbif)
if map.get_temporal_type() != sp.get_temporal_type():
dbif.close()
- core.fatal("Unable to register " + map.get_type() + " map <" + map.get_id() + ">. The temporal types are different.")
+ core.fatal(_("Unable to register %s map <%s>. The temporal types are different.") % (map.get_type(), map.get_id()))
+ # In case the time is in the input file we ignore the increment counter
+ if start_time_in_file:
+ count = 1
+
# Set the valid time
if start:
- assign_valid_time_to_map(ttype=sp.get_temporal_type(), map=map, start=start, end=None, increment=increment, mult=count, dbif=dbif, interval=interval)
+ assign_valid_time_to_map(ttype=sp.get_temporal_type(), map=map, start=start, end=end, increment=increment, mult=count, dbif=dbif, interval=interval)
# Finally Register map in the space time dataset
sp.register_map(map, dbif)
@@ -134,7 +204,7 @@
###############################################################################
-def unregister_maps_from_space_time_datasets(type, name, maps, 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.
@@ -143,6 +213,10 @@
@param maps: A comma separated list of map names
@param dbif: The database interface to be used
"""
+
+ if maps and file:
+ core.fata(_("%s= and %s= are mutually exclusive") % ("input","file"))
+
mapset = core.gisenv()["MAPSET"]
if dbif == None:
@@ -158,23 +232,40 @@
else:
id = name
- if type == "raster":
+ if type == "rast":
sp = space_time_raster_dataset(id)
- if type == "raster3d":
+ if type == "rast3d":
sp = space_time_raster3d_dataset(id)
- if type == "vector":
+ if type == "vect":
sp = space_time_vector_dataset(id)
if sp.is_in_db(dbif) == False:
dbif.close()
core.fatal("Space time " + sp.get_new_map_instance(None).get_type() + " dataset <" + name + "> not found")
- # Build the list of maps
- if maps.find(",") == -1:
- maplist = (maps,)
- else:
- maplist = tuple(maps.split(","))
+ maplist = []
+ # Map names as comma separated string
+ if maps:
+ if maps.find(",") == -1:
+ maplist = (maps,)
+ else:
+ maplist = tuple(maps.split(","))
+
+ # 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()
+ maplist.append(mapname)
+
num_maps = len(maplist)
count = 0
for mapname in maplist:
@@ -187,11 +278,11 @@
mapid = mapname
# Create a new instance with the map type
- if type == "raster":
+ if type == "rast":
map = raster_dataset(mapid)
- if type == "raster3d":
+ if type == "rast3d":
map = raster3d_dataset(mapid)
- if type == "vector":
+ if type == "vect":
map = vector_dataset(mapid)
# Unregister map if in database
@@ -215,7 +306,7 @@
###############################################################################
-def assign_valid_time_to_maps(type, maps, ttype, start, end=None, increment=None, dbif = None, interval=False):
+def assign_valid_time_to_maps(type, maps, ttype, start, end=None, file=file, increment=None, dbif = None, interval=False, fs="|"):
"""Use this method to assign valid time (absolute or relative) to raster,
raster3d and vector datasets.
@@ -229,10 +320,15 @@
@param start: The start date and time of the first raster map (format absolute: "yyyy-mm-dd HH:MM:SS" or "yyyy-mm-dd", format relative 5.0)
@param end: The end date and time of the first raster map (format absolute: "yyyy-mm-dd HH:MM:SS" or "yyyy-mm-dd", format relative 5.0)
@param increment: Time increment between maps for time stamp creation (format absolute: NNN seconds, minutes, hours, days, weeks, months, years; format relative: 1.0)
+ @param file: Input file one map with optional start and end time, one per line
@param dbif: The database interface to be used
@param interval: If True, time intervals are created in case the start time and an increment is provided
+ @param fs: Field separator used in input file
"""
+ start_time_in_file = False
+ end_time_in_file = False
+
if end and increment:
if dbif:
dbif.close()
@@ -241,38 +337,100 @@
# List of space time datasets to be updated
splist = {}
+ if maps and file:
+ core.fata(_("%s= and %s= are mutually exclusive") % ("input","file"))
+
+ if end and increment:
+ core.fata(_("%s= and %s= are mutually exclusive") % ("end","increment"))
+
+ if end and not start:
+ core.fata(_("Please specify %s= and %s=") % ("start_time","end_time"))
+
+ if not maps and not file:
+ core.fata(_("Please specify %s= or %s=") % ("input","file"))
+
+ if start and start == "file":
+ start_time_in_file = True
+
+ if end and end == "file":
+ end_time_in_file = True
+
# We may need the mapset
mapset = core.gisenv()["MAPSET"]
+ connect = False
+
if dbif == None:
dbif = sql_database_interface()
dbif.connect()
connect = True
- if maps.find(",") == -1:
- maplist = (maps,)
- else:
- maplist = tuple(maps.split(","))
+ maplist = []
+ # Map names as comma separated string
+ if maps:
+ if maps.find(",") == -1:
+ maplist = (maps,)
+ else:
+ maplist = tuple(maps.split(","))
+
+ # 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()
+
+ if mapname.find("@") < 0:
+ mapid = mapname + "@" + mapset
+ else:
+ mapid = mapname
+
+ row = {}
+ row["id"] = mapid
+
+ if start_time_in_file and end_time_in_file:
+ row["start"] = line_list[1].strip()
+ row["end"] = line_list[2].strip()
+
+ if start_time_in_file and not end_time_in_file:
+ row["start"] = line_list[1].strip()
+
+ maplist.append(row)
+
num_maps = len(maplist)
count = 0
-
- for mapname in maplist:
+
+ for entry in maplist:
core.percent(count, num_maps, 1)
- mapname = mapname.strip()
- # Check if the map name contains the mapset as well
- if mapname.find("@") < 0:
- mapid = mapname + "@" + mapset
+ if file:
+ mapid = entry["id"]
else:
- mapid = mapname
-
- if type == "raster":
+ if entry.find("@") < 0:
+ mapid = entry + "@" + mapset
+ else:
+ mapid = entry
+
+ if type == "rast":
map = raster_dataset(mapid)
- if type == "raster3d":
+ if type == "rast3d":
map = raster3d_dataset(mapid)
- if type == "vector":
+ if type == "vect":
map = vector_dataset(mapid)
+ # Use the time data from file
+ if start_time_in_file:
+ start = entry["start"]
+ if end_time_in_file:
+ end = entry["end"]
+
if map.is_in_db(dbif) == False:
# Load the data from the grass file database
map.load()
@@ -291,6 +449,10 @@
for dataset in sprows:
splist[dataset["id"]] = True
+ # In case the time is in the input file we ignore the increment counter
+ if start_time_in_file:
+ count = 1
+
# Set the valid time
assign_valid_time_to_map(ttype=ttype, map=map, start=start, end=end, increment=increment, mult=count, dbif=dbif, interval=interval)
More information about the grass-commit
mailing list