123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- ############################################################################
- #
- # MODULE: t.rast.series
- # AUTHOR(S): Soeren Gebbert
- #
- # PURPOSE: Perform different aggregation algorithms from r.series on all or a
- # selected subset of raster maps in a space time raster dataset
- # COPYRIGHT: (C) 2011-2017 by the GRASS Development Team
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- #############################################################################
- #%module
- #% description: Performs different aggregation algorithms from r.series on all or a subset of raster maps in a space time raster dataset.
- #% keyword: temporal
- #% keyword: aggregation
- #% keyword: series
- #% keyword: raster
- #% keyword: time
- #%end
- #%option G_OPT_STRDS_INPUT
- #%end
- #%option
- #% key: method
- #% type: string
- #% description: Aggregate operation to be performed on the raster maps
- #% required: yes
- #% multiple: no
- #% options: average,count,median,mode,minimum,min_raster,maximum,max_raster,stddev,range,sum,variance,diversity,slope,offset,detcoeff,quart1,quart3,perc90,quantile,skewness,kurtosis
- #% answer: average
- #%end
- #%option
- #% key: quantile
- #% type: double
- #% description: Quantile to calculate for method=quantile
- #% required: no
- #% multiple: no
- #% options: 0.0-1.0
- #%end
- #%option
- #% key: order
- #% type: string
- #% description: Sort the maps by category
- #% required: no
- #% multiple: yes
- #% options: id, name, creator, mapset, creation_time, modification_time, start_time, end_time, north, south, west, east, min, max
- #% answer: start_time
- #%end
- #%option G_OPT_T_WHERE
- #%end
- #%option G_OPT_R_OUTPUT
- #%end
- #%flag
- #% key: t
- #% description: Do not assign the space time raster dataset start and end time to the output map
- #%end
- #%flag
- #% key: n
- #% description: Propagate NULLs
- #%end
- import grass.script as grass
- from grass.exceptions import CalledModuleError
- ############################################################################
- def main():
- # lazy imports
- import grass.temporal as tgis
- # Get the options
- input = options["input"]
- output = options["output"]
- method = options["method"]
- quantile = options["quantile"]
- order = options["order"]
- where = options["where"]
- add_time = flags["t"]
- nulls = flags["n"]
- # Make sure the temporal database exists
- tgis.init()
- sp = tgis.open_old_stds(input, "strds")
- rows = sp.get_registered_maps("id", where, order, None)
- if rows:
- # Create the r.series input file
- filename = grass.tempfile(True)
- file = open(filename, 'w')
- for row in rows:
- string = "%s\n" % (row["id"])
- file.write(string)
- file.close()
- flag = ""
- if len(rows) > 1000:
- grass.warning(_("Processing over 1000 maps: activating -z flag of r.series which slows down processing"))
- flag += "z"
- if nulls:
- flag += "n"
- try:
- grass.run_command("r.series", flags=flag, file=filename,
- output=output, overwrite=grass.overwrite(),
- method=method, quantile=quantile)
- except CalledModuleError:
- grass.fatal(_("%s failed. Check above error messages.") % 'r.series')
- if not add_time:
- # Create the time range for the output map
- if output.find("@") >= 0:
- id = output
- else:
- mapset = grass.encode(grass.gisenv()["MAPSET"])
- id = output + "@" + mapset
- map = sp.get_new_map_instance(id)
- map.load()
- # We need to set the temporal extent from the subset of selected maps
- maps = sp.get_registered_maps_as_objects(where=where, order=order, dbif=None)
- first_map = maps[0]
- last_map = maps[-1]
- start_a, end_a = first_map.get_temporal_extent_as_tuple()
- start_b, end_b = last_map.get_temporal_extent_as_tuple()
- if end_b is None:
- end_b = start_b
- if first_map.is_time_absolute():
- extent = tgis.AbsoluteTemporalExtent(start_time=start_a, end_time=end_b)
- else:
- extent = tgis.RelativeTemporalExtent(start_time=start_a, end_time=end_b,
- unit=first_map.get_relative_time_unit())
- map.set_temporal_extent(extent=extent)
- # Register the map in the temporal database
- if map.is_in_db():
- map.update_all()
- else:
- map.insert()
- if __name__ == "__main__":
- options, flags = grass.parser()
- main()
|