module GrassGis::Tools
Convenient shortcuts and tools for use in GRASS sessions Currently only implemented for GRASS 7
Public Instance Methods
accessible_mapsets()
click to toggle source
# File lib/grassgis/tools.rb, line 76 def accessible_mapsets g.mapsets '-p' output.lines.to_a.last.split end
available_mapsets()
click to toggle source
# File lib/grassgis/tools.rb, line 71 def available_mapsets g.mapsets '-l' output.lines.to_a.last.split end
copy_map(map, options = {})
click to toggle source
# File lib/grassgis/tools.rb, line 120 def copy_map(map, options = {}) type = options[:type] raise "Must specify type to copy a map" unless type if map.include?('@') map, mapset = map.split('@').last end from_mapset = options[:from] if from_mapset && from_mapset != mapset raise "Inconsistent origin mapset" end from_mapset ||= mapset unless from_mapset from_mapset = map_mapset(map, type: options[:type]) end to_mapset = options[:to] unless from_mapset && to_mapset raise "Must specify origin and destination mapsets" end if from_mapset != to_mapset original_map = "#{map}@#{from_mapset}" with_mapset to_mapset do if grass_version >= GrassGis.version('7.0.0') g.copy type => [original_map, map] else param = { vector: 'vect', raster: 'rast', raster_3d: 'rast3d' }[type.to_sym] g.copy param => [original_map, map] end end original_map end end
create_mapset(mapset)
click to toggle source
# File lib/grassgis/tools.rb, line 152 def create_mapset(mapset) if true # TODO: if mapset optional argument added to Mapset constructor: # ms = GrassGis::Mapset.new(self, mapset) keep_mapset = configuration[:mapset] configuration[:mapset] = mapset ms = GrassGis::Mapset.new(self) ms.create! unless ms.exists? configuration[:mapset] = keep_mapset else # This will fail under windows current = current_mapset g.mapset '-c', mapset: mapset, location: configuration[:location], dbase: configuration[:gisdbase] g.mapset current end end
current_mapset()
click to toggle source
# File lib/grassgis/tools.rb, line 55 def current_mapset g.mapsets '-p' current_mapset = output.lines.to_a.last.split.first end
explicit_map_mapset(map)
click to toggle source
# File lib/grassgis/tools.rb, line 81 def explicit_map_mapset(map) if map.include?('@') map.split('@').last end end
map_exists?(map, options = {})
click to toggle source
# File lib/grassgis/tools.rb, line 5 def map_exists?(map, options = {}) types = Array(options[:type]) types = 'all' if types.empty? mapsets = [] if map.include?('@') map, mapset = map.split('@') mapsets << mapset end mapsets += Array(options[:mapset]) if mapsets.empty? g.list types.join(',') else g.list types.join(','), mapset: mapsets.join(',') end maps = output.split.map { |m| m.split('@').first } maps.include?(map) end
map_mapset(map, options = {})
click to toggle source
# File lib/grassgis/tools.rb, line 87 def map_mapset(map, options = {}) if map.include?('@') map.split('@').last else type = options[:type] raise "Must specify type of the map" unless type accessible = accessible_mapsets accessible.each do |mapset| return mapset if map_exists?(map, type: type, mapset: mapset) end available = available_mapsets - accessible available.each do |mapset| return mapset if map_exists?(map, type: type, mapset: mapset) end nil end end
move_map(map, options = {})
click to toggle source
# File lib/grassgis/tools.rb, line 172 def move_map(map, options = {}) original_map = copy_map(map, options) remove_map original_map, type: options[:type] end
raster_exists?(map, options = {})
click to toggle source
# File lib/grassgis/tools.rb, line 23 def raster_exists?(map, options = {}) map_exists? map, options.merge(type: 'rast') end
raster_info(map)
click to toggle source
# File lib/grassgis/tools.rb, line 35 def raster_info(map) r.info '-g', map shell_to_hash end
raster_res(map)
click to toggle source
# File lib/grassgis/tools.rb, line 45 def raster_res(map) info = raster_info(map) info.values_at('ewres', 'nsres').map(&:to_i) end
region_info()
click to toggle source
# File lib/grassgis/tools.rb, line 40 def region_info g.region '-m' shell_to_hash end
region_res()
click to toggle source
# File lib/grassgis/tools.rb, line 50 def region_res info = region_info info.values_at('ewres', 'nsres').map(&:to_i) end
remove_map(map, options = {})
click to toggle source
# File lib/grassgis/tools.rb, line 105 def remove_map(map, options = {}) type = options[:type] raise "Must specify type to remove a map" unless type mapset = explicit_map_mapset(map) || options[:mapset] || map_mapset(map, type: type) raise "Map not found #{map} (#{type})" unless mapset with_mapset(mapset) do if grass_version >= GrassGis.version('7.0.0') g.remove '-f', type: type, name: map else param = { vector: 'vect', raster: 'rast', raster_3d: 'rast3d' }[type.to_sym] g.remove '-f', param => map end end end
resamp_average(options = {})
click to toggle source
# File lib/grassgis/tools.rb, line 177 def resamp_average(options = {}) input_raster = options[:input] raise "Raster #{input_raster} not found" unless raster_exists?(input_raster) input_res = raster_res(input_raster) if options[:output_res] output_res = options[:output_res] unless output_res.is_a?(Array) output_res = [output_res, output_res] end else output_res = region_res end output_raster = options[:output] if options[:direction] unless raster_exists?("#{input_raster}_sin") g.region ewres: input_res[0], nsres: input_res[1] r.mapcalc "#{input_raster}_sin = sin(#{input_raster})" end unless raster_exists?("#{input_raster}_cos") g.region ewres: input_res[0], nsres: input_res[1] r.mapcalc "#{input_raster}_cos = cos(#{input_raster})" end g.region ewres: output_res[0], nsres: output_res[1] r.resamp.stats '--overwrite', input: "#{input_raster}_cos", output: "#{output_raster}_cos" r.resamp.stats '--overwrite', input: "#{input_raster}_sin", output: "#{output_raster}_sin" r.mapcalc "#{output_raster} = atan(#{output_raster}_cos,#{output_raster}_sin)" r.colors map: output_raster, raster: input_raster g.remove '-f', type: 'raster', name: ["#{output_raster}_cos", "#{output_raster}_sin"] else g.region ewres: output_res[0], nsres: output_res[1] r.resamp.stats input: input_raster, output: output_raster r.colors map: output_raster, raster: input_raster end end
shell_to_hash()
click to toggle source
# File lib/grassgis/tools.rb, line 31 def shell_to_hash Hash[output.lines.map{|l| l.strip.split('=')}] end
vector_exists?(map, options = {})
click to toggle source
# File lib/grassgis/tools.rb, line 27 def vector_exists?(map, options = {}) map_exists? map, options.merge(type: 'vect') end
with_mapset(mapset) { |self| ... }
click to toggle source
# File lib/grassgis/tools.rb, line 60 def with_mapset(mapset) current = current_mapset if mapset != current change_mapset mapset end yield self if mapset != current change_mapset current end end