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"
|