terrapop_models 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/javascripts/terrapop_models/application.js +13 -0
  6. data/app/assets/stylesheets/terrapop_models/application.css +15 -0
  7. data/app/controllers/terrapop_models/application_controller.rb +4 -0
  8. data/app/helpers/terrapop_models/application_helper.rb +4 -0
  9. data/app/models/api_log.rb +2 -0
  10. data/app/models/area_data_raster.rb +126 -0
  11. data/app/models/area_data_raster_variable_mnemonic_lookup.rb +4 -0
  12. data/app/models/area_data_statistic.rb +6 -0
  13. data/app/models/area_data_table.rb +25 -0
  14. data/app/models/area_data_table_group.rb +8 -0
  15. data/app/models/area_data_table_group_membership.rb +7 -0
  16. data/app/models/area_data_value.rb +37 -0
  17. data/app/models/area_data_variable.rb +140 -0
  18. data/app/models/area_data_variable_construction.rb +6 -0
  19. data/app/models/attached_variable_pointer.rb +5 -0
  20. data/app/models/bare_user.rb +7 -0
  21. data/app/models/boundary.rb +6 -0
  22. data/app/models/build_status.rb +2 -0
  23. data/app/models/category.rb +17 -0
  24. data/app/models/codebook.rb +242 -0
  25. data/app/models/common_variable.rb +2 -0
  26. data/app/models/country.rb +45 -0
  27. data/app/models/country_comparability.rb +6 -0
  28. data/app/models/country_level.rb +8 -0
  29. data/app/models/ddi2_codebook.rb +541 -0
  30. data/app/models/error_event.rb +2 -0
  31. data/app/models/extract_data_artifact.rb +4 -0
  32. data/app/models/extract_request.rb +817 -0
  33. data/app/models/extract_request_area_data_raster_variable_mnemonic_lookup.rb +4 -0
  34. data/app/models/extract_request_error_event.rb +4 -0
  35. data/app/models/extract_request_submission.rb +19 -0
  36. data/app/models/extract_status.rb +55 -0
  37. data/app/models/extract_type.rb +2 -0
  38. data/app/models/extract_variable_stub.rb +17 -0
  39. data/app/models/frequency.rb +7 -0
  40. data/app/models/geog_instance.rb +18 -0
  41. data/app/models/geog_unit.rb +5 -0
  42. data/app/models/global_region.rb +6 -0
  43. data/app/models/global_region_type.rb +5 -0
  44. data/app/models/heartbeat.rb +8 -0
  45. data/app/models/heartbeat_pulse.rb +3 -0
  46. data/app/models/insert_html_fragment.rb +3 -0
  47. data/app/models/ipums_academic_status.rb +9 -0
  48. data/app/models/ipums_anticipated_result.rb +9 -0
  49. data/app/models/ipums_department.rb +9 -0
  50. data/app/models/ipums_registration.rb +72 -0
  51. data/app/models/ipums_user.rb +15 -0
  52. data/app/models/label.rb +7 -0
  53. data/app/models/link.rb +21 -0
  54. data/app/models/map.rb +255 -0
  55. data/app/models/map_unit.rb +4 -0
  56. data/app/models/map_unit_raster_dataset.rb +4 -0
  57. data/app/models/markup_transform.rb +240 -0
  58. data/app/models/measurement_type.rb +5 -0
  59. data/app/models/nhgis/agg_data_var.rb +120 -0
  60. data/app/models/nhgis/breakdown_combo.rb +84 -0
  61. data/app/models/nhgis/breakdown_var.rb +8 -0
  62. data/app/models/nhgis/data_file.rb +43 -0
  63. data/app/models/nhgis/data_file_type.rb +17 -0
  64. data/app/models/nhgis/data_group.rb +125 -0
  65. data/app/models/nhgis/data_record_range.rb +22 -0
  66. data/app/models/nhgis/data_table.rb +8 -0
  67. data/app/models/nhgis/dataset.rb +76 -0
  68. data/app/models/nhgis/dataset_group.rb +6 -0
  69. data/app/models/nhgis/geog_level.rb +14 -0
  70. data/app/models/nhgis/geog_level_collection.rb +15 -0
  71. data/app/models/nhgis/geog_level_geog_level_group.rb +10 -0
  72. data/app/models/nhgis/geog_level_group.rb +87 -0
  73. data/app/models/nhgis/geog_name.rb +12 -0
  74. data/app/models/nhgis/geog_unit.rb +11 -0
  75. data/app/models/nhgis/geog_var 2.rb +10 -0
  76. data/app/models/nhgis/geog_var.rb +6 -0
  77. data/app/models/nhgis/geog_var_geog_level.rb +8 -0
  78. data/app/models/nhgis/geotime.rb +21 -0
  79. data/app/models/nhgis/integ_geog_instance.rb +6 -0
  80. data/app/models/nhgis/integ_geog_instance_source_geog_instance.rb +9 -0
  81. data/app/models/nhgis/integ_geog_level.rb +9 -0
  82. data/app/models/nhgis/integ_geog_name.rb +12 -0
  83. data/app/models/nhgis/shape_file.rb +203 -0
  84. data/app/models/nhgis/shape_file_x_dataset.rb +8 -0
  85. data/app/models/nhgis/tabulation_type.rb +8 -0
  86. data/app/models/nhgis/time_instance.rb +6 -0
  87. data/app/models/nhgis/time_instance_integ_geog_level.rb +9 -0
  88. data/app/models/nhgis/time_series.rb +12 -0
  89. data/app/models/nhgis/time_series_component.rb +9 -0
  90. data/app/models/nhgis/time_series_release.rb +6 -0
  91. data/app/models/nhgis/time_series_table.rb +13 -0
  92. data/app/models/nhgis/time_series_table_dataset.rb +9 -0
  93. data/app/models/nhgis/time_series_table_geog_level.rb +9 -0
  94. data/app/models/nhgis/time_series_table_time_instance.rb +9 -0
  95. data/app/models/nhgis/time_series_table_time_series_release.rb +7 -0
  96. data/app/models/nhgis/time_series_table_topic.rb +9 -0
  97. data/app/models/nhgis/time_series_table_x_time_series.rb +9 -0
  98. data/app/models/nhgis_metadata_store.rb +2 -0
  99. data/app/models/raster.rb +5 -0
  100. data/app/models/raster_category.rb +6 -0
  101. data/app/models/raster_category_statistic.rb +7 -0
  102. data/app/models/raster_data_type.rb +6 -0
  103. data/app/models/raster_dataset.rb +130 -0
  104. data/app/models/raster_dataset_group.rb +3 -0
  105. data/app/models/raster_dataset_raster_data_type.rb +4 -0
  106. data/app/models/raster_dataset_raster_dataset_unit.rb +4 -0
  107. data/app/models/raster_dataset_raster_variable.rb +4 -0
  108. data/app/models/raster_dataset_unit.rb +4 -0
  109. data/app/models/raster_group.rb +87 -0
  110. data/app/models/raster_metadata.rb +6 -0
  111. data/app/models/raster_operation.rb +10 -0
  112. data/app/models/raster_raster_variable.rb +2 -0
  113. data/app/models/raster_statistic.rb +6 -0
  114. data/app/models/raster_value.rb +83 -0
  115. data/app/models/raster_variable.rb +440 -0
  116. data/app/models/raster_variable_classification.rb +4 -0
  117. data/app/models/raster_variable_group_membership.rb +4 -0
  118. data/app/models/request_area_data_variable.rb +57 -0
  119. data/app/models/request_geog_unit.rb +6 -0
  120. data/app/models/request_raster_dataset.rb +4 -0
  121. data/app/models/request_raster_variable.rb +147 -0
  122. data/app/models/request_sample.rb +34 -0
  123. data/app/models/request_sample_geog_level.rb +4 -0
  124. data/app/models/request_terrapop_sample.rb +6 -0
  125. data/app/models/request_variable.rb +104 -0
  126. data/app/models/resolution.rb +5 -0
  127. data/app/models/sample.rb +81 -0
  128. data/app/models/sample_design.rb +300 -0
  129. data/app/models/sample_detail_field.rb +7 -0
  130. data/app/models/sample_detail_group.rb +3 -0
  131. data/app/models/sample_detail_value.rb +11 -0
  132. data/app/models/sample_details.rb +90 -0
  133. data/app/models/sample_geog_level.rb +150 -0
  134. data/app/models/sample_level_area_data_variable.rb +13 -0
  135. data/app/models/sample_variable.rb +11 -0
  136. data/app/models/status_definition.rb +2 -0
  137. data/app/models/system_statistic.rb +5 -0
  138. data/app/models/tag.rb +7 -0
  139. data/app/models/terrapop_configuration.rb +75 -0
  140. data/app/models/terrapop_extract_information.rb +64 -0
  141. data/app/models/terrapop_raster_summary_cache.rb +6 -0
  142. data/app/models/terrapop_sample.rb +313 -0
  143. data/app/models/terrapop_setting.rb +11 -0
  144. data/app/models/topic.rb +7 -0
  145. data/app/models/ui_text_snippet.rb +2 -0
  146. data/app/models/universe.rb +5 -0
  147. data/app/models/user.rb +262 -0
  148. data/app/models/user_role.rb +5 -0
  149. data/app/models/variable.rb +127 -0
  150. data/app/models/variable_availability_cach.rb +3 -0
  151. data/app/models/variable_group.rb +14 -0
  152. data/app/models/variable_source.rb +8 -0
  153. data/app/views/layouts/terrapop_models/application.html.erb +14 -0
  154. data/config/routes.rb +2 -0
  155. data/db/migrate/00000000000100_create_countries.rb +15 -0
  156. data/db/migrate/00000000000200_create_universes.rb +11 -0
  157. data/db/migrate/00000000000300_create_geog_units.rb +9 -0
  158. data/db/migrate/00000000000400_create_measurement_types.rb +9 -0
  159. data/db/migrate/00000000000500_create_area_data_table_groups.rb +13 -0
  160. data/db/migrate/00000000000600_create_area_data_tables.rb +14 -0
  161. data/db/migrate/00000000000700_create_area_data_table_group_memberships.rb +12 -0
  162. data/db/migrate/00000000000800_create_tags.rb +9 -0
  163. data/db/migrate/00000000000900_create_topics.rb +9 -0
  164. data/db/migrate/00000000001000_create_variable_groups.rb +18 -0
  165. data/db/migrate/00000000001100_create_samples.rb +32 -0
  166. data/db/migrate/00000000001200_create_terrapop_samples.rb +12 -0
  167. data/db/migrate/00000000001300_create_variables.rb +52 -0
  168. data/db/migrate/00000000001400_create_country_levels.rb +17 -0
  169. data/db/migrate/00000000001450_variable_topics.rb +19 -0
  170. data/db/migrate/00000000001500_create_sample_geog_levels.rb +20 -0
  171. data/db/migrate/00000000002000_create_area_data_variables.rb +19 -0
  172. data/db/migrate/00000000002050_area_data_variable_topics.rb +22 -0
  173. data/db/migrate/00000000002100_create_sample_level_area_data_variables.rb +16 -0
  174. data/db/migrate/00000000002200_create_sample_level_area_variable_constructions.rb +12 -0
  175. data/db/migrate/00000000003000_create_maps.rb +22 -0
  176. data/db/migrate/00000000003100_create_boundaries.rb +14 -0
  177. data/db/migrate/00000000004000_create_geog_instances.rb +20 -0
  178. data/db/migrate/00000000004100_create_area_data_values.rb +18 -0
  179. data/db/migrate/00000000005000_create_sample_variables.rb +21 -0
  180. data/db/migrate/00000000005100_create_categories.rb +20 -0
  181. data/db/migrate/00000000005200_create_frequencies.rb +16 -0
  182. data/db/migrate/00000000005300_create_variable_sources.rb +16 -0
  183. data/db/migrate/00000000006000_create_user_roles.rb +8 -0
  184. data/db/migrate/00000000006100_create_users.rb +43 -0
  185. data/db/migrate/00000000006300_create_samples_tags.rb +15 -0
  186. data/db/migrate/00000000006400_create_terrapop_samples_tags.rb +15 -0
  187. data/db/migrate/00000000007000_create_raster_data_types.rb +9 -0
  188. data/db/migrate/00000000007050_create_resolutions.rb +8 -0
  189. data/db/migrate/00000000007100_create_raster_datasets.rb +26 -0
  190. data/db/migrate/00000000007200_create_raster_groups.rb +20 -0
  191. data/db/migrate/00000000007250_create_raster_groups_tags.rb +19 -0
  192. data/db/migrate/00000000007300_create_raster_variables.rb +28 -0
  193. data/db/migrate/00000000007325_create_raster_variable_group_memberships.rb +12 -0
  194. data/db/migrate/00000000007350_raster_variable_topics.rb +22 -0
  195. data/db/migrate/00000000007400_create_rasters.rb +22 -0
  196. data/db/migrate/00000000007500_create_raster_operations.rb +11 -0
  197. data/db/migrate/00000000010000_create_status_definitions.rb +8 -0
  198. data/db/migrate/00000000010050_create_extract_types.rb +10 -0
  199. data/db/migrate/00000000010100_create_build_statuses.rb +10 -0
  200. data/db/migrate/00000000010200_create_extract_requests.rb +14 -0
  201. data/db/migrate/00000000010300_create_extract_requests_labels_join_table.rb +20 -0
  202. data/db/migrate/00000000010400_create_extract_statuses.rb +13 -0
  203. data/db/migrate/00000000010500_create_request_geog_units.rb +13 -0
  204. data/db/migrate/00000000010600_create_request_terrapop_samples.rb +15 -0
  205. data/db/migrate/00000000011000_create_request_variable.rb +16 -0
  206. data/db/migrate/00000000011100_create_request_area_data_variables.rb +18 -0
  207. data/db/migrate/00000000011200_create_request_raster_variables.rb +20 -0
  208. data/db/migrate/00000000012000_create_raster_summary_functions.rb +130 -0
  209. data/db/migrate/00000000013000_create_terrapop_settings.rb +24 -0
  210. data/db/migrate/20121218190647_create_attached_variable_pointer.rb +18 -0
  211. data/db/migrate/20121218191609_add_attached_variable_pointer_id.rb +9 -0
  212. data/db/migrate/20121218205322_add_wants_attached.rb +9 -0
  213. data/db/migrate/20121219145142_add_attributes_to_terrapop_sample.rb +68 -0
  214. data/db/migrate/20130125155216_add_default_order_index_to_variables.rb +5 -0
  215. data/db/migrate/20130129204515_create_request_samples.rb +14 -0
  216. data/db/migrate/20130129204718_create_request_raster_datasets.rb +13 -0
  217. data/db/migrate/20130205195304_create_error_events.rb +10 -0
  218. data/db/migrate/20130206202006_add_country_index_for_continent.rb +8 -0
  219. data/db/migrate/20130207202628_create_raster_metadata.rb +13 -0
  220. data/db/migrate/20130208192415_add_extents_to_raster_dataset.rb +6 -0
  221. data/db/migrate/20130209182800_create_global_regions.rb +11 -0
  222. data/db/migrate/20130209182858_add_global_region_id_country.rb +13 -0
  223. data/db/migrate/20130211183221_add_type_to_global_regions.rb +5 -0
  224. data/db/migrate/20130212190940_create_global_region_types.rb +8 -0
  225. data/db/migrate/20130212192357_remove_classification_add_global_region_type_id_to_global_region.rb +13 -0
  226. data/db/migrate/20130304181054_add_code_to_boundaries.rb +5 -0
  227. data/db/migrate/20130305223407_add_ipumsi_user_flagto_users.rb +15 -0
  228. data/db/migrate/20130305224906_add_ipumsi_user_date_flagto_users.rb +11 -0
  229. data/db/migrate/20130308214537_create_request_sample_geog_levels.rb +14 -0
  230. data/db/migrate/20130312191726_create_raster_statistics.rb +23 -0
  231. data/db/migrate/20130312192100_create_raster_categories.rb +14 -0
  232. data/db/migrate/20130312192158_create_raster_category_statistics.rb +22 -0
  233. data/db/migrate/20130312203045_create_area_data_statistics.rb +15 -0
  234. data/db/migrate/20130401161222_add_summary_to_raster_variable.rb +11 -0
  235. data/db/migrate/20130402203508_add_global_region_sort_order_column.rb +8 -0
  236. data/db/migrate/20130402211553_add_weighted_to_terrapop_samples.rb +5 -0
  237. data/db/migrate/20130408022218_add_period_to_raster_datasets.rb +5 -0
  238. data/db/migrate/20130409161950_create_area_data_variable_constructions.rb +17 -0
  239. data/db/migrate/20130409162731_add_opcode_to_raster_operations.rb +5 -0
  240. data/db/migrate/20130412141109_update_raster_summary_functions.rb +39 -0
  241. data/db/migrate/20130415174823_create_insert_html_fragments.rb +13 -0
  242. data/db/migrate/20130415185523_create_common_variables.rb +13 -0
  243. data/db/migrate/20130416144840_add_columns_to_request_samples.rb +6 -0
  244. data/db/migrate/20130416150151_add_revision_of_column_to_extract_request.rb +8 -0
  245. data/db/migrate/20130416151200_add_file_type_to_extract_request.rb +5 -0
  246. data/db/migrate/20130416161440_add_column_general_detailed_selection_to_request_variables.rb +5 -0
  247. data/db/migrate/20130416170551_add_wants_case_selection_to_request_variable.rb +5 -0
  248. data/db/migrate/20130613185642_add_indexes_to_tables.rb +7 -0
  249. data/db/migrate/20130614193857_add_more_column_indexes.rb +11 -0
  250. data/db/migrate/20130618141508_create_raster_dataset_raster_data_types.rb +17 -0
  251. data/db/migrate/20130618185528_add_circa_to_raster_dataset.rb +5 -0
  252. data/db/migrate/20130619160555_create_raster_dataset_units.rb +9 -0
  253. data/db/migrate/20130619161934_create_raster_dataset_raster_dataset_units.rb +17 -0
  254. data/db/migrate/20130621184015_add_raster_dataset_process_summary.rb +8 -0
  255. data/db/migrate/20130621203809_add_source_information_column_to_raster_dataset.rb +5 -0
  256. data/db/migrate/20130624144333_add_temporal_extent_description_to_raster_dataset.rb +5 -0
  257. data/db/migrate/20130624154952_add_provider_to_raster_dataset.rb +5 -0
  258. data/db/migrate/20130624175342_add_use_constraints_column_to_raster_dataset.rb +5 -0
  259. data/db/migrate/20130624175632_drop_use_constraints_column_from_raster_dataset.rb +8 -0
  260. data/db/migrate/20130624192654_add_north_south_east_west_columns_to_raster_dataset.rb +8 -0
  261. data/db/migrate/20130625193303_add_sort_operation_identifier_to_raster_group.rb +5 -0
  262. data/db/migrate/20130702190659_add_raster_group_id_to_raster_variable.rb +9 -0
  263. data/db/migrate/20130708184410_create_country_comparabilities.rb +14 -0
  264. data/db/migrate/20130711191704_add_ipumsi_user_id_to_user.rb +8 -0
  265. data/db/migrate/20130712150252_add_data_settings_column_to_user.rb +8 -0
  266. data/db/migrate/20130719183620_add_visible_and_map_to_columns_to_raster_operations.rb +13 -0
  267. data/db/migrate/20130812194537_create_extract_request_submissions.rb +12 -0
  268. data/db/migrate/20130813165221_remove_ipums_user_id_from_user.rb +8 -0
  269. data/db/migrate/20130814161802_add_uuid_field_to_extract_request.rb +6 -0
  270. data/db/migrate/20130816204002_add_country_id_to_terrapop_sample.rb +8 -0
  271. data/db/migrate/20130816204214_add_year_to_terrapop_sample.rb +8 -0
  272. data/db/migrate/20130816205324_add_indexes_to_country.rb +9 -0
  273. data/db/migrate/20130819145802_add_foreign_key_to_terrapop_sample.rb +5 -0
  274. data/db/migrate/20130819155712_add_indexes_to_sample_level_area_data_variable.rb +5 -0
  275. data/db/migrate/20130819163013_add_short_country_name_to_terrapop_sample.rb +8 -0
  276. data/db/migrate/20130820195420_add_is_erf_to_country.rb +7 -0
  277. data/db/migrate/20130821221743_fix_raster_summary_function_num_classes.rb +39 -0
  278. data/db/migrate/20130830192340_add_more_user_registration_columns.rb +51 -0
  279. data/db/migrate/20130904205306_add_raster_variable_sort_order_weight.rb +8 -0
  280. data/db/migrate/20130912145522_add_localized_label_to_country_levels.rb +5 -0
  281. data/db/migrate/20130913194351_create_terrapop_raster_summary_caches.rb +27 -0
  282. data/db/migrate/20130916212710_add_year_range_to_map.rb +11 -0
  283. data/db/migrate/20130917154553_create_sample_designs.rb +14 -0
  284. data/db/migrate/20130924210303_add_raster_only_to_extract_request.rb +5 -0
  285. data/db/migrate/20131001220437_add_mnemonic_and_codebook_description_to_area_data_value.rb +11 -0
  286. data/db/migrate/20131002213443_add_ipums_email_sent_at_column.rb +8 -0
  287. data/db/migrate/20131020154130_remove_index_if_exists.rb +9 -0
  288. data/db/migrate/20131020170642_remove_ui_snippet_table_if_exists.rb +8 -0
  289. data/db/migrate/20131021204227_create_ui_text_snippet.rb +11 -0
  290. data/db/migrate/20131022190227_rename_table_fix_ui_text_snippets.rb +9 -0
  291. data/db/migrate/20131119154817_add_unique_index_on_uuid_on.rb +9 -0
  292. data/db/migrate/20131202161911_add_send_toi_rods_flag_to_extract_request.rb +13 -0
  293. data/db/migrate/20140122150020_add_geographic_levelto_geog_instance.rb +11 -0
  294. data/db/migrate/20140124184809_add_zip_file_location.rb +8 -0
  295. data/db/migrate/20140205205539_add_api_related_fields_to_user.rb +5 -0
  296. data/db/migrate/20140206213258_create_extract_request_error_events.rb +14 -0
  297. data/db/migrate/20140206222630_add_requesting_url_to_extract_request.rb +5 -0
  298. data/db/migrate/20140207153005_create_api_logs.rb +14 -0
  299. data/db/migrate/20140228182300_change_user_institutional_affiliation_to_bool.rb +50 -0
  300. data/db/migrate/20140312143201_add_start_and_end_time_and_total_time_to_extract_request.rb +7 -0
  301. data/db/migrate/20140318212913_remove_add_index_to_area_data_value.rb +12 -0
  302. data/db/migrate/20140319155819_add_long_mnemonic_to_area_data_value.rb +7 -0
  303. data/db/migrate/20140319200718_drop_mnemonic_column_area_data_value.rb +10 -0
  304. data/db/migrate/20140320184210_add_show_in_ui_column_in_raster_variable.rb +8 -0
  305. data/db/migrate/20140328150435_rename_revision_of_column_to_rabl_usable_column_name.rb +8 -0
  306. data/db/migrate/20140331142153_add_revision_of_column.rb +8 -0
  307. data/db/migrate/20140402181324_add_new_raster_summary_functions.rb +191 -0
  308. data/db/migrate/20140403185242_add_raster_variable_area_reference_id.rb +12 -0
  309. data/db/migrate/20140410145305_add_raster_area_column_to_terrapop_raster_summary_cache.rb +6 -0
  310. data/db/migrate/20140414170802_add_new_raster_summarization.rb +85 -0
  311. data/db/migrate/20140421150330_add_second_reference_column_to_raster_variable.rb +9 -0
  312. data/db/migrate/20140506165634_add_deactivated_at_and_deleted_at_to_user.rb +6 -0
  313. data/db/migrate/20140507142843_add_column_to_frequencies.rb +5 -0
  314. data/db/migrate/20140513143055_add_sample_geog_level_id_to_request_models.rb +11 -0
  315. data/db/migrate/20140521160554_create_links.rb +9 -0
  316. data/db/migrate/20140522214508_add_ipumsi_salt_and_ipumsi_crypted_password_to_user.rb +13 -0
  317. data/db/migrate/20140604192953_add_name_to_terrapop_setting.rb +47 -0
  318. data/db/migrate/20140609163907_create_variable_availability_caches.rb +9 -0
  319. data/db/migrate/20140609210447_add_foreign_index_to_variable_availability_cache.rb +8 -0
  320. data/db/migrate/20140609213300_create_area_data_variable_availability_caches.rb +13 -0
  321. data/db/migrate/20140610135849_create_nhgis_metadata_stores.rb +30 -0
  322. data/db/migrate/20140610211138_add_dataset_id_to_nhgis_metadata.rb +5 -0
  323. data/db/migrate/20140611181543_add_replicate_weight_variable_id_to_variables.rb +5 -0
  324. data/db/migrate/20140618200741_add_key_column_toraster_variable_group_memberships.rb +7 -0
  325. data/db/migrate/20140618202053_add_key_column_toraster_variable_group_memberships2.rb +8 -0
  326. data/db/migrate/20140701134952_create_system_statistics.rb +12 -0
  327. data/db/migrate/20140804161242_add_fields_to_terrapop_sample.rb +7 -0
  328. data/db/migrate/20140806173750_add_geometry_column_to_boundaries.rb +5 -0
  329. data/db/migrate/20140821205836_add_git_hash_field_to_extract_request.rb +5 -0
  330. data/db/migrate/20140822140106_create_map_units.rb +9 -0
  331. data/db/migrate/20140822140358_create_map_unit_raster_datasets.rb +17 -0
  332. data/db/migrate/20140822143517_redefine_short_unit_on_map_unit_to_longer_string.rb +5 -0
  333. data/db/migrate/20140825135403_add_finger_print_hash_to_maps.rb +5 -0
  334. data/db/migrate/20140826163359_add_source_field_to_terrapop_sample.rb +8 -0
  335. data/db/migrate/20140827153014_add_microdata_file_size_to_sample.rb +5 -0
  336. data/db/migrate/20140828161647_add_raster_band_index_to_raster_categories.rb +5 -0
  337. data/db/migrate/20140828162650_add_post_gis_raster_output_indicator_to_raster_variable.rb +5 -0
  338. data/db/migrate/20140829150251_create_raster_dataset_raster_variables.rb +17 -0
  339. data/db/migrate/20140902194529_add_raster_band_to_raster_dataset_model.rb +7 -0
  340. data/db/migrate/20140903202609_create_heartbeats.rb +9 -0
  341. data/db/migrate/20140903204113_create_heartbeat_pulse.rb +10 -0
  342. data/db/migrate/20140904164247_create_raster_raster_variables.rb +16 -0
  343. data/db/migrate/20140908193007_add_area_level_rasterization_functions.rb +103 -0
  344. data/db/migrate/20140908194021_create_area_data_rasters.rb +39 -0
  345. data/db/migrate/20140909143933_rename_valid_column_on_area_data_raster.rb +5 -0
  346. data/db/migrate/20140911201639_add_columns_to_area_data_raster.rb +11 -0
  347. data/db/migrate/20140911211923_alter_area_data_raster_indexes.rb +12 -0
  348. data/db/migrate/20140919144305_create_raster_variable_classifications.rb +29 -0
  349. data/db/migrate/20140925140810_add_other_raster_variables_to_raster_variable_classification.rb +9 -0
  350. data/db/migrate/20140925172245_add_grouping_indicator_to_raster_classifications.rb +5 -0
  351. data/db/migrate/20140925175157_add_classification_indicator_to_raster_variable.rb +5 -0
  352. data/db/migrate/20140930142006_remove_boundary_id_from_geog_instance.rb +6 -0
  353. data/db/migrate/20141003164150_add_terrapop_sample_id_to_map_and_geog_instance.rb +11 -0
  354. data/db/migrate/20141029202813_add_nhgis_dat_file_to_sample_geog_level.rb +5 -0
  355. data/db/migrate/20141029204521_add_columns_to_sample_level_area_data_variable.rb +6 -0
  356. data/db/migrate/20141104212652_create_categorical_raster_summarization.rb +39 -0
  357. data/db/migrate/20141105202744_add_margin_file_to_sample_geog_level.rb +5 -0
  358. data/db/migrate/20141105205347_add_margin_field_to_area_data_value.rb +5 -0
  359. data/db/migrate/20141105205607_add_join_fields_to_sample_geog_level.rb +8 -0
  360. data/db/migrate/20141202180411_add_new_categorical_summarization_function.rb +62 -0
  361. data/db/migrate/20141212172044_add_continuous_raster_summarization0.rb +51 -0
  362. data/db/migrate/20141212195611_add_indexes_to_boundaries.rb +10 -0
  363. data/db/migrate/20141212202521_add_indexes_to_frequencies.rb +7 -0
  364. data/db/migrate/20141229150743_add_special_value_to_area_data_value.rb +5 -0
  365. data/db/migrate/20141230153550_add_field_to_global_regions.rb +8 -0
  366. data/db/migrate/20150107142518_add_restriction_indicated_to_sample.rb +5 -0
  367. data/db/migrate/20150114161817_add_raster_to_tiff_function.rb +35 -0
  368. data/db/migrate/20150115204303_add_hide_nhgis_datasets_to_users.rb +11 -0
  369. data/db/migrate/20150126192918_add_new_gli_post_gis_functions.rb +99 -0
  370. data/db/migrate/20150126223419_add_short_label_to_terrapop_samples.rb +11 -0
  371. data/db/migrate/20150127172953_add_another_raster_summarization_function.rb +44 -0
  372. data/db/migrate/20150130163215_new_glc_summarization_function.rb +40 -0
  373. data/db/migrate/20150211221354_create_cache_items.rb +23 -0
  374. data/db/migrate/20150212223011_add_microdata_access_expired_date_to_users.rb +11 -0
  375. data/db/migrate/20150217221940_add_new_band_aware_categorical_to_binary_summarization.rb +177 -0
  376. data/db/migrate/20150302145459_removeuse_postgis_procedure_for_geotiff.rb +5 -0
  377. data/db/migrate/20150313194752_add_color_map_to_tiff_output.rb +34 -0
  378. data/db/migrate/20150313202158_add_color_map_to_jpeg_output.rb +34 -0
  379. data/db/migrate/20150318183314_add_non_color_map_cookie_cutter_functions.rb +65 -0
  380. data/db/migrate/20150324160629_add_categorical_multi_band_summarization.rb +62 -0
  381. data/db/migrate/20150324161827_add_index_to_rasters_raster_variable_id.rb +5 -0
  382. data/db/migrate/20150327203257_add_band_to_terrapop_raster_summary_cache.rb +5 -0
  383. data/db/migrate/20150331142232_add_xml_field_to_map.rb +5 -0
  384. data/db/migrate/20150331153703_add_new_continous_summarization.rb +38 -0
  385. data/db/migrate/20150409153145_categorical_to_binary_as_raster.rb +49 -0
  386. data/db/migrate/20150413204130_generic_categorical_to_binary_raster_output_function.rb +92 -0
  387. data/db/migrate/20150416133743_ratio_area_level_data_to_raster_function.rb +55 -0
  388. data/db/migrate/20150416143838_projection_function_for_single_band_rasters.rb +27 -0
  389. data/db/migrate/20150419203614_add_raster_dataset_to_terrapop_raster_summary_cache.rb +12 -0
  390. data/db/migrate/20150419232521_add_raster_dataset_to_request_raster_variable.rb +9 -0
  391. data/db/migrate/20150427163939_create_single_binary_from_categorical_to_tiff_function.rb +51 -0
  392. data/db/migrate/20150518200435_add_new_binary_cookie_cutter_functions.rb +95 -0
  393. data/db/migrate/20150520195145_revised_glc_binary_summarization_function.rb +64 -0
  394. data/db/migrate/20150526205918_new_categorical_to_binary_summarization.rb +72 -0
  395. data/db/migrate/20150527144243_even_newer_glc_binary_function.rb +79 -0
  396. data/db/migrate/20150527191853_add_even_newer_glc_category_to_binary_function.rb +74 -0
  397. data/db/migrate/20150528141915_yancat_to_bin_summarization_function.rb +66 -0
  398. data/db/migrate/20150529182542_add_indexes_to_geog_instances.rb +9 -0
  399. data/db/migrate/20150601160855_drop_area_data_variable_availability_caches.rb +5 -0
  400. data/db/migrate/20150625150152_add_geog_instance_f_key_on_boundaries.rb +5 -0
  401. data/db/migrate/20150626144305_geog_instance_geog_code_wider.rb +6 -0
  402. data/db/migrate/20150709161201_glc_summarization_version5.rb +79 -0
  403. data/db/migrate/20150713165442_glc_summarization_version6.rb +82 -0
  404. data/db/migrate/20150713185652_tp_jpeg_raster_clip_color_map_v2.rb +34 -0
  405. data/db/migrate/20150716182438_new_rasters_table.rb +18 -0
  406. data/db/migrate/20150716184828_new_stored_procedures_for_new_rasters.rb +70 -0
  407. data/db/migrate/20150721161943_remove_ownership_statement_from_function.rb +69 -0
  408. data/db/migrate/20150727134942_rename_rasters_new_to_new_rasters.rb +19 -0
  409. data/db/migrate/20150727135614_update_table_name_in_make_jpeg2.rb +70 -0
  410. data/db/migrate/20150727143159_jpeg_clip_experiment.rb +36 -0
  411. data/db/migrate/20150727145556_create_new_tiff_raster_clip_with_buffer.rb +34 -0
  412. data/db/migrate/20150727161508_update_table_name_in_make_jpeg2_part_deux.rb +77 -0
  413. data/db/migrate/20150727193403_drop_rasters_new.rb +5 -0
  414. data/db/migrate/20150728184718_make_jpeg2_part_deux.rb +70 -0
  415. data/db/migrate/20150728214344_correct_new_rasters_table_in_new_make_jpeg2_function.rb +79 -0
  416. data/db/migrate/20150729144526_even_more_correct_new_rasters_table_in_new_make_jpeg2_function.rb +78 -0
  417. data/db/migrate/20150729160936_fixingterrapop_reclassify_categorical_raster_to_binary_summariz_v3.rb +68 -0
  418. data/db/migrate/20150730141036_adjust_jpeg_clip_for_categorical.rb +67 -0
  419. data/db/migrate/20150730153216_ststandardize_terrapop_reclassify_categorical_raster_to_binary_summariz_v3.rb +69 -0
  420. data/db/migrate/20150730163446_add_origin_to_extract_requests.rb +5 -0
  421. data/db/migrate/20150731151304_consistent_return_fieldsterrapop_gli_yield_areal_summarization.rb +99 -0
  422. data/db/migrate/20150731192327_add_boundary_only_field_to_terrapop_sample.rb +5 -0
  423. data/db/migrate/20150803213048_add_function_to_detect_boundaries_that_wrap_globe.rb +50 -0
  424. data/db/migrate/20150814154127_add_processing_flag_to_extract_request.rb +5 -0
  425. data/db/migrate/20150814165605_add_colormapped_categorical_to_binary_jpeg_cookie_cutteringizing_function.rb +49 -0
  426. data/db/migrate/20150814183708_around_the_world_wrap_a_raster_function.rb +157 -0
  427. data/db/migrate/20150910194333_add_extract_grouping_field_to_extract_request.rb +5 -0
  428. data/db/migrate/20150915194808_drop_sessions_table.rb +5 -0
  429. data/db/migrate/20150915215426_add_sessions_table.rb +12 -0
  430. data/db/migrate/20151009203606_create_sample_detail_groups.rb +8 -0
  431. data/db/migrate/20151009203855_create_sample_detail_fields.rb +13 -0
  432. data/db/migrate/20151009204052_create_sample_detail_values.rb +12 -0
  433. data/db/migrate/20151016152953_add_indexes_to_area_data_values.rb +7 -0
  434. data/db/migrate/20151023160555_add_data_to_extract_requests.rb +8 -0
  435. data/db/migrate/20151026155953_rename_description_add_title_to_extract_requests.rb +8 -0
  436. data/db/migrate/20151029144017_create_raster_dataset_groups.rb +9 -0
  437. data/db/migrate/20151029144147_add_raster_dataset_group_to_raster_dataset.rb +9 -0
  438. data/db/migrate/20151029182802_add_mnemonic_to_raster_dataset_group.rb +5 -0
  439. data/db/migrate/20151029184642_change_field_type_on_raster_dataset_group.rb +5 -0
  440. data/db/migrate/20151029210539_remove_unnecessary_fields_from_terrapop_sample.rb +60 -0
  441. data/db/migrate/20151102205254_create_data_artifacts.rb +17 -0
  442. data/db/migrate/20151102211601_add_json_field_to_extract_data_artifacts.rb +8 -0
  443. data/db/migrate/20151103152754_add_file_name_field_to_extract_request.rb +5 -0
  444. data/db/migrate/20151106155249_add_submitted_at_to_extract_request.rb +5 -0
  445. data/db/migrate/20151110204826_add_terra_pop_build_number_to_extract_request.rb +12 -0
  446. data/db/migrate/20151119213428_create_area_data_raster_variable_mnemonic_lookups.rb +18 -0
  447. data/db/migrate/20151120140757_create_extract_request_area_data_raster_variable_mnemonic_lookups.rb +16 -0
  448. data/db/migrate/20151130212011_add_new_raster_summarization_v7.rb +90 -0
  449. data/lib/tasks/terrapop_models_tasks.rake +4 -0
  450. data/lib/terrapop_models.rb +4 -0
  451. data/lib/terrapop_models/engine.rb +13 -0
  452. data/lib/terrapop_models/version.rb +3 -0
  453. data/test/dummy/README.rdoc +28 -0
  454. data/test/dummy/Rakefile +6 -0
  455. data/test/dummy/app/assets/javascripts/application.js +13 -0
  456. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  457. data/test/dummy/app/controllers/application_controller.rb +5 -0
  458. data/test/dummy/app/helpers/application_helper.rb +2 -0
  459. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  460. data/test/dummy/bin/bundle +3 -0
  461. data/test/dummy/bin/rails +4 -0
  462. data/test/dummy/bin/rake +4 -0
  463. data/test/dummy/config.ru +4 -0
  464. data/test/dummy/config/application.rb +23 -0
  465. data/test/dummy/config/boot.rb +5 -0
  466. data/test/dummy/config/database.yml +68 -0
  467. data/test/dummy/config/environment.rb +5 -0
  468. data/test/dummy/config/environments/development.rb +37 -0
  469. data/test/dummy/config/environments/production.rb +78 -0
  470. data/test/dummy/config/environments/test.rb +39 -0
  471. data/test/dummy/config/initializers/assets.rb +8 -0
  472. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  473. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  474. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  475. data/test/dummy/config/initializers/inflections.rb +16 -0
  476. data/test/dummy/config/initializers/mime_types.rb +4 -0
  477. data/test/dummy/config/initializers/session_store.rb +3 -0
  478. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  479. data/test/dummy/config/locales/en.yml +23 -0
  480. data/test/dummy/config/routes.rb +4 -0
  481. data/test/dummy/config/secrets.yml +22 -0
  482. data/test/dummy/log/development.log +62 -0
  483. data/test/dummy/public/404.html +67 -0
  484. data/test/dummy/public/422.html +67 -0
  485. data/test/dummy/public/500.html +66 -0
  486. data/test/dummy/public/favicon.ico +0 -0
  487. data/test/integration/navigation_test.rb +10 -0
  488. data/test/terrapop_models_test.rb +7 -0
  489. data/test/test_helper.rb +19 -0
  490. metadata +597 -0
@@ -0,0 +1,7 @@
1
+ require 'nhgis_database'
2
+ module Nhgis
3
+ class TimeSeriesTableTimeSeriesRelease < NhgisActiveRecord::Base
4
+ self.table_name = "time_series_tables_x_time_series_releases"
5
+
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ require 'nhgis_database'
2
+ module Nhgis
3
+ class TimeSeriesTableTopic < NhgisActiveRecord::Base
4
+ self.table_name = "topics_x_time_series_tables"
5
+
6
+ belongs_to :time_series_table
7
+ belongs_to :topic
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'nhgis_database'
2
+ module Nhgis
3
+ class TimeSeriesTableXTimeSeries < NhgisActiveRecord::Base
4
+ self.table_name = "time_series_tables_x_time_series"
5
+
6
+ belongs_to :time_series_table
7
+ belongs_to :time_series
8
+ end
9
+ end
@@ -0,0 +1,2 @@
1
+ class NhgisMetadataStore < ActiveRecord::Base
2
+ end
@@ -0,0 +1,5 @@
1
+ class Raster < ActiveRecord::Base
2
+
3
+ belongs_to :raster_variable
4
+
5
+ end
@@ -0,0 +1,6 @@
1
+ class RasterCategory < ActiveRecord::Base
2
+
3
+ belongs_to :raster_variable
4
+ has_many :raster_category_statistics
5
+
6
+ end
@@ -0,0 +1,7 @@
1
+ class RasterCategoryStatistic < ActiveRecord::Base
2
+
3
+ belongs_to :geog_instance
4
+ belongs_to :raster_variable
5
+ belongs_to :raster_category
6
+
7
+ end
@@ -0,0 +1,6 @@
1
+ class RasterDataType < ActiveRecord::Base
2
+ has_many :raster_variables
3
+ has_many :raster_operations
4
+ has_many :raster_dataset_raster_data_types
5
+ has_many :raster_datasets, :through => :raster_dataset_raster_data_types
6
+ end
@@ -0,0 +1,130 @@
1
+ class RasterDataset < ActiveRecord::Base
2
+
3
+ has_many :raster_dataset_raster_variables
4
+ has_many :raster_variables, through: :raster_dataset_raster_variables
5
+ has_many :raster_dataset_raster_data_types
6
+ has_many :raster_dataset_raster_dataset_units
7
+ has_many :raster_data_types, through: :raster_dataset_raster_data_types
8
+ has_many :raster_dataset_units, through: :raster_dataset_raster_dataset_units
9
+ has_many :map_unit_raster_datasets
10
+ has_many :map_units, through: :map_unit_raster_datasets
11
+
12
+ belongs_to :raster_dataset_group
13
+ belongs_to :resolution
14
+
15
+
16
+ def api_attributes
17
+ "TODO"
18
+ end
19
+
20
+
21
+ def formatted_north_extent
22
+ north_extent.nil? ? 'N/A' : sprintf("%.2f", north_extent)
23
+ end
24
+
25
+
26
+ def formatted_south_extent
27
+ south_extent.nil? ? 'N/A' : sprintf("%.2f", south_extent)
28
+ end
29
+
30
+
31
+ def formatted_east_extent
32
+ east_extent.nil? ? 'N/A' : sprintf("%.2f", east_extent)
33
+ end
34
+
35
+
36
+ def formatted_west_extent
37
+ west_extent.nil? ? 'N/A' : sprintf("%.2f", west_extent)
38
+ end
39
+
40
+
41
+ def map_unit
42
+ map_units.first.nil? ? 'Unknown Units' : map_units.first.unit_long
43
+ end
44
+
45
+
46
+ def raster_variable_mnemonics
47
+ raster_variables.pluck(:mnemonic)
48
+ end
49
+
50
+
51
+ def self.long_description(raster_datasets)
52
+ if raster_datasets.count > 0
53
+ datasets = {}
54
+ str = []
55
+ raster_datasets.each do |rd|
56
+ ld = rd.long_description
57
+ datasets[ld[:label]] = [] unless datasets.has_key? ld[:label]
58
+ datasets[ld[:label]] << ld[:years]
59
+ end
60
+ datasets.each{ |label, years| str << label + "\t" + years.join(", ") }
61
+ str.join("\n")
62
+ else
63
+ "No Raster Datasets"
64
+ end
65
+ end
66
+
67
+
68
+ def long_description
69
+ years = if begin_year == end_year
70
+ begin_year.to_s
71
+ else
72
+ begin_year.to_s + "-" + end_year.to_s
73
+ end
74
+
75
+ unless raster_dataset_group.nil?
76
+ {label: raster_dataset_group.label, years: years}
77
+ else
78
+ {label: "*** Dataset Group Unavailable ***", years: years}
79
+ end
80
+
81
+ end
82
+
83
+ def self.long_citation(raster_datasets)
84
+
85
+ if raster_datasets.count > 0
86
+ groups = {}
87
+ str = []
88
+ raster_datasets.each do |rd|
89
+ unless rd.raster_dataset_group.nil?
90
+ unless groups.has_key? rd.raster_dataset_group.label
91
+ groups[rd.raster_dataset_group.label] = {citation: "<citation for #{rd.raster_dataset_group.label}>. Source data downloaded from <URL> on <date>.", time_points: {}}
92
+ end
93
+
94
+ years = if rd.begin_year == rd.end_year
95
+ rd.begin_year.to_s
96
+ else
97
+ rd.begin_year.to_s + "-" + rd.end_year.to_s
98
+ end
99
+
100
+ years = years.to_s
101
+
102
+ unless groups[rd.raster_dataset_group.label][:time_points].has_key? years
103
+ groups[rd.raster_dataset_group.label][:time_points][years] = rd.period
104
+ end
105
+
106
+ end
107
+ end
108
+
109
+ groups.each do |label,info|
110
+ str << label
111
+ str << info[:citation]
112
+
113
+ if info[:time_points].count > 1
114
+ s = "Time points:"
115
+ else
116
+ s = "Time point:"
117
+ end
118
+
119
+ str << s + " " + info[:time_points].keys.join(", ") + "; " + info[:time_points].values.first
120
+
121
+ end
122
+
123
+ str.join("\n")
124
+ else
125
+ ""
126
+ end
127
+
128
+ end
129
+
130
+ end
@@ -0,0 +1,3 @@
1
+ class RasterDatasetGroup < ActiveRecord::Base
2
+ has_many :raster_datasets
3
+ end
@@ -0,0 +1,4 @@
1
+ class RasterDatasetRasterDataType < ActiveRecord::Base
2
+ belongs_to :raster_dataset
3
+ belongs_to :raster_data_type
4
+ end
@@ -0,0 +1,4 @@
1
+ class RasterDatasetRasterDatasetUnit < ActiveRecord::Base
2
+ belongs_to :raster_dataset
3
+ belongs_to :raster_dataset_unit
4
+ end
@@ -0,0 +1,4 @@
1
+ class RasterDatasetRasterVariable < ActiveRecord::Base
2
+ belongs_to :raster_dataset
3
+ belongs_to :raster_variable
4
+ end
@@ -0,0 +1,4 @@
1
+ class RasterDatasetUnit < ActiveRecord::Base
2
+ has_many :raster_dataset_raster_dataset_units
3
+ has_many :raster_datasets, :through => :raster_dataset_raster_dataset_units
4
+ end
@@ -0,0 +1,87 @@
1
+ class RasterGroup < ActiveRecord::Base
2
+ include ApiUtility
3
+ belongs_to :parent, class_name: "RasterGroup", foreign_key: "parent_id"
4
+
5
+ has_many :children, class_name: "RasterGroup", foreign_key: "parent_id"
6
+ has_many :raster_variable_group_memberships
7
+ has_many :raster_variables, through: :raster_variable_group_memberships
8
+
9
+ has_and_belongs_to_many :tags, join_table: :raster_groups_tags
10
+
11
+ def parent_mnemonic
12
+ parent.mnemonic
13
+ end
14
+
15
+ def sorted_children
16
+ sort_operation == 'name' ? children.order(:name) : children
17
+ end
18
+
19
+
20
+ def self.sort_collection(rg_id, collection)
21
+ raster_group = RasterGroup.where(id: rg_id).first
22
+ return collection if raster_group.nil? || !raster_group.respond_to?('sort_operation')
23
+ case raster_group.sort_operation
24
+ when 'mnemonic'
25
+ collection.order(:mnemonic)
26
+ when 'label'
27
+ collection.order(:label)
28
+ when 'mnemonic_month'
29
+ sort_by_mnemonic_month(collection)
30
+ else
31
+ collection
32
+ end
33
+ end
34
+
35
+
36
+ def sorted_variables
37
+ case sort_operation
38
+ when 'mnemonic'
39
+ raster_variables.order(:mnemonic)
40
+ when 'label'
41
+ raster_variables.order(:label)
42
+ when 'mnemonic_month'
43
+ sort_by_mnemonic_month(raster_variables)
44
+ when 'alphabetical_weight'
45
+ raster_variables.sort_by{ |e| [e.sort_weight, e.label] }
46
+ else
47
+ raster_variables
48
+ end
49
+ end
50
+
51
+ def table_type
52
+ self.class.to_s
53
+ end
54
+
55
+ def child_count
56
+ raster_variables.count
57
+ end
58
+
59
+ def in_cart_count(mnemonics)
60
+ raster_variables.where(mnemonic: mnemonics).count
61
+ end
62
+
63
+ def raster_datasets_count
64
+ nil
65
+ end
66
+
67
+ def _raster_dataset_id_
68
+ nil
69
+ end
70
+
71
+ def description
72
+ name
73
+ end
74
+
75
+ def begin_year
76
+ nil
77
+ end
78
+
79
+ def end_year
80
+ nil
81
+ end
82
+
83
+ def raster_data_type_id
84
+ nil
85
+ end
86
+
87
+ end
@@ -0,0 +1,6 @@
1
+ class RasterMetadata < ActiveRecord::Base
2
+ # Raster Metadata holds the original XML metadata output by ArcGIS for the raster files.
3
+
4
+ belongs_to :raster_variable
5
+
6
+ end
@@ -0,0 +1,10 @@
1
+ class RasterOperation < ActiveRecord::Base
2
+
3
+ belongs_to :raster_data_type
4
+
5
+ belongs_to :parent, :class_name => "RasterOperation", :foreign_key => "parent_id"
6
+ has_many :children, :class_name => "RasterOperation", :foreign_key => "parent_id"
7
+
8
+ alias_attribute :data_type_id, :raster_data_type_id
9
+
10
+ end
@@ -0,0 +1,2 @@
1
+ class RasterRasterVariable < ActiveRecord::Base
2
+ end
@@ -0,0 +1,6 @@
1
+ class RasterStatistic < ActiveRecord::Base
2
+
3
+ belongs_to :geog_instance
4
+ belongs_to :raster_variable
5
+
6
+ end
@@ -0,0 +1,83 @@
1
+ # == RasterValue
2
+ # provides a non-ActiveRecord-based class to hold the results of a call
3
+ # to the terrapop_raster_summary() stored proc.
4
+ #
5
+ # Code based on http://asciicasts.com/episodes/219-active-model
6
+ # and http://www.deploymentzone.com/2012/04/09/postgres-table-value-functions-and-rails-3/
7
+
8
+ class RasterValue
9
+ include ActiveModel::Validations # these might not be necessary.
10
+ include ActiveModel::Conversion
11
+ extend ActiveModel::Naming
12
+
13
+ attr_reader :sample_geog_level_id, :raster_variable_id, :geog_instance_id, :raster_operation_name
14
+ attr_reader :raster_mnemonic, :boundary_area, :summary_value, :geog_instance
15
+
16
+ def initialize(r)
17
+
18
+ @sample_geog_level_id = r.sample_geog_level_id
19
+ @raster_variable_id = r.raster_variable_id
20
+ @raster_operation_name = r.raster_operation_name
21
+ @geog_instance_id = r.geog_instance_id
22
+ @internal_geog_instance_label = r.geog_instance_label
23
+ @internal_geog_instance_code = r.geog_instance_code
24
+ @raster_mnemonic = r.raster_mnemonic
25
+ @boundary_area = r.has_area_reference ? r.raster_area : r.boundary_area
26
+ @summary_value = r.summary_value
27
+ @geog_instance = r.geog_instance
28
+ @raster_band_idx = r.band_index
29
+ @raster_dataset = RasterDataset.find(r.raster_dataset_id)
30
+
31
+ if @geog_instance.nil?
32
+ raise "Must supply a geog_instance when creating a RasterValue"
33
+ end
34
+ end
35
+
36
+ def persisted?
37
+ false
38
+ end
39
+
40
+ def value
41
+ @summary_value
42
+ end
43
+
44
+ def geog_instance_code
45
+ geog_instance.code
46
+ end
47
+
48
+ def geog_instance_label
49
+ geog_instance.label
50
+ end
51
+
52
+ def geog_instance_id
53
+ geog_instance.id
54
+ end
55
+
56
+ def construct_synthetic_mnemonic
57
+ #sample_geog_level = SampleGeogLevel.find(sample_geog_level_id)
58
+ #geog_level_name = ""
59
+
60
+ #unless sample_geog_level.geolink_variable.nil?
61
+ # geog_level_name = sample_geog_level.geolink_variable.mnemonic
62
+ #else
63
+ # geog_level_name = sample_geog_level.country_level.country.short_name.upcase + "_" + sample_geog_level.country_level.geog_unit.code
64
+ #end
65
+
66
+ #"#{@raster_mnemonic}_#{geog_level_name}"
67
+ @raster_mnemonic
68
+ end
69
+
70
+ def mnemonic
71
+ @raster_mnemonic
72
+ end
73
+
74
+ def mnemonic_sym
75
+ @raster_mnemonic.to_sym
76
+ end
77
+
78
+ def to_s
79
+ value.nil? ? "<not set>" : @raster_mnemonic + ": #{value}"
80
+ end
81
+
82
+
83
+ end
@@ -0,0 +1,440 @@
1
+ class RasterVariable < ActiveRecord::Base
2
+
3
+ has_one :raster_metadata, dependent: :destroy
4
+
5
+ has_many :raster_variable_group_memberships
6
+ has_many :raster_groups, through: :raster_variable_group_memberships
7
+ has_many :raster_dataset_raster_variables
8
+ has_many :raster_datasets, through: :raster_dataset_raster_variables
9
+ has_many :area_data_rasters
10
+ has_many :raster_categories
11
+ has_many :raster_statistics
12
+ has_many :raster_category_statistics
13
+ has_many :assoc_raster_variables, class_name: "RasterVariable", foreign_key: "area_reference_id"
14
+ has_many :second_assoc_raster_variables, class_name: "RasterVariable", foreign_key: "second_area_reference_id"
15
+ has_many :raster_variable_classifications
16
+ has_many :mosaic_raster_variables, through: :raster_variable_classifications
17
+
18
+ has_and_belongs_to_many :topics
19
+
20
+ belongs_to :raster_data_type
21
+ belongs_to :raster_group
22
+ belongs_to :area_reference, class_name: "RasterVariable", foreign_key: "area_reference_id"
23
+ belongs_to :second_area_reference, class_name: "RasterVariable", foreign_key: "second_area_reference_id"
24
+
25
+
26
+ def api_attributes
27
+ "TODO"
28
+ end
29
+
30
+
31
+ def availability_by_country
32
+ _availability_by_country = {}
33
+ TerrapopSample.select('DISTINCT countries.full_name', :year).joins(:country).where.not(year: nil).order('countries.full_name', :year).each do |terrapop_sample|
34
+ _availability_by_country[terrapop_sample.full_name] ||= []
35
+ _availability_by_country[terrapop_sample.full_name] << terrapop_sample.year
36
+ end
37
+ _availability_by_country
38
+ end
39
+
40
+
41
+ def table_type
42
+ self.class.to_s
43
+ end
44
+
45
+
46
+ def child_count
47
+ 1
48
+ end
49
+
50
+
51
+ def in_cart_count(mnemonics)
52
+ 0
53
+ end
54
+
55
+
56
+ def raster_datasets_count
57
+ raster_datasets.count
58
+ end
59
+
60
+
61
+ def _raster_dataset_id_
62
+ raster_datasets.count > 0 ? raster_datasets.first.id : nil
63
+ end
64
+
65
+
66
+ def _raster_dataset_ids
67
+ raster_dataset_ids
68
+ end
69
+
70
+
71
+ def raster_dataset_mnemonics
72
+ raster_datasets.pluck(:mnemonic)
73
+ end
74
+
75
+
76
+ def raster_group_mnemonic
77
+ raster_groups.pluck(:mnemonic).first
78
+ end
79
+
80
+
81
+ def build_raster_value_from_row(r) #, geog_instance)
82
+ raise "Cannot build raster values without geog_instance, but it is nil." if r.geog_instance.nil?
83
+ #result = RasterValue.new(r['sample_geog_level_id'],
84
+ # r['raster_variable_id'], r['raster_operation_name'],
85
+ # r['geog_instance_id'], r['geog_instance_label'], r['geog_instance_code'],
86
+ # r['raster_mnemonic'], r['raster_area'],
87
+ # r['summary_value'], geog_instance)
88
+ #trsc.sample_geog_level_id = r['sample_geog_level_id'].to_i
89
+ #trsc.raster_variable_id = r['raster_variable_id'].to_i
90
+ #trsc.raster_operation_name = r['raster_operation_name']
91
+ #trsc.geog_instance_id = r['geog_instance_id'].to_i
92
+ #trsc.geog_instance_label = r['geog_instance_label']
93
+ #trsc.geog_instance_code = r['geog_instance_code'].to_f
94
+ #trsc.raster_mnemonic = r['raster_mnemonic']
95
+ #trsc.boundary_area = r['boundary_area'].to_f
96
+ #trsc.raster_area = r['raster_area'].to_f
97
+ #trsc.summary_value = r['summary_value'].to_f
98
+ #trsc.has_area_reference = has_area_reference
99
+ result = RasterValue.new(r)
100
+ end
101
+
102
+
103
+ def setup_raster_metadata(xml)
104
+ if self.raster_metadata
105
+ self.raster_metadata.original_metadata = xml
106
+ else
107
+ self.build_raster_metadata(original_metadata: xml)
108
+ end
109
+ raster_metadata.save
110
+ end
111
+
112
+
113
+ def build_raster_values(level, raster_operation, raster_dataset)
114
+ # We'll also want to get the geog_instances for the results, so get those first,
115
+ # and put them in a hash so we can quickly find them later.
116
+ result_geog_instances = level.geog_instances
117
+ operation = raster_operation.opcode
118
+
119
+ raise "The level #{level.to_s} must have at least one geog_instance." if result_geog_instances.empty?
120
+
121
+ geog_instance_lookup = Hash.new
122
+ result_geog_instances.each{ |e| geog_instance_lookup[e.id] = e }
123
+
124
+ unless raster_datasets.include? raster_dataset
125
+ $stderr.puts "**** Ignoring out-of-universe RasterDataset[#{raster_dataset.inspect}] for RasterVariable[#{mnemonic}] ****"
126
+ return []
127
+ end
128
+
129
+ # call select * from terrapop_raster_summary(level.id, this.id, operation);
130
+ # or select (terrapop_raster_summary(level.id, this.id, operation)).*
131
+ # where level is the sample_geog_level.id, this.id is the raster_variable_id of this raster, and operation is one of
132
+ # min, max, mean, sum, count, or mode.
133
+ # Should return collection of results that look something like this:
134
+ #
135
+ # sample_geog_level_id | raster_variable_id | raster_operation_name | geog_instance_label | geog_instance_code | raster_mnemonic | boundary_area | summary_value
136
+ # ---------------------+--------------------+-----------------------+---------------------+--------------------+------------------+------------------+---------------
137
+ # 2 | 333 | max | Rondônia | 11 | coffee_yield_max | 237581357173.494 | 0.8789
138
+ # 2 | 333 | max | Acre | 12 | coffee_yield_max | 152576633081.708 | 0.9766
139
+ # 2 | 333 | max | Amazonas | 13 | coffee_yield_max | 1577624256765.11 | 1.1621
140
+
141
+ #sample_geog_lvl_id bigint, raster_var_id bigint, raster_op_name varchar(32)
142
+
143
+ band = raster_dataset.raster_band_index.to_i
144
+ band = 1 if band <= 0
145
+
146
+ terrapop_raster_summary_caches = TerrapopRasterSummaryCache.where({:sample_geog_level_id => level.id, :raster_variable_id => id, :raster_operation_name => operation, band_index: band})
147
+
148
+ has_area_reference = !area_reference.nil?
149
+
150
+ if terrapop_raster_summary_caches.count == 0
151
+
152
+ stored_proc_call =
153
+ case raster_data_type.code
154
+ when 'binary'
155
+ # RETURNS TABLE(geog_instance_id bigint, geog_instance_label character varying, pixel_count bigint, binary_area double precision, percent_area double precision, total_area double precision)
156
+ "SELECT * FROM terrapop_reclassify_categorical_raster_to_binary_summariz_v4(#{level.id}, #{id}, #{band})"
157
+
158
+ when 'categorical'
159
+ # RETURNS TABLE(geog_instance_id bigint, geog_instance_label character varying, num_class bigint, mod_class double precision, total_area double precision)
160
+ "SELECT * FROM terrapop_categorical_raster_v1( #{level.id}, #{id}, #{band} )"
161
+
162
+ when 'contin'
163
+ raise "AreaReference nil: '#{mnemonic}' - should not be nil" if area_reference.nil?
164
+
165
+ # RETURNS TABLE (geog_instance_id bigint, geog_instance_label character varying, min double precision, max double precision, mean double precision, count bigint, stddev double precision, total_area double precision)
166
+
167
+ "SELECT * FROM terrapop_continuous_summarization0(#{level.id}, #{id})"
168
+
169
+ when 'cont_ext_arearef'
170
+
171
+ # RETURNS TABLE (geog_instance_id bigint, geog_instance_label character varying, count bigint, total_area double precision, mean double precision, stddev double precision, min double precision, max double precision)
172
+
173
+ "SELECT * FROM terrapop_continuous_summarization_without_arearef(#{level.id}, #{id}, #{band})"
174
+
175
+ else
176
+ raise "Raster without area_reference has been detected: RasterVariable[#{id}]" unless has_area_reference
177
+
178
+ if mnemonic.match(/YLD$/)
179
+ # RETURNS TABLE (geog_instance_id bigint, geog_instance_label character varying, min double precision, max double precision, mean double precision, count bigint)
180
+ "SELECT * FROM terrapop_gli_yield_areal_summarization_v2(#{level.id}, #{id})"
181
+ elsif mnemonic.match(/HAR$/)
182
+ # RETURNS TABLE (geog_instance_id bigint, geog_instance_label character varying, percent_area double precision, harvest_area double precision)
183
+ "SELECT * FROM terrapop_gli_harvest_areal_summarization_v2(#{level.id}, #{id})"
184
+ else
185
+ # RETURNS TABLE(geog_instance_id bigint, geog_instance_label character varying, binary_area double precision, total_area double precision, percent_area double precision)
186
+ "SELECT * FROM terrapop_glc_binary_summarization_v7(#{level.id}, #{id})"
187
+ end
188
+ end
189
+
190
+ $stderr.puts "===[RASTERVARIABLE INFO] ===> #{mnemonic} | #{level.internal_code} [#{level.id}] | operation: #{operation} | band: #{band}"
191
+ $stderr.puts "===[RASTER SUMMARIZATION QUERY]===> #{stored_proc_call}"
192
+
193
+ result = ActiveRecord::Base.connection.execute(stored_proc_call)
194
+
195
+ all_columns = ['min', 'max', 'mean', 'count', 'num_class', 'mod_class', 'binary_area', 'percent_area', 'total_area', 'harvest_area']
196
+
197
+ if result.count > 0
198
+ terrapop_raster_summary_caches = []
199
+
200
+ seen = false
201
+
202
+ result.each do |r|
203
+
204
+ geog_instance_id =
205
+ if r.has_key? 'geog_instance_id'
206
+ r['geog_instance_id']
207
+ elsif r.has_key? 'geog_instance'
208
+ r['geog_instance']
209
+ else
210
+ -1
211
+ end
212
+
213
+ column_overlap = all_columns & r.keys
214
+ columns_n_operations = {}
215
+
216
+ # this is some fanciness of taking an array of hashes and squashing it down to just a hash; originally, each array element is just a single key/value pair
217
+ column_overlap = column_overlap.map{|field| {field => get_operation(field)}}.reduce Hash.new, :merge
218
+
219
+ unless seen
220
+ $stderr.puts "==[COLUMNs, OPs, BAND] => [#{column_overlap.inspect}, '#{band}']=="
221
+ seen = true
222
+ end
223
+
224
+ column_overlap.each do |column, op|
225
+
226
+ unless op.nil?
227
+
228
+ cnt = TerrapopRasterSummaryCache.where(raster_dataset_id: raster_dataset.id, geog_instance_id: geog_instance_id.to_i, sample_geog_level_id: level.id, raster_variable_id: id, raster_operation_name: op, band_index: band).count
229
+
230
+ if cnt == 0
231
+
232
+ trsc = TerrapopRasterSummaryCache.new
233
+
234
+ val = get_value(r, op).to_f
235
+
236
+ if op.match(/percent/)
237
+ val *= 100
238
+ end
239
+
240
+ trsc.sample_geog_level_id = (r.has_key?('sample_geog_level_id') ? r['sample_geog_level_id'].to_i : level.id)
241
+ trsc.raster_variable_id = id
242
+ trsc.raster_operation_name = (r.has_key?('raster_operation_name') ? r['raster_operation_name'] : op)
243
+ trsc.geog_instance_id = geog_instance_id
244
+ trsc.geog_instance_label = r['geog_instance_label']
245
+ trsc.geog_instance_code = (r.has_key?('geog_instance_code') ? r['geog_instance_code'].to_f : -1.0)
246
+ trsc.raster_mnemonic = RequestRasterVariable.mnemonic(self, raster_operation, raster_dataset, level) #mnemonic + "_" + op + "_" + band.to_s
247
+ trsc.boundary_area = (r.has_key?('boundary_area') ? r['boundary_area'].to_f : -1.0)
248
+ trsc.raster_area = (r.has_key?('raster_area') ? r['raster_area'].to_f : (r.has_key?('total_area') ? r['total_area'].to_f : -1.0))
249
+ trsc.summary_value = val
250
+ trsc.has_area_reference = has_area_reference
251
+ trsc.band_index = band
252
+ trsc.raster_dataset_id = raster_dataset.id
253
+
254
+ trsc.save
255
+
256
+ end
257
+ else
258
+ $stderr.puts "**** get_operation('#{column}'), raster_data_type.code[#{raster_data_type.code}] passed thru without operation and returned nil; result had the fields: #{r.keys.join(", ")} ****"
259
+ end
260
+ end
261
+
262
+ end
263
+
264
+ ### UNCOMMENT WHEN RE-ENABLING CACHING
265
+ terrapop_raster_summary_caches = TerrapopRasterSummaryCache.where(raster_dataset_id: raster_dataset.id, sample_geog_level_id: level.id, raster_variable_id: id, raster_operation_name: operation, band_index: band)
266
+ end
267
+ end
268
+
269
+ output = terrapop_raster_summary_caches.map do |r|
270
+ # build_raster_value_from_row(r, geog_instance_lookup[r.geog_instance_id.to_i])
271
+ # build_raster_value_from_row(r)
272
+ RasterValue.new(r)
273
+ end
274
+ output
275
+ end
276
+
277
+
278
+ def get_operation(column_name)
279
+ case column_name
280
+ when 'mod_class'
281
+ 'mode'
282
+ when 'num_class'
283
+ 'num_classes'
284
+ when 'min'
285
+ 'min'
286
+ when 'max'
287
+ 'max'
288
+ when 'mean'
289
+ 'mean'
290
+ when 'count'
291
+ 'count'
292
+ when 'binary_area'
293
+ 'binary_area'
294
+ when 'total_area'
295
+ if raster_data_type.code == 'cont_ext_arearef'
296
+ 'total_area_ref'
297
+ elsif raster_data_type.code == 'binary'
298
+ 'total_area_bin'
299
+ elsif raster_data_type.code == 'cont_ext_areaprop' or raster_data_type.code == 'contin'
300
+ 'total_area_areal'
301
+ end
302
+ when 'harvest_area'
303
+ 'total_area_areal'
304
+ when 'percent_area'
305
+ if raster_data_type.code == 'binary'
306
+ 'percent_area_bin'
307
+ elsif raster_data_type.code == 'cont_ext_areaprop'
308
+ 'percent_area_areal'
309
+ end
310
+ else
311
+ raise "ERR: unable to find operation for '#{column_name}'"
312
+ end
313
+ end
314
+
315
+
316
+ def get_value(raster_summary_row, operation)
317
+ # min double precision, max double precision, mean double precision, count double precision,stddev double precision, total_area double precision
318
+ case operation
319
+ when 'mode'
320
+ raster_summary_row['mod_class']
321
+ when 'num_classes'
322
+ raster_summary_row['num_class']
323
+ when 'min'
324
+ raster_summary_row['min']
325
+ when 'max'
326
+ raster_summary_row['max']
327
+ when 'mean'
328
+ raster_summary_row['mean']
329
+ when 'count'
330
+ raster_summary_row['count']
331
+ when 'total_area_areal'
332
+ if raster_summary_row.has_key? 'binary_area'
333
+ raster_summary_row['binary_area']
334
+ elsif raster_summary_row.has_key? 'total_area'
335
+ raster_summary_row['total_area']
336
+ elsif raster_summary_row.has_key? 'harvest_area'
337
+ raster_summary_row['harvest_area']
338
+ end
339
+ when 'total_area_ref'
340
+ raster_summary_row['total_area']
341
+ when 'total_area'
342
+ if raster_summary_row.has_key? 'total_area'
343
+ raster_summary_row['total_area']
344
+ elsif raster_summary_row.has_key? 'harvest_area'
345
+ raster_summary_row['harvest_area']
346
+ end
347
+ when 'percent_area_bin'
348
+ if raster_summary_row.has_key? 'percent_area'
349
+ raster_summary_row['percent_area']
350
+ end
351
+ when 'percent_area_areal'
352
+ if raster_summary_row.has_key? 'percent'
353
+ raster_summary_row['percent']
354
+ elsif raster_summary_row.has_key? 'percent_area'
355
+ raster_summary_row['percent_area']
356
+ end
357
+ when 'percent_area'
358
+ if raster_summary_row.has_key? 'percent'
359
+ raster_summary_row['percent']
360
+ elsif raster_summary_row.has_key? 'percent_area'
361
+ raster_summary_row['percent_area']
362
+ end
363
+ when 'total_area_bin'
364
+ raster_summary_row['binary_area']
365
+ when 'binary_area'
366
+ raster_summary_row['binary_area']
367
+ else
368
+ raise "Unknown/Unsupported raster operation - '#{operation}'"
369
+ end
370
+ end
371
+
372
+
373
+ def get_base_categorical_stats(sample_geog_level)
374
+ sql = "select label, terrapop_sample_id, code, ST_ValueCount(rast) as category_count from (
375
+ select label, code, terrapop_sample_id, st_union(rast) as rast from (
376
+ SELECT sgl.terrapop_sample_id as terrapop_sample_id, gi.label as label, gi.code as code, ST_Clip(them_rasters.rast, bound.geog::geometry) as rast
377
+ FROM sample_geog_levels sgl
378
+ inner join geog_instances gi on sgl.id = gi.sample_geog_level_id
379
+ inner join boundaries bound on bound.geog_instance_id = gi.id
380
+ inner join rasters AS them_rasters on ST_Intersects(them_rasters.rast, bound.geog::geometry)
381
+ where sgl.id = #{sample_geog_level.id} AND them_rasters.raster_variable_id = #{id}
382
+ ) base
383
+ group by label, code, terrapop_sample_id
384
+ ) unioned
385
+ order by code"
386
+ ActiveRecord::Base.connection.execute(sql)
387
+ end
388
+
389
+
390
+ def get_categorical_statistics(sample_geog_level)
391
+ get_base_categorical_stats(sample_geog_level).map{ |result|
392
+ result['category_count'].scan(/\(([0-9]+),([0-9]+)\)/).collect{ |category, count| {category => count} }
393
+ }.flatten.inject(:merge)
394
+ end
395
+
396
+
397
+ def get_statistics(sample_geog_level)
398
+ sample_precision = TerrapopConfiguration["application"]["environments"][Rails.env]["raster_sample_precision"]
399
+ sql = "SELECT label, terrapop_sample_id, code, (statistics).* FROM (
400
+ select label, terrapop_sample_id, code, _ST_SummaryStats(rast, 1, true, #{sample_precision}) as statistics from (
401
+ select label, code, terrapop_sample_id, st_union(rast) as rast from (
402
+ SELECT sgl.terrapop_sample_id as terrapop_sample_id, gi.label as label, gi.code as code, ST_Clip(them_rasters.rast, bound.geog::geometry) as rast
403
+ FROM sample_geog_levels sgl
404
+ inner join geog_instances gi on sgl.id = gi.sample_geog_level_id
405
+ inner join boundaries bound on bound.geog_instance_id = gi.id
406
+ inner join rasters AS them_rasters on ST_Intersects(them_rasters.rast, bound.geog::geometry)
407
+ where sgl.id = 1 AND them_rasters.raster_variable_id = 145
408
+ ) base
409
+ group by label, code, terrapop_sample_id
410
+ ) unioned
411
+ order by code
412
+ ) as block"
413
+ results = ActiveRecord::Base.connection.execute(sql)
414
+ results.first
415
+ end
416
+
417
+
418
+ def reclass_str
419
+ buckets = {}
420
+ self.raster_variable_classifications.each do |rvc|
421
+ buckets[rvc.grouping] ||= []
422
+ buckets[rvc.grouping] << rvc.mosaic_raster_variable
423
+ end
424
+ buckets
425
+ end
426
+
427
+
428
+ def self.long_description(raster_variables)
429
+ str = []
430
+ raster_variables.each{ |rv| str << rv.long_description }
431
+ str.join("\n")
432
+ end
433
+
434
+
435
+ def long_description
436
+ mnemonic + "\t" + label + "\t(" + units.to_s + ")\t" + raster_datasets.first.raster_dataset_group.label
437
+ end
438
+
439
+
440
+ end