earth 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. data/CHANGELOG +6 -0
  2. data/Rakefile +0 -3
  3. data/TODO +1 -1
  4. data/ar17.html +2093 -0
  5. data/data/air/aircraft.csv +7 -0
  6. data/data/air/airports.csv +1 -0
  7. data/earth.gemspec +4 -3
  8. data/errata/airline/bts_carrier_codes_errata.csv +74 -10
  9. data/errata/airport/openflights_errata.csv +7 -0
  10. data/errata/flight_segment/bts_errata.csv +1 -0
  11. data/lib/earth/air/aircraft.rb +1 -1
  12. data/lib/earth/air/aircraft/data_miner.rb +1 -1
  13. data/lib/earth/air/airline.rb +1 -1
  14. data/lib/earth/air/airline/data_miner.rb +6 -10
  15. data/lib/earth/air/airport.rb +6 -6
  16. data/lib/earth/air/bts_aircraft.rb +1 -1
  17. data/lib/earth/air/flight_segment.rb +1 -1
  18. data/lib/earth/automobile/automobile_activity_year_type.rb +1 -1
  19. data/lib/earth/automobile/automobile_activity_year_type_fuel/data_miner.rb +3 -3
  20. data/lib/earth/automobile/automobile_make_model_year_variant.rb +2 -2
  21. data/lib/earth/automobile/automobile_make_model_year_variant/data_miner.rb +1 -1
  22. data/lib/earth/automobile/automobile_type_fuel_year.rb +1 -1
  23. data/lib/earth/automobile/automobile_type_fuel_year/data_miner.rb +2 -2
  24. data/lib/earth/automobile/automobile_type_fuel_year_control.rb +1 -1
  25. data/lib/earth/insolation_scopes.rb +10 -0
  26. data/lib/earth/loader.rb +0 -7
  27. data/lib/earth/locality/climate_division.rb +3 -3
  28. data/lib/earth/locality/climate_division_month.rb +28 -0
  29. data/lib/earth/locality/climate_division_month/data_miner.rb +140 -0
  30. data/lib/earth/locality/direct_normal_insolation.rb +37 -0
  31. data/lib/earth/locality/direct_normal_insolation/data_miner.rb +41 -0
  32. data/lib/earth/locality/egrid_subregion.rb +4 -1
  33. data/lib/earth/locality/electricity_mix.rb +9 -1
  34. data/lib/earth/locality/global_horizontal_insolation.rb +37 -0
  35. data/lib/earth/locality/global_horizontal_insolation/data_miner.rb +41 -0
  36. data/lib/earth/locality/photovoltaic_insolation.rb +37 -0
  37. data/lib/earth/locality/photovoltaic_insolation/data_miner.rb +41 -0
  38. data/lib/earth/locality/zip_code.rb +9 -15
  39. data/lib/earth/residence/residence_fuel_price.rb +1 -1
  40. data/lib/earth/tasks.rb +5 -0
  41. data/lib/earth/version.rb +1 -1
  42. data/spec/data_mining_spec.rb +1 -1
  43. data/spec/earth/air/aircraft_spec.rb +2 -2
  44. data/spec/earth/air/airline_spec.rb +1 -1
  45. data/spec/earth/air/airport_spec.rb +1 -1
  46. data/spec/earth/air/bts_aircraft_spec.rb +1 -1
  47. data/spec/earth/air/flight_segment_spec.rb +19 -21
  48. data/spec/earth/automobile/automobile_make_model_year_variant_spec.rb +1 -1
  49. data/spec/earth/locality/climate_division_month_spec.rb +23 -0
  50. data/spec/earth/locality/direct_normal_insolation_spec.rb +8 -0
  51. data/spec/earth/locality/global_horizontal_insolation_spec.rb +8 -0
  52. data/spec/earth/locality/photovoltaic_insolation_spec.rb +8 -0
  53. data/spec/earth/locality/zip_code_spec.rb +1 -10
  54. data/spec/earth_spec.rb +1 -1
  55. data/spec/spec_helper.rb +1 -1
  56. metadata +261 -410
  57. data/data/air/airlines.csv +0 -45
  58. data/vendor/geokit-rails/.gitignore +0 -2
  59. data/vendor/geokit-rails/CHANGELOG.rdoc +0 -49
  60. data/vendor/geokit-rails/MIT-LICENSE +0 -20
  61. data/vendor/geokit-rails/README.markdown +0 -569
  62. data/vendor/geokit-rails/Rakefile +0 -18
  63. data/vendor/geokit-rails/about.yml +0 -11
  64. data/vendor/geokit-rails/assets/api_keys_template +0 -61
  65. data/vendor/geokit-rails/init.rb +0 -2
  66. data/vendor/geokit-rails/install.rb +0 -14
  67. data/vendor/geokit-rails/lib/geokit-rails.rb +0 -28
  68. data/vendor/geokit-rails/lib/geokit-rails/acts_as_mappable.rb +0 -469
  69. data/vendor/geokit-rails/lib/geokit-rails/adapters/abstract.rb +0 -31
  70. data/vendor/geokit-rails/lib/geokit-rails/adapters/mysql.rb +0 -22
  71. data/vendor/geokit-rails/lib/geokit-rails/adapters/mysql2.rb +0 -22
  72. data/vendor/geokit-rails/lib/geokit-rails/adapters/postgresql.rb +0 -22
  73. data/vendor/geokit-rails/lib/geokit-rails/adapters/sqlserver.rb +0 -43
  74. data/vendor/geokit-rails/lib/geokit-rails/defaults.rb +0 -22
  75. data/vendor/geokit-rails/lib/geokit-rails/geocoder_control.rb +0 -16
  76. data/vendor/geokit-rails/lib/geokit-rails/ip_geocode_lookup.rb +0 -46
  77. data/vendor/geokit-rails/test/acts_as_mappable_test.rb +0 -474
  78. data/vendor/geokit-rails/test/boot.rb +0 -25
  79. data/vendor/geokit-rails/test/database.yml +0 -25
  80. data/vendor/geokit-rails/test/fixtures/companies.yml +0 -7
  81. data/vendor/geokit-rails/test/fixtures/custom_locations.yml +0 -54
  82. data/vendor/geokit-rails/test/fixtures/locations.yml +0 -54
  83. data/vendor/geokit-rails/test/fixtures/mock_addresses.yml +0 -17
  84. data/vendor/geokit-rails/test/fixtures/mock_families.yml +0 -2
  85. data/vendor/geokit-rails/test/fixtures/mock_houses.yml +0 -9
  86. data/vendor/geokit-rails/test/fixtures/mock_organizations.yml +0 -5
  87. data/vendor/geokit-rails/test/fixtures/mock_people.yml +0 -5
  88. data/vendor/geokit-rails/test/fixtures/stores.yml +0 -0
  89. data/vendor/geokit-rails/test/ip_geocode_lookup_test.rb +0 -77
  90. data/vendor/geokit-rails/test/models/company.rb +0 -3
  91. data/vendor/geokit-rails/test/models/custom_location.rb +0 -12
  92. data/vendor/geokit-rails/test/models/location.rb +0 -4
  93. data/vendor/geokit-rails/test/models/mock_address.rb +0 -4
  94. data/vendor/geokit-rails/test/models/mock_family.rb +0 -3
  95. data/vendor/geokit-rails/test/models/mock_house.rb +0 -3
  96. data/vendor/geokit-rails/test/models/mock_organization.rb +0 -4
  97. data/vendor/geokit-rails/test/models/mock_person.rb +0 -4
  98. data/vendor/geokit-rails/test/models/store.rb +0 -3
  99. data/vendor/geokit-rails/test/schema.rb +0 -60
  100. data/vendor/geokit-rails/test/tasks.rake +0 -31
  101. data/vendor/geokit-rails/test/test_helper.rb +0 -23
@@ -0,0 +1,28 @@
1
+ require 'earth/model'
2
+
3
+ require 'earth/locality/climate_division'
4
+
5
+ class ClimateDivisionMonth < ActiveRecord::Base
6
+ extend Earth::Model
7
+
8
+ TABLE_STRUCTURE = <<-EOS
9
+ CREATE TABLE climate_division_months
10
+ (
11
+ name CHARACTER VARYING(255) NOT NULL PRIMARY KEY,
12
+ climate_division_name CHARACTER VARYING(255),
13
+ year INTEGER,
14
+ month INTEGER,
15
+ heating_degree_days FLOAT,
16
+ heating_degree_days_units CHARACTER VARYING(255),
17
+ cooling_degree_days FLOAT,
18
+ cooling_degree_days_units CHARACTER VARYING(255)
19
+ );
20
+ EOS
21
+
22
+ self.primary_key = "name"
23
+
24
+ belongs_to :climate_division, :foreign_key => 'climate_division_name'
25
+
26
+ warn_unless_size (344 * (((Date.today.year - 2011) * 12) + (Date.today - 7).prev_month.month))
27
+ warn_if_any_nulls
28
+ end
@@ -0,0 +1,140 @@
1
+ ClimateDivisionMonth.class_eval do
2
+ # Derived from state code table in ftp://ftp.ncdc.noaa.gov/pub/data/cirs/divisional.README
3
+ STATE_CODES = {
4
+ 1 => 'AL',
5
+ 2 => 'AZ',
6
+ 3 => 'AR',
7
+ 4 => 'CA',
8
+ 5 => 'CO',
9
+ 6 => 'CT',
10
+ 7 => 'DE',
11
+ 8 => 'FL',
12
+ 9 => 'GA',
13
+ 10 => 'ID',
14
+ 11 => 'IL',
15
+ 12 => 'IN',
16
+ 13 => 'IA',
17
+ 14 => 'KS',
18
+ 15 => 'KY',
19
+ 16 => 'LA',
20
+ 17 => 'ME',
21
+ 18 => 'MD',
22
+ 19 => 'MA',
23
+ 20 => 'MI',
24
+ 21 => 'MN',
25
+ 22 => 'MS',
26
+ 23 => 'MO',
27
+ 24 => 'MT',
28
+ 25 => 'NE',
29
+ 26 => 'NV',
30
+ 27 => 'NH',
31
+ 28 => 'NJ',
32
+ 29 => 'NM',
33
+ 30 => 'NY',
34
+ 31 => 'NC',
35
+ 32 => 'ND',
36
+ 33 => 'OH',
37
+ 34 => 'OK',
38
+ 35 => 'OR',
39
+ 36 => 'PA',
40
+ 37 => 'RI',
41
+ 38 => 'SC',
42
+ 39 => 'SD',
43
+ 40 => 'TN',
44
+ 41 => 'TX',
45
+ 42 => 'UT',
46
+ 43 => 'VT',
47
+ 44 => 'VA',
48
+ 45 => 'WA',
49
+ 46 => 'WV',
50
+ 47 => 'WI',
51
+ 48 => 'WY'
52
+ }
53
+
54
+ MONTH_CODES = {
55
+ 'jan' => 1,
56
+ 'feb' => 2,
57
+ 'mar' => 3,
58
+ 'apr' => 4,
59
+ 'may' => 5,
60
+ 'jun' => 6,
61
+ 'jul' => 7,
62
+ 'aug' => 8,
63
+ 'sep' => 9,
64
+ 'oct' => 10,
65
+ 'nov' => 11,
66
+ 'dec' => 12
67
+ }
68
+
69
+ ::FixedWidth.define :noaa_degree_day_data do |d|
70
+ d.rows do |row|
71
+ row.trap { true } # there's only one section
72
+ row.column 'state_code', 2, :type => :integer
73
+ row.column 'division_number', 2, :type => :integer
74
+ row.column 'element_code', 2, :type => :integer
75
+ row.column 'year', 4, :type => :integer
76
+ row.column 'jan', 7, :type => :float # value for jan
77
+ row.column 'feb', 7, :type => :float # value for feb
78
+ row.column 'mar', 7, :type => :float # value for mar
79
+ row.column 'apr', 7, :type => :float # value for apr
80
+ row.column 'may', 7, :type => :float # value for may
81
+ row.column 'jun', 7, :type => :float # value for jun
82
+ row.column 'jul', 7, :type => :float # value for jul
83
+ row.column 'aug', 7, :type => :float # value for aug
84
+ row.column 'sep', 7, :type => :float # value for sep
85
+ row.column 'oct', 7, :type => :float # value for oct
86
+ row.column 'nov', 7, :type => :float # value for nov
87
+ row.column 'dec', 7, :type => :float # value for dec
88
+ end
89
+ end
90
+
91
+ class NoaaDegreeDayParser
92
+ def initialize(options = {})
93
+ # nothing
94
+ end
95
+
96
+ def apply(row)
97
+ virtual_rows = []
98
+ if row['year'].to_i > 2010
99
+ %w{ jan feb mar apr may jun jul aug sep oct nov dec }.each do |month|
100
+ if row[month].to_i >= 0
101
+ new_row = ActiveSupport::OrderedHash.new
102
+ new_row['climate_division_name'] = STATE_CODES[row['state_code'].to_i] + row['division_number'].to_i.to_s
103
+ new_row['year'] = row['year']
104
+ new_row['month'] = MONTH_CODES[month]
105
+ new_row['name'] = new_row['climate_division_name'] + '-' + new_row['year'] + '-' + new_row['month'].to_s
106
+ new_row['degree_days'] = row[month]
107
+ virtual_rows << new_row
108
+ end
109
+ end
110
+ end
111
+ virtual_rows
112
+ end
113
+ end
114
+
115
+ data_miner do
116
+ import "recent NOAA NCDC climate division heating degree day data",
117
+ :url => 'ftp://ftp.ncdc.noaa.gov/pub/data/cirs/drd964x.hdd.txt',
118
+ :format => :fixed_width,
119
+ :schema_name => :noaa_degree_day_data,
120
+ :transform => { :class => NoaaDegreeDayParser } do
121
+ key 'name'
122
+ store 'climate_division_name'
123
+ store 'year'
124
+ store 'month'
125
+ store 'heating_degree_days', :field_name => 'degree_days', :from_units => :degrees_fahrenheit, :to_units => :degrees_celsius
126
+ end
127
+
128
+ import "recent NOAA NCDC climate division cooling degree day data",
129
+ :url => 'ftp://ftp.ncdc.noaa.gov/pub/data/cirs/drd964x.cdd.txt',
130
+ :format => :fixed_width,
131
+ :schema_name => :noaa_degree_day_data,
132
+ :transform => { :class => NoaaDegreeDayParser } do
133
+ key 'name'
134
+ store 'climate_division_name'
135
+ store 'year'
136
+ store 'month'
137
+ store 'cooling_degree_days', :field_name => 'degree_days', :from_units => :degrees_fahrenheit, :to_units => :degrees_celsius
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,37 @@
1
+ require 'earth/model'
2
+ require 'earth/insolation_scopes'
3
+
4
+ class DirectNormalInsolation < ActiveRecord::Base
5
+ extend Earth::Model
6
+ include Earth::InsolationScopes
7
+
8
+ TABLE_STRUCTURE = <<-EOS
9
+ CREATE TABLE direct_normal_insolations
10
+ (
11
+ row_hash CHARACTER VARYING(255) NOT NULL PRIMARY KEY,
12
+ nw_lat FLOAT,
13
+ nw_lon FLOAT,
14
+ se_lat FLOAT,
15
+ se_lon FLOAT,
16
+ jan_average FLOAT,
17
+ feb_average FLOAT,
18
+ mar_average FLOAT,
19
+ apr_average FLOAT,
20
+ may_average FLOAT,
21
+ jun_average FLOAT,
22
+ jul_average FLOAT,
23
+ aug_average FLOAT,
24
+ sep_average FLOAT,
25
+ oct_average FLOAT,
26
+ nov_average FLOAT,
27
+ dec_average FLOAT,
28
+ annual_average FLOAT,
29
+ units CHARACTER VARYING(255)
30
+ );
31
+ EOS
32
+
33
+ self.primary_key = 'row_hash'
34
+
35
+ warn_unless_size 90508
36
+ warn_if_any_nulls
37
+ end
@@ -0,0 +1,41 @@
1
+ begin
2
+ require 'geo_ruby'
3
+ rescue LoadError
4
+ puts '[Earth] You need to install the geo_ruby gem to mine Insolation from scratch'
5
+ exit
6
+ end
7
+ begin
8
+ require 'dbf'
9
+ rescue LoadError
10
+ puts '[Earth] You need to install the dbf gem to mine Insolation from scratch'
11
+ exit
12
+ end
13
+ require 'unix_utils'
14
+
15
+ DirectNormalInsolation.class_eval do
16
+ data_miner do
17
+ import 'Direct Normal Insolation shapefile from NREL at http://www.nrel.gov/gis/data_solar.html',
18
+ :url => 'http://www.nrel.gov/gis/cfm/data/GIS_Data_Technology_Specific/United_States/Solar/High_Resolution/Lower_48_DNI_High_Resolution.zip',
19
+ :format => :shp do
20
+ key :row_hash
21
+ store 'nw_lat', :field_name => 'upper_corner_y'
22
+ store 'nw_lon', :field_name => 'upper_corner_x'
23
+ store 'se_lat', :field_name => 'lower_corner_y'
24
+ store 'se_lon', :field_name => 'lower_corner_x'
25
+ store 'jan_average', :field_name => 'DNI01'
26
+ store 'feb_average', :field_name => 'DNI02'
27
+ store 'mar_average', :field_name => 'DNI03'
28
+ store 'apr_average', :field_name => 'DNI04'
29
+ store 'may_average', :field_name => 'DNI05'
30
+ store 'jun_average', :field_name => 'DNI06'
31
+ store 'jul_average', :field_name => 'DNI07'
32
+ store 'aug_average', :field_name => 'DNI08'
33
+ store 'sep_average', :field_name => 'DNI09'
34
+ store 'oct_average', :field_name => 'DNI10'
35
+ store 'nov_average', :field_name => 'DNI11'
36
+ store 'dec_average', :field_name => 'DNI12'
37
+ store 'annual_average', :field_name => 'DNIANN'
38
+ store 'units', :static => 'kilowatt_hours_per_square_metre_per_day'
39
+ end
40
+ end
41
+ end
@@ -50,5 +50,8 @@ EOS
50
50
  :electricity_emission_factor_units => 'kilograms_co2e_per_kilowatt_hour'
51
51
 
52
52
  warn_unless_size 26
53
- warn_if_any_nulls
53
+ warn_if_nulls_except(
54
+ :co2_biogenic_emission_factor,
55
+ :co2_biogenic_emission_factor_units
56
+ )
54
57
  end
@@ -45,5 +45,13 @@ EOS
45
45
  :loss_factor => 0.096 # from ecometrica paper FIXME TODO calculate this
46
46
 
47
47
  warn_unless_size 213
48
- warn_if_any_nulls
48
+ warn_if_nulls_except(
49
+ :egrid_subregion_abbreviation,
50
+ :state_postal_abbreviation,
51
+ :country_iso_3166_code,
52
+ :co2_biogenic_emission_factor,
53
+ :co2_biogenic_emission_factor_units
54
+ )
55
+ warn_if_nulls /abbreviation/, :conditions => 'country_iso_3166_code IS NULL'
56
+ warn_if_nulls :country_iso_3166_code, :conditions => 'egrid_subregion_abbreviation IS NULL AND state_postal_abbreviation IS NULL'
49
57
  end
@@ -0,0 +1,37 @@
1
+ require 'earth/model'
2
+ require 'earth/insolation_scopes'
3
+
4
+ class GlobalHorizontalInsolation < ActiveRecord::Base
5
+ extend Earth::Model
6
+ include Earth::InsolationScopes
7
+
8
+ TABLE_STRUCTURE = <<-EOS
9
+ CREATE TABLE global_horizontal_insolations
10
+ (
11
+ row_hash CHARACTER VARYING(255) NOT NULL PRIMARY KEY,
12
+ nw_lat FLOAT,
13
+ nw_lon FLOAT,
14
+ se_lat FLOAT,
15
+ se_lon FLOAT,
16
+ jan_average FLOAT,
17
+ feb_average FLOAT,
18
+ mar_average FLOAT,
19
+ apr_average FLOAT,
20
+ may_average FLOAT,
21
+ jun_average FLOAT,
22
+ jul_average FLOAT,
23
+ aug_average FLOAT,
24
+ sep_average FLOAT,
25
+ oct_average FLOAT,
26
+ nov_average FLOAT,
27
+ dec_average FLOAT,
28
+ annual_average FLOAT,
29
+ units CHARACTER VARYING(255)
30
+ );
31
+ EOS
32
+
33
+ self.primary_key = 'row_hash'
34
+
35
+ warn_unless_size 138970
36
+ warn_if_any_nulls
37
+ end
@@ -0,0 +1,41 @@
1
+ begin
2
+ require 'geo_ruby'
3
+ rescue LoadError
4
+ puts '[Earth] You need to install the geo_ruby gem to mine Insolation from scratch'
5
+ exit
6
+ end
7
+ begin
8
+ require 'dbf'
9
+ rescue LoadError
10
+ puts '[Earth] You need to install the dbf gem to mine Insolation from scratch'
11
+ exit
12
+ end
13
+ require 'unix_utils'
14
+
15
+ GlobalHorizontalInsolation.class_eval do
16
+ data_miner do
17
+ import 'Global Horizontal Insolation shapefile from NREL at http://www.nrel.gov/gis/data_solar.html',
18
+ :url => 'http://www.nrel.gov/gis/cfm/data/GIS_Data_Technology_Specific/United_States/Solar/High_Resolution/Lower_48_GHI_High_Resolution.zip',
19
+ :format => :shp do
20
+ key :row_hash
21
+ store 'nw_lat', :field_name => 'upper_corner_y'
22
+ store 'nw_lon', :field_name => 'upper_corner_x'
23
+ store 'se_lat', :field_name => 'lower_corner_y'
24
+ store 'se_lon', :field_name => 'lower_corner_x'
25
+ store 'jan_average', :field_name => 'GHI01'
26
+ store 'feb_average', :field_name => 'GHI02'
27
+ store 'mar_average', :field_name => 'GHI03'
28
+ store 'apr_average', :field_name => 'GHI04'
29
+ store 'may_average', :field_name => 'GHI05'
30
+ store 'jun_average', :field_name => 'GHI06'
31
+ store 'jul_average', :field_name => 'GHI07'
32
+ store 'aug_average', :field_name => 'GHI08'
33
+ store 'sep_average', :field_name => 'GHI09'
34
+ store 'oct_average', :field_name => 'GHI10'
35
+ store 'nov_average', :field_name => 'GHI11'
36
+ store 'dec_average', :field_name => 'GHI12'
37
+ store 'annual_average', :field_name => 'GHIANN'
38
+ store 'units', :static => 'kilowatt_hours_per_square_metre_per_day'
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,37 @@
1
+ require 'earth/model'
2
+ require 'earth/insolation_scopes'
3
+
4
+ class PhotovoltaicInsolation < ActiveRecord::Base
5
+ extend Earth::Model
6
+ include Earth::InsolationScopes
7
+
8
+ TABLE_STRUCTURE = <<-EOS
9
+ CREATE TABLE photovoltaic_insolations
10
+ (
11
+ row_hash CHARACTER VARYING(255) NOT NULL PRIMARY KEY,
12
+ nw_lat FLOAT,
13
+ nw_lon FLOAT,
14
+ se_lat FLOAT,
15
+ se_lon FLOAT,
16
+ jan_average FLOAT,
17
+ feb_average FLOAT,
18
+ mar_average FLOAT,
19
+ apr_average FLOAT,
20
+ may_average FLOAT,
21
+ jun_average FLOAT,
22
+ jul_average FLOAT,
23
+ aug_average FLOAT,
24
+ sep_average FLOAT,
25
+ oct_average FLOAT,
26
+ nov_average FLOAT,
27
+ dec_average FLOAT,
28
+ annual_average FLOAT,
29
+ units CHARACTER VARYING(255)
30
+ );
31
+ EOS
32
+
33
+ self.primary_key = 'row_hash'
34
+
35
+ warn_unless_size 90469
36
+ warn_if_any_nulls
37
+ end
@@ -0,0 +1,41 @@
1
+ begin
2
+ require 'geo_ruby'
3
+ rescue LoadError
4
+ puts '[Earth] You need to install the geo_ruby gem to mine Insolation from scratch'
5
+ exit
6
+ end
7
+ begin
8
+ require 'dbf'
9
+ rescue LoadError
10
+ puts '[Earth] You need to install the dbf gem to mine Insolation from scratch'
11
+ exit
12
+ end
13
+ require 'unix_utils'
14
+
15
+ PhotovoltaicInsolation.class_eval do
16
+ data_miner do
17
+ import 'Photovoltaic Insolation shapefile from NREL at http://www.nrel.gov/gis/data_solar.html',
18
+ :url => 'http://www.nrel.gov/gis/cfm/data/GIS_Data_Technology_Specific/United_States/Solar/High_Resolution/Lower_48_LATTILT_High_Resolution.zip',
19
+ :format => :shp do
20
+ key :row_hash
21
+ store 'nw_lat', :field_name => 'upper_corner_y'
22
+ store 'nw_lon', :field_name => 'upper_corner_x'
23
+ store 'se_lat', :field_name => 'lower_corner_y'
24
+ store 'se_lon', :field_name => 'lower_corner_x'
25
+ store 'jan_average', :field_name => 'JAN'
26
+ store 'feb_average', :field_name => 'FEB'
27
+ store 'mar_average', :field_name => 'MAR'
28
+ store 'apr_average', :field_name => 'APR'
29
+ store 'may_average', :field_name => 'MAY'
30
+ store 'jun_average', :field_name => 'JUN'
31
+ store 'jul_average', :field_name => 'JUL'
32
+ store 'aug_average', :field_name => 'AUG'
33
+ store 'sep_average', :field_name => 'SEP'
34
+ store 'oct_average', :field_name => 'OCT'
35
+ store 'nov_average', :field_name => 'NOV'
36
+ store 'dec_average', :field_name => 'DEC'
37
+ store 'annual_average', :field_name => 'ANNUAL'
38
+ store 'units', :static => 'kilowatt_hours_per_square_metre_per_day'
39
+ end
40
+ end
41
+ end
@@ -1,6 +1,5 @@
1
1
  require 'earth/model'
2
2
  require 'earth/loader'
3
- Earth::Loader.load_plugins
4
3
 
5
4
  require 'earth/locality/climate_division'
6
5
  require 'earth/locality/country'
@@ -9,6 +8,8 @@ require 'earth/locality/state'
9
8
  require 'earth/electricity/electric_market'
10
9
  require 'earth/electricity/electric_utility'
11
10
 
11
+ require 'geocoder'
12
+
12
13
  class ZipCode < ActiveRecord::Base
13
14
  data_miner do
14
15
  process "Ensure Country is imported because it's like a belongs_to association" do
@@ -17,6 +18,7 @@ class ZipCode < ActiveRecord::Base
17
18
  end
18
19
 
19
20
  extend Earth::Model
21
+ extend Geocoder::Model::ActiveRecord
20
22
 
21
23
  TABLE_STRUCTURE = <<-EOS
22
24
 
@@ -25,8 +27,8 @@ CREATE TABLE zip_codes
25
27
  name CHARACTER VARYING(255) NOT NULL PRIMARY KEY,
26
28
  state_postal_abbreviation CHARACTER VARYING(255),
27
29
  description CHARACTER VARYING(255),
28
- latitude CHARACTER VARYING(255),
29
- longitude CHARACTER VARYING(255),
30
+ latitude FLOAT,
31
+ longitude FLOAT,
30
32
  egrid_subregion_abbreviation CHARACTER VARYING(255),
31
33
  climate_division_name CHARACTER VARYING(255),
32
34
  population INTEGER
@@ -43,21 +45,13 @@ EOS
43
45
  has_many :electric_utilities, :through => :electric_markets
44
46
 
45
47
  scope :known_subregion, where('egrid_subregion_abbreviation IS NOT NULL')
46
-
48
+
49
+ reverse_geocoded_by :latitude, :longitude
50
+
47
51
  def country
48
52
  Country.united_states
49
53
  end
50
-
51
- # Used by LodgingProperty custom find to find properties near to a zip code
52
- def latitude_longitude
53
- [latitude, longitude]
54
- end
55
-
56
- # Used by LodgingProperty custom find to find properties near to a zip code
57
- acts_as_mappable :default_units => :kilometres,
58
- :lat_column_name => :latitude,
59
- :lng_column_name => :longitude
60
-
54
+
61
55
  warn_unless_size 43770
62
56
  warn_if_nonexistent_owner_except :egrid_subregion
63
57
  end