123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- #!/usr/bin/env python
- ############################################################################
- #
- # MODULE: r.drain
- # AUTHOR(S): Markus Metz
- # PURPOSE: Wrapper for r.path. If no input directions are provided,
- # directions are determined with r.fill.dir
- # COPYRIGHT: (C) 2017 by metz, and 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: Traces a flow through an elevation model or cost surface on a raster map.
- #% keyword: raster
- #% keyword: hydrology
- #% keyword: cost surface
- #%end
- #%option
- #% key: input
- #% type: string
- #% required: yes
- #% multiple: no
- #% key_desc: name
- #% description: Name of input elevation or cost surface raster map
- #% gisprompt: old,cell,raster
- #%end
- #%option
- #% key: direction
- #% type: string
- #% required: no
- #% multiple: no
- #% key_desc: name
- #% label: Name of input movement direction map associated with the cost surface
- #% description: Direction in degrees CCW from east
- #% gisprompt: old,cell,raster
- #% guisection: Cost surface
- #%end
- #%option
- #% key: output
- #% type: string
- #% required: yes
- #% multiple: no
- #% key_desc: name
- #% description: Name for output raster map
- #% gisprompt: new,cell,raster
- #%end
- #%option
- #% key: drain
- #% type: string
- #% required: no
- #% multiple: no
- #% key_desc: name
- #% label: Name for output drain vector map
- #% description: Recommended for cost surface made using knight's move
- #% gisprompt: new,vector,vector
- #%end
- #%option
- #% key: start_coordinates
- #% type: double
- #% required: no
- #% multiple: yes
- #% key_desc: east,north
- #% description: Coordinates of starting point(s) (E,N)
- #% gisprompt: old,coords,coords
- #% guisection: Start
- #%end
- #%option
- #% key: start_points
- #% type: string
- #% required: no
- #% multiple: yes
- #% key_desc: name
- #% label: Name of starting vector points map(s)
- #% gisprompt: old,vector,vector
- #% guisection: Start
- #%end
- #%flag
- #% key: c
- #% description: Copy input cell values on output
- #% guisection: Path settings
- #%end
- #%flag
- #% key: a
- #% description: Accumulate input values along the path
- #% guisection: Path settings
- #%end
- #%flag
- #% key: n
- #% description: Count cell numbers along the path
- #% guisection: Path settings
- #%end
- #%flag
- #% key: d
- #% description: The input raster map is a cost surface (direction surface must also be specified)
- #% guisection: Cost surface
- #%end
- import os
- import sys
- import atexit
- import grass.script as grass
- def cleanup():
- """Delete temporary direction map."""
- if tmp_maps:
- try:
- grass.run_command("g.remove", flags='f', quiet=True, type='raster', name=tmp_maps)
- except:
- pass
- def main():
- valmap = options['input']
- dirmap = options['direction']
- rpathmap = options['output']
- vpathmap = options['drain']
- start_coords = options['start_coordinates']
- start_pnts = options['start_points']
- global tmp_maps
- tmp_maps = False
- atexit.register(cleanup)
- if not dirmap:
- # get directions with r.fill.dir, without sink filling
- dirmap = "%s_tmp_%d" % (valmap, os.getpid())
- fill_map = "%s_fill_%d" % (valmap, os.getpid())
- area_map = "%s_area_%d" % (valmap, os.getpid())
- tmp_maps = dirmap + ',' + fill_map + ',' + area_map
- grass.run_command("r.fill.dir", input=valmap, output=fill_map, direction=dirmap, areas=area_map, flags='f', format='grass')
- # create args for r.path
- kwargs = {}
- kwargs['input'] = dirmap
- kwargs['values'] = valmap
- kwargs['format'] = 'degree'
- if start_coords:
- kwargs['start_coordinates'] = start_coords
- if start_pnts:
- kwargs['start_points'] = start_pnts
- if rpathmap:
- kwargs['raster_path'] = rpathmap
- if vpathmap:
- kwargs['vector_path'] = vpathmap
- pathflags = ''
- if flags['c']:
- pathflags += 'c'
- if flags['a']:
- pathflags += 'a'
- if flags['n']:
- pathflags += 'n'
- grass.run_command("r.path", flags=pathflags, **kwargs)
- return 0
- if __name__ == "__main__":
- options, flags = grass.parser()
- sys.exit(main())
|