123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- #!/usr/bin/env python3
- ############################################################################
- #
- # 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
- # %rules
- # % required: start_coordinates, start_points
- # %end
- import os
- import sys
- import atexit
- import grass.script as grass
- def cleanup():
- """Delete temporary direction map."""
- if tmp_maps:
- grass.run_command(
- "g.remove",
- flags="f",
- quiet=True,
- type="raster",
- name=tmp_maps,
- errors="ignore",
- )
- 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
- if flags["c"] or flags["a"]:
- 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())
|