module BomRadarComposite
BomRadarComposite — merge BOM background and rain layers with rain-priority downsampling. Public: merge_cell, peak_rain_index, downsample Depends: bom_radar_config, bom_radar_image Tests: test/lib/bom_radar_composite_test.rb
Public Instance Methods
Source
# File lib/bom_radar_composite.rb, line 55 def dominant_background_index(background_counts) return 0 if background_counts[0].to_i.positive? background_counts.max_by { |index, count| [count, -index] }&.first || 2 end
Source
# File lib/bom_radar_composite.rb, line 26 def downsample(background:, rain:, width: BomRadarConfig::MAP_WIDTH, height: BomRadarConfig::MAP_HEIGHT) block_h = background[:height].to_f / height block_w = background[:width].to_f / width Array.new(height) do |row| Array.new(width) do |col| y0 = (row * block_h).floor y1 = [((row + 1) * block_h).ceil - 1, background[:height] - 1].min x0 = (col * block_w).floor x1 = [((col + 1) * block_w).ceil - 1, background[:width] - 1].min rain_indices = [] background_counts = Hash.new(0) (y0..y1).each do |y| (x0..x1).each do |x| rain_indices << rain[:grid][y][x] bg_index = background[:grid][y][x] background_counts[bg_index] += 1 if bg_index.between?(0, 2) end end peak = peak_rain_index(rain_indices) next peak if peak dominant_background_index(background_counts) end end end
Source
# File lib/bom_radar_composite.rb, line 14 def merge_cell(background_index:, rain_index:) rain = rain_index.to_i return rain if rain >= BomRadarConfig::RAIN_MIN_INDEX background_index.to_i end
Source
# File lib/bom_radar_composite.rb, line 21 def peak_rain_index(indices) rain = Array(indices).select { |index| index.to_i >= BomRadarConfig::RAIN_MIN_INDEX } rain.max end