123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #!/usr/bin/env python
- #
- ############################################################################
- #
- # MODULE: r.plane for GRASS 5.7; based on r.plane for GRASS 5
- # AUTHOR(S): CERL?; updated to GRASS 5.7 by Michael Barton
- # Dec 2004: Alessandro Frigeri & Ivan Marchesini
- # Modified to produce floating and double values maps
- # Converted to Python by Glynn Clements
- # PURPOSE: Creates a raster plane map from user specified inclination and azimuth
- # COPYRIGHT: (C) 2004,2008 by the GRASS Development Team
- #
- # This program is free software under the GNU General Public
- # License (>=v2). Read the file COPYING that comes with GRASS
- # for details.
- #
- #############################################################################
- #%Module
- #% description: Creates raster plane map given dip (inclination), aspect (azimuth) and one point.
- #% keywords: raster, elevation
- #%End
- #%option
- #% key: name
- #% type: string
- #% gisprompt: new,cell,raster
- #% description: Name of raster plane to be created
- #% required : yes
- #%end
- #%option
- #% key: dip
- #% type: double
- #% gisprompt: -90-90
- #% answer: 0.0
- #% description: Dip of plane. Value must be between -90 and 90 degrees
- #% required : yes
- #%end
- #%option
- #% key: azimuth
- #% type: double
- #% gisprompt: 0-360
- #% answer: 0.0
- #% description: Azimuth of the plane. Value must be between 0 and 360 degrees
- #% required : yes
- #%end
- #%option
- #% key: easting
- #% type: double
- #% description: Easting coordinate of a point on the plane
- #% required : yes
- #%end
- #%option
- #% key: northing
- #% type: double
- #% description: Northing coordinate of a point on the plane
- #% required : yes
- #%end
- #%option
- #% key: elevation
- #% type: double
- #% description: Elevation coordinate of a point on the plane
- #% required : yes
- #%end
- #%option
- #% key: type
- #% type: string
- #% options: int,float,double
- #% description: Type of the raster map to be created
- #% required : yes
- #%end
- import sys
- import os
- import math
- import string
- import grass.script as grass
- def main():
- name = options['name']
- type = options['type']
- dip = float(options['dip'])
- az = float(options['azimuth'])
- ea = float(options['easting'])
- no = float(options['northing'])
- el = float(options['elevation'])
- reg = grass.region()
- ### test input values ###
- if abs(dip) >= 90:
- grass.fatal("dip must be between -90 and 90.")
- if az < 0 or az >= 360:
- grass.fatal("azimuth must be between 0 and 360")
- ### now the actual algorithm
- az_r = math.radians(-az)
- sinaz = math.sin(az_r)
- cosaz = math.cos(az_r)
- dip_r = math.radians(-dip)
- tandip = math.tan(dip_r)
- kx = sinaz * tandip
- ky = cosaz * tandip
- kz = el - ea * sinaz * tandip - no * cosaz * tandip
- if type == "int":
- round = "round"
- else:
- round = ""
- grass.mapcalc("$name = $type($round(x() * $kx + y() * $ky + $kz))",
- name = name, type = type, round = round, kx = kx, ky = ky, kz = kz)
- grass.raster_history(name)
- grass.message("Done.")
- t = string.Template("Raster map <$name> generated by r.plane " +
- "at point $ea E, $no N, elevation $el with dip = $dip degrees and " +
- "aspect = $az degrees ccw from north.")
- grass.message(t.substitute(name = name, ea = ea, no = no, el = el, dip = dip, az = az))
- if __name__ == "__main__":
- options, flags = grass.parser()
- main()
|