Class: AreaDataRaster

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/area_data_raster.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.rasterize(area_data_variable_id, sample_geog_level_id, reference_raster_variable_id) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'app/models/area_data_raster.rb', line 9

def self.rasterize(area_data_variable_id, sample_geog_level_id, reference_raster_variable_id)
  adv = sgl = rr = nil
  
  if area_data_variable_id.to_s.is_i?
    adv = AreaDataVariable.where({id: area_data_variable_id}).first
  else
    adv = AreaDataVariable.where({mnemonic: area_data_variable_id}).first
  end
  
  if sample_geog_level_id.to_s.is_i?
    sgl = SampleGeogLevel.where({id: sample_geog_level_id}).first
  else
    sgl = SampleGeogLevel.where({internal_code: sample_geog_level_id}).first
  end
  
  if reference_raster_variable_id.to_s.is_i?
    rr = RasterVariable.where({id: reference_raster_variable_id}).first
  else
    rr = RasterVariable.where({mnemonic: reference_raster_variable_id}).first
  end
  
  if adv.nil? or sgl.nil? or rr.nil?
    if adv.nil?
      $stderr.puts "AreaDataVariable is nil (from: #{area_data_variable_id})"
    end

    if sgl.nil?
      $stderr.puts "SampleGeogLevel is nil (from: #{sample_geog_level_id})"
    end

    if rr.nil?
      $stderr.puts "RasterVariable is nil (from: #{reference_raster_variable_id})"
    end
      
    return false
  end
  
  area_data_values_count = AreaDataValue.joins(:sample_level_area_data_variable).joins("INNER JOIN area_data_variables adv ON adv.id = sample_level_area_data_variables.area_data_variable_id").joins("INNER JOIN sample_geog_levels sgl ON sgl.id = sample_level_area_data_variables.sample_geog_level_id").where({"adv.id" => adv.id, "sgl.id" => sgl.id}).count
  
  if area_data_values_count > 0
  
    adrs = AreaDataRaster.where(["area_data_variable_id = ? AND sample_geog_level_id = ? AND raster_variable_id = ? AND is_valid = TRUE", adv.id, sgl.id, rr.id]).select("id, area_data_variable_id, label, mnemonic, sample_geog_level_id, raster_variable_id, is_valid, raster_size, updated_at, created_at")
  
    if adrs.to_a.count == 0
      index = 1
      raster_size = 1
      right_size = true
      band = 1
      
      sql = "SELECT terrapop_raster_cellcount(?, ?, ?) AS right_size"
    
      while right_size and index < 16
    
        sql0 = AreaDataRaster.send(:sanitize_sql_array, [sql, sgl.id, rr.id, raster_size])
        results = connection.execute(sql0).first
      
        right_size = results['right_size']
      
        if right_size
          raster_size = index
        end
      
        index += 1
      end
    
      if index >= 8 and right_size
        $stderr.puts "Unable to find a decent size for rasterizing area-level data (#{adv.mnemonic}), right_size: #{right_size}"
        return false
      end
      
      if adv.measurement_type.label == "Percentage" or adv.measurement_type.label == "Mean"
        function = "terrapop_areal_rasterization_number"
      else
        function = "terrapop_areal_rasterization"
      end
    
      sql = "        INSERT INTO area_data_rasters (sample_geog_level_id, raster_variable_id, area_data_variable_id, is_valid, raster_size, label, mnemonic, rast )\n          SELECT results.sample_geog_level_id, results.raster_variable_id, results.area_data_variable_id, results.is_valid, results.raster_size, results.label, results.mnemonic, results.rast FROM\n            (SELECT ? AS sample_geog_level_id, ? AS raster_variable_id, ? AS area_data_variable_id, TRUE AS is_valid, ? AS raster_size, ? AS label, ? AS mnemonic, (\#{function}( ?, ?, ?, ?, ? )).raster AS rast) results\n        SQL_O_MATIC\n\n      \n      sql = AreaDataRaster.send(:sanitize_sql_array, [sql, sgl.id, rr.id, adv.id, raster_size, \"\#{sgl.label} - \#{adv.mnemonic}\", \"\#{adv.mnemonic}\", sgl.id, rr.id, adv.id, raster_size, band])\n    \n      $stderr.puts \"AREADATA->RASTER [\#{sql}]\"\n    \n      #begin\n      connection.execute(sql)\n      #rescue Exception => e\n      #  $stderr.puts e.backtrace\n      #  return false\n      #end\n    \n      adrs = AreaDataRaster.where([\"area_data_variable_id = ? AND sample_geog_level_id = ? AND raster_variable_id = ? AND is_valid = TRUE\", adv.id, sgl.id, rr.id]).select(\"id, area_data_variable_id, label, mnemonic, sample_geog_level_id, raster_variable_id, is_valid, raster_size, updated_at, created_at\")\n    end\n\n    adrs.to_a\n  else\n    $stderr.puts \"==[ERR]==> No AreaDataValues for AreaDataVariable[\#{adv.mnemonic}] at \#{sgl.label}\"\n    []\n  end\nend\n"

Instance Method Details

#raster_as_tiff ⇒ Object



117
118
119
120
121
122
123
124
# File 'app/models/area_data_raster.rb', line 117

def raster_as_tiff
  
  sql = "SELECT ST_AsTiff(adr.rast,'LZW', ST_SRID(adr.rast)) AS geotiff, label, mnemonic, id, raster_size, sample_geog_level_id, raster_variable_id, area_data_variable_id FROM area_data_rasters AS adr WHERE id = ?"
  sql = AreaDataRaster.send(:sanitize_sql_array, [sql, self.id])
  
  AreaDataRaster.connection.execute(sql).first

end

#tiff_filename ⇒ Object



113
114
115
# File 'app/models/area_data_raster.rb', line 113

def tiff_filename
  self.label.gsub(/ +/, '').gsub(/:/, '-').gsub(/,/, '-')
end