geo_concerns 0.0.1

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 (220) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rubocop.yml +101 -0
  4. data/.travis.yml +17 -0
  5. data/Gemfile +46 -0
  6. data/LICENSE +202 -0
  7. data/README.md +46 -0
  8. data/Rakefile +21 -0
  9. data/app/actors/geo_concerns/file_actor.rb +20 -0
  10. data/app/actors/geo_concerns/file_set_actor.rb +7 -0
  11. data/app/assets/images/geo_concerns/.keep +0 -0
  12. data/app/assets/images/geo_concerns/images/geocoder.png +0 -0
  13. data/app/assets/images/geo_concerns/images/throbber.gif +0 -0
  14. data/app/assets/images/geo_concerns/img/filter-icon.png +0 -0
  15. data/app/assets/images/geo_concerns/img/move-handle.png +0 -0
  16. data/app/assets/images/geo_concerns/img/resize-handle.png +0 -0
  17. data/app/assets/javascripts/geo_concerns/Control.Geocoder.js +1056 -0
  18. data/app/assets/javascripts/geo_concerns/application.js +5 -0
  19. data/app/assets/javascripts/geo_concerns/bounding_box_selector.js +100 -0
  20. data/app/assets/javascripts/geo_concerns/leaflet-boundingbox.js +467 -0
  21. data/app/assets/stylesheets/geo_concerns/Control.Geocoder.css +104 -0
  22. data/app/assets/stylesheets/geo_concerns/application.css +18 -0
  23. data/app/assets/stylesheets/geo_concerns/bounding_box.scss +7 -0
  24. data/app/assets/stylesheets/geo_concerns/leaflet-boundingbox.css +17 -0
  25. data/app/controllers/concerns/geo_concerns/file_sets_controller_behavior.rb +19 -0
  26. data/app/controllers/concerns/geo_concerns/image_works_controller_behavior.rb +13 -0
  27. data/app/controllers/concerns/geo_concerns/raster_works_controller_behavior.rb +23 -0
  28. data/app/controllers/concerns/geo_concerns/vector_works_controller_behavior.rb +23 -0
  29. data/app/forms/geo_concerns/basic_geo_metadata_form.rb +8 -0
  30. data/app/forms/geo_concerns/external_metadata_file_form.rb +8 -0
  31. data/app/forms/geo_concerns/georeferenced_form.rb +9 -0
  32. data/app/forms/geo_concerns/image_work_form.rb +9 -0
  33. data/app/forms/geo_concerns/raster_work_form.rb +8 -0
  34. data/app/forms/geo_concerns/vector_work_form.rb +8 -0
  35. data/app/helpers/bounding_box_helper.rb +24 -0
  36. data/app/helpers/geo_concerns/application_helper.rb +4 -0
  37. data/app/models/concerns/geo_concerns/basic_geo_metadata.rb +21 -0
  38. data/app/models/concerns/geo_concerns/external_metadata_file_behavior.rb +31 -0
  39. data/app/models/concerns/geo_concerns/extractors/fgdc_helper.rb +9 -0
  40. data/app/models/concerns/geo_concerns/extractors/fgdc_metadata_extractor.rb +114 -0
  41. data/app/models/concerns/geo_concerns/extractors/iso19139_helper.rb +50 -0
  42. data/app/models/concerns/geo_concerns/extractors/mods_helper.rb +15 -0
  43. data/app/models/concerns/geo_concerns/file_set/derivatives.rb +60 -0
  44. data/app/models/concerns/geo_concerns/file_set_presenter_behavior.rb +7 -0
  45. data/app/models/concerns/geo_concerns/geo_file_format_behavior.rb +37 -0
  46. data/app/models/concerns/geo_concerns/geo_file_set_behavior.rb +11 -0
  47. data/app/models/concerns/geo_concerns/georeferenced_behavior.rb +18 -0
  48. data/app/models/concerns/geo_concerns/image_file_behavior.rb +14 -0
  49. data/app/models/concerns/geo_concerns/image_work_behavior.rb +69 -0
  50. data/app/models/concerns/geo_concerns/metadata_extraction_helper.rb +28 -0
  51. data/app/models/concerns/geo_concerns/raster_file_behavior.rb +14 -0
  52. data/app/models/concerns/geo_concerns/raster_work_behavior.rb +82 -0
  53. data/app/models/concerns/geo_concerns/solr_document_behavior.rb +25 -0
  54. data/app/models/concerns/geo_concerns/vector_file_behavior.rb +14 -0
  55. data/app/models/concerns/geo_concerns/vector_work_behavior.rb +78 -0
  56. data/app/presenters/geo_concerns/geo_concerns_show_presenter.rb +30 -0
  57. data/app/presenters/geo_concerns/image_work_show_presenter.rb +18 -0
  58. data/app/presenters/geo_concerns/raster_work_show_presenter.rb +18 -0
  59. data/app/presenters/geo_concerns/vector_work_show_presenter.rb +10 -0
  60. data/app/processors/geo_concerns/processors/base_geo_processor.rb +86 -0
  61. data/app/processors/geo_concerns/processors/raster.rb +11 -0
  62. data/app/processors/geo_concerns/processors/raster/aig.rb +44 -0
  63. data/app/processors/geo_concerns/processors/raster/base.rb +74 -0
  64. data/app/processors/geo_concerns/processors/raster/dem.rb +46 -0
  65. data/app/processors/geo_concerns/processors/raster/processor.rb +27 -0
  66. data/app/processors/geo_concerns/processors/vector.rb +11 -0
  67. data/app/processors/geo_concerns/processors/vector/base.rb +68 -0
  68. data/app/processors/geo_concerns/processors/vector/processor.rb +25 -0
  69. data/app/processors/geo_concerns/processors/vector/shapefile.rb +20 -0
  70. data/app/processors/geo_concerns/processors/zip.rb +31 -0
  71. data/app/renderers/coverage_renderer.rb +34 -0
  72. data/app/runners/geo_concerns/runners/raster_derivatives.rb +9 -0
  73. data/app/runners/geo_concerns/runners/vector_derivatives.rb +9 -0
  74. data/app/schemas/geo_concerns/basic_geo_metadata_optional.rb +39 -0
  75. data/app/schemas/geo_concerns/basic_geo_metadata_required.rb +25 -0
  76. data/app/services/authority_service.rb +23 -0
  77. data/app/services/geo_concerns/derivative_path.rb +16 -0
  78. data/app/services/image_format_service.rb +4 -0
  79. data/app/services/metadata_format_service.rb +4 -0
  80. data/app/services/raster_format_service.rb +4 -0
  81. data/app/services/vector_format_service.rb +4 -0
  82. data/app/values/geo_concerns/coverage.rb +36 -0
  83. data/app/values/geo_concerns/time_period.rb +31 -0
  84. data/app/views/curation_concerns/file_sets/_form.html.erb +48 -0
  85. data/app/views/curation_concerns/image_works/_form.html.erb +23 -0
  86. data/app/views/curation_concerns/image_works/_image_work.html.erb +2 -0
  87. data/app/views/curation_concerns/image_works/_members.html.erb +30 -0
  88. data/app/views/curation_concerns/image_works/_related_image_files.html.erb +24 -0
  89. data/app/views/curation_concerns/image_works/_show_actions.html.erb +16 -0
  90. data/app/views/curation_concerns/image_works/show.html.erb +17 -0
  91. data/app/views/curation_concerns/raster_works/_form.html.erb +25 -0
  92. data/app/views/curation_concerns/raster_works/_members.html.erb +30 -0
  93. data/app/views/curation_concerns/raster_works/_raster_work.html.erb +2 -0
  94. data/app/views/curation_concerns/raster_works/_related_raster_files.html.erb +24 -0
  95. data/app/views/curation_concerns/raster_works/_show_actions.html.erb +16 -0
  96. data/app/views/curation_concerns/raster_works/show.html.erb +17 -0
  97. data/app/views/curation_concerns/vector_works/_form.html.erb +25 -0
  98. data/app/views/curation_concerns/vector_works/_related_vector_files.html.erb +24 -0
  99. data/app/views/curation_concerns/vector_works/_show_actions.html.erb +15 -0
  100. data/app/views/curation_concerns/vector_works/_vector_work.html.erb +2 -0
  101. data/app/views/curation_concerns/vector_works/show.html.erb +15 -0
  102. data/app/views/geo_concerns/_attribute_rows.html.erb +11 -0
  103. data/app/views/geo_concerns/_attributes.html.erb +13 -0
  104. data/app/views/geo_concerns/_form_additional_information.html.erb +11 -0
  105. data/app/views/geo_concerns/_form_bounding_box.html.erb +9 -0
  106. data/app/views/geo_concerns/_form_descriptive_fields.html.erb +9 -0
  107. data/app/views/geo_concerns/_form_files_and_links.html.erb +0 -0
  108. data/app/views/geo_concerns/_form_populate_metadata.html.erb +8 -0
  109. data/app/views/geo_concerns/_form_required_information.html.erb +12 -0
  110. data/app/views/geo_concerns/_form_supplementary_fields.html.erb +15 -0
  111. data/app/views/geo_concerns/_related_external_metadata_files.html.erb +24 -0
  112. data/app/vocabs/geo_concerns/geo_terms.rb +12 -0
  113. data/bin/rails +12 -0
  114. data/config/routes.rb +6 -0
  115. data/geo_concerns.gemspec +36 -0
  116. data/lib/generators/geo_concerns/install_generator.rb +119 -0
  117. data/lib/generators/geo_concerns/templates/actors/curation_concerns/image_work_actor.rb +4 -0
  118. data/lib/generators/geo_concerns/templates/actors/curation_concerns/raster_work_actor.rb +4 -0
  119. data/lib/generators/geo_concerns/templates/actors/curation_concerns/vector_work_actor.rb +4 -0
  120. data/lib/generators/geo_concerns/templates/config/authorities/image_formats.yml +5 -0
  121. data/lib/generators/geo_concerns/templates/config/authorities/metadata_formats.yml +7 -0
  122. data/lib/generators/geo_concerns/templates/config/authorities/raster_formats.yml +9 -0
  123. data/lib/generators/geo_concerns/templates/config/authorities/vector_formats.yml +5 -0
  124. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/file_sets_controller.rb +6 -0
  125. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/image_works_controller.rb +5 -0
  126. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/raster_works_controller.rb +6 -0
  127. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/vector_works_controller.rb +6 -0
  128. data/lib/generators/geo_concerns/templates/geo_concerns.js +1 -0
  129. data/lib/generators/geo_concerns/templates/geo_concerns.scss +3 -0
  130. data/lib/generators/geo_concerns/templates/jobs/characterize_job.rb +12 -0
  131. data/lib/generators/geo_concerns/templates/models/file_set.rb +4 -0
  132. data/lib/generators/geo_concerns/templates/models/image_work.rb +6 -0
  133. data/lib/generators/geo_concerns/templates/models/raster_work.rb +7 -0
  134. data/lib/generators/geo_concerns/templates/models/vector_work.rb +7 -0
  135. data/lib/generators/geo_concerns/templates/presenters/file_set_presenter.rb +3 -0
  136. data/lib/generators/geo_concerns/templates/spec/actor_spec.rb.erb +9 -0
  137. data/lib/generators/geo_concerns/templates/spec/controller_spec.rb.erb +9 -0
  138. data/lib/generators/geo_concerns/templates/spec/model_spec.rb.erb +9 -0
  139. data/lib/geo_concerns.rb +6 -0
  140. data/lib/geo_concerns/engine.rb +4 -0
  141. data/lib/geo_concerns/version.rb +3 -0
  142. data/lib/tasks/geo_concerns_tasks.rake +4 -0
  143. data/solr/config/_rest_managed.json +3 -0
  144. data/solr/config/admin-extra.html +31 -0
  145. data/solr/config/elevate.xml +36 -0
  146. data/solr/config/mapping-ISOLatin1Accent.txt +246 -0
  147. data/solr/config/protwords.txt +21 -0
  148. data/solr/config/schema.xml +372 -0
  149. data/solr/config/scripts.conf +24 -0
  150. data/solr/config/solrconfig.xml +312 -0
  151. data/solr/config/spellings.txt +2 -0
  152. data/solr/config/stopwords.txt +58 -0
  153. data/solr/config/stopwords_en.txt +58 -0
  154. data/solr/config/synonyms.txt +31 -0
  155. data/solr/config/xslt/example.xsl +132 -0
  156. data/solr/config/xslt/example_atom.xsl +67 -0
  157. data/solr/config/xslt/example_rss.xsl +66 -0
  158. data/solr/config/xslt/luke.xsl +337 -0
  159. data/spec/actors/geo_concerns/file_actor_spec.rb +26 -0
  160. data/spec/controllers/image_works_controller_spec.rb +25 -0
  161. data/spec/controllers/raster_works_controller_spec.rb +50 -0
  162. data/spec/controllers/vector_works_controller_spec.rb +50 -0
  163. data/spec/factories/external_metadata_files.rb +20 -0
  164. data/spec/factories/image_files.rb +32 -0
  165. data/spec/factories/image_works.rb +68 -0
  166. data/spec/factories/raster_files.rb +35 -0
  167. data/spec/factories/raster_works.rb +86 -0
  168. data/spec/factories/users.rb +26 -0
  169. data/spec/factories/vector_files.rb +31 -0
  170. data/spec/factories/vector_works.rb +83 -0
  171. data/spec/features/create_raster_work_spec.rb +49 -0
  172. data/spec/forms/geo_concerns/basic_geo_metadata_form_spec.rb +27 -0
  173. data/spec/forms/geo_concerns/external_metadata_file_form_spec.rb +27 -0
  174. data/spec/forms/geo_concerns/georeferenced_form_spec.rb +29 -0
  175. data/spec/forms/geo_concerns/image_work_form_spec.rb +11 -0
  176. data/spec/forms/geo_concerns/raster_work_form_spec.rb +15 -0
  177. data/spec/forms/geo_concerns/vector_work_form_spec.rb +15 -0
  178. data/spec/helpers/bounding_box_helper_spec.rb +34 -0
  179. data/spec/models/concerns/basic_geo_metadata_spec.rb +21 -0
  180. data/spec/models/concerns/geo_concerns/file_set/derivatives_spec.rb +108 -0
  181. data/spec/models/concerns/geo_concerns/file_set/geo_file_format_behavior_spec.rb +56 -0
  182. data/spec/models/external_metadata_file_spec.rb +118 -0
  183. data/spec/models/file_set_spec.rb +9 -0
  184. data/spec/models/image_file_spec.rb +48 -0
  185. data/spec/models/image_work_spec.rb +71 -0
  186. data/spec/models/raster_file_spec.rb +48 -0
  187. data/spec/models/raster_work_spec.rb +122 -0
  188. data/spec/models/solr_document_spec.rb +35 -0
  189. data/spec/models/vector_file_spec.rb +48 -0
  190. data/spec/models/vector_work_spec.rb +113 -0
  191. data/spec/presenters/file_set_presenter_spec.rb +13 -0
  192. data/spec/presenters/geo_concerns_show_presenter_spec.rb +56 -0
  193. data/spec/presenters/image_work_show_presenter_spec.rb +52 -0
  194. data/spec/presenters/raster_work_show_presenter_spec.rb +52 -0
  195. data/spec/presenters/vector_work_show_presenter_spec.rb +41 -0
  196. data/spec/processors/geo_concerns/processors/base_geo_processor_spec.rb +109 -0
  197. data/spec/processors/geo_concerns/processors/raster/aig_spec.rb +28 -0
  198. data/spec/processors/geo_concerns/processors/raster/base_spec.rb +86 -0
  199. data/spec/processors/geo_concerns/processors/raster/dem_spec.rb +26 -0
  200. data/spec/processors/geo_concerns/processors/raster/processor_spec.rb +39 -0
  201. data/spec/processors/geo_concerns/processors/vector/base_spec.rb +67 -0
  202. data/spec/processors/geo_concerns/processors/vector/processor_spec.rb +28 -0
  203. data/spec/processors/geo_concerns/processors/vector/shapefile_spec.rb +17 -0
  204. data/spec/processors/geo_concerns/processors/zip_spec.rb +39 -0
  205. data/spec/renderers/coverage_renderer_spec.rb +21 -0
  206. data/spec/services/derivative_path_spec.rb +12 -0
  207. data/spec/services/raster_format_service_spec.rb +13 -0
  208. data/spec/spec_helper.rb +34 -0
  209. data/spec/support/controllers/engine_helpers.rb +7 -0
  210. data/spec/support/database_cleaner.rb +18 -0
  211. data/spec/support/devise.rb +10 -0
  212. data/spec/support/devise_helpers.rb +6 -0
  213. data/spec/support/factory_girl.rb +3 -0
  214. data/spec/support/features.rb +14 -0
  215. data/spec/support/features/session_helpers.rb +40 -0
  216. data/spec/support/fixture_reader.rb +7 -0
  217. data/spec/test_app_templates/lib/generators/test_app_generator.rb +20 -0
  218. data/spec/values/coverage_spec.rb +40 -0
  219. data/tasks/ci.rake +49 -0
  220. metadata +527 -0
@@ -0,0 +1,104 @@
1
+ .leaflet-control-geocoder {
2
+ background: white;
3
+ }
4
+
5
+ .leaflet-control-geocoder a, .leaflet-control-geocoder .leaflet-control-geocoder-icon {
6
+ border-bottom-left-radius: 4px;
7
+ border-bottom-right-radius: 4px;
8
+ border-bottom: none;
9
+ display: inline-block;
10
+ }
11
+
12
+ .leaflet-control-geocoder .leaflet-control-geocoder-alternatives a {
13
+ width: inherit;
14
+ height: inherit;
15
+ line-height: inherit;
16
+ }
17
+
18
+ .leaflet-control-geocoder a:hover, .leaflet-control-geocoder .leaflet-control-geocoder-icon:hover {
19
+ border-bottom: none;
20
+ display: inline-block;
21
+ }
22
+
23
+ .leaflet-control-geocoder-form {
24
+ display: none;
25
+ vertical-align: middle;
26
+ }
27
+ .leaflet-control-geocoder-expanded .leaflet-control-geocoder-form {
28
+ display: inline-block;
29
+ }
30
+ .leaflet-control-geocoder-form input {
31
+ font-size: 120%;
32
+ border: 0;
33
+ background-color: transparent;
34
+ width: 246px;
35
+ }
36
+ .leaflet-control-geocoder-icon {
37
+ background-image: url(images/geocoder.png);
38
+ background-repeat: no-repeat;
39
+ background-position: center;
40
+ }
41
+ .leaflet-control-geocoder-throbber .leaflet-control-geocoder-icon {
42
+ background-image: url(images/throbber.gif);
43
+ }
44
+
45
+ .leaflet-control-geocoder-form-no-error {
46
+ display: none;
47
+ }
48
+
49
+ .leaflet-control-geocoder-form input:focus {
50
+ outline: none;
51
+ }
52
+
53
+ .leaflet-control-geocoder-form button {
54
+ display: none;
55
+ }
56
+ .leaflet-control-geocoder-error {
57
+ margin-top: 8px;
58
+ margin-left: 8px;
59
+ display: block;
60
+ color: #444;
61
+ }
62
+ .leaflet-control-geocoder-alternatives {
63
+ display: block;
64
+ width: 272px;
65
+ list-style: none;
66
+ padding: 0;
67
+ margin: 0;
68
+ }
69
+
70
+ .leaflet-control-geocoder-alternatives-minimized {
71
+ display: none;
72
+ height: 0;
73
+ }
74
+ .leaflet-control-geocoder-alternatives li {
75
+ white-space: nowrap;
76
+ display: block;
77
+ overflow: hidden;
78
+ padding: 5px 8px;
79
+ text-overflow: ellipsis;
80
+ border-bottom: 1px solid #ccc;
81
+ cursor: pointer;
82
+ }
83
+
84
+ .leaflet-control-geocoder-alternatives li a, .leaflet-control-geocoder-alternatives li a:hover {
85
+ width: inherit;
86
+ height: inherit;
87
+ line-height: inherit;
88
+ background: inherit;
89
+ border-radius: inherit;
90
+ text-align: left;
91
+ }
92
+
93
+ .leaflet-control-geocoder-alternatives li:last-child {
94
+ border-bottom: none;
95
+ }
96
+ .leaflet-control-geocoder-alternatives li:hover, .leaflet-control-geocoder-selected {
97
+ background-color: #f5f5f5;
98
+ }
99
+ .leaflet-control-geocoder-address-detail {
100
+
101
+ }
102
+ .leaflet-control-geocoder-address-context {
103
+ color: #666;
104
+ }
@@ -0,0 +1,18 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require leaflet
14
+ *= require geo_concerns/leaflet-boundingbox
15
+ *= require geo_concerns/Control.Geocoder
16
+ *= require_tree .
17
+ *= require_self
18
+ */
@@ -0,0 +1,7 @@
1
+ #bbox {
2
+ height: 500px;
3
+ }
4
+
5
+ .leaflet-control-attribution {
6
+ display: none;
7
+ }
@@ -0,0 +1,17 @@
1
+ div.leaflet-marker-icon.location-filter.resize-marker {
2
+ background: url( img/resize-handle.png ) no-repeat;
3
+ cursor: move;
4
+ }
5
+ div.leaflet-marker-icon.location-filter.move-marker {
6
+ background: url( img/move-handle.png ) no-repeat;
7
+ cursor: move;
8
+ }
9
+
10
+ div.location-filter.button-container {
11
+ background-color: white;
12
+ }
13
+ .leaflet-container div.location-filter.button-container a {
14
+ color: #6B6B6B;
15
+ font-size: 15px;
16
+ width: 90px;
17
+ }
@@ -0,0 +1,19 @@
1
+ module GeoConcerns
2
+ module FileSetsControllerBehavior
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ self.show_presenter = ::FileSetPresenter
6
+ end
7
+
8
+ # inject mime_type into permitted params
9
+ def file_set_params
10
+ super.tap do |permitted_params|
11
+ permitted_params[:mime_type] = params[:file_set][:mime_type]
12
+ end
13
+ end
14
+
15
+ def actor
16
+ @actor ||= GeoConcerns::FileSetActor.new(@file_set, current_user)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module GeoConcerns
2
+ module ImageWorksControllerBehavior
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ self.show_presenter = GeoConcerns::ImageWorkShowPresenter
7
+ end
8
+
9
+ def form_class
10
+ GeoConcerns::ImageWorkForm
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ module GeoConcerns
2
+ module RasterWorksControllerBehavior
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ self.show_presenter = GeoConcerns::RasterWorkShowPresenter
7
+ end
8
+
9
+ def create
10
+ super
11
+
12
+ return unless parent_id
13
+ parent = ActiveFedora::Base.find(parent_id, cast: true)
14
+ parent.ordered_members << curation_concern.reload
15
+ parent.save
16
+ curation_concern.update_index
17
+ end
18
+
19
+ def form_class
20
+ GeoConcerns::RasterWorkForm
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module GeoConcerns
2
+ module VectorWorksControllerBehavior
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ self.show_presenter = GeoConcerns::VectorWorkShowPresenter
7
+ end
8
+
9
+ def create
10
+ super
11
+
12
+ return unless parent_id
13
+ parent = ActiveFedora::Base.find(parent_id, cast: true)
14
+ parent.ordered_members << curation_concern.reload
15
+ parent.save
16
+ curation_concern.update_index
17
+ end
18
+
19
+ def form_class
20
+ GeoConcerns::VectorWorkForm
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,8 @@
1
+ module GeoConcerns
2
+ module BasicGeoMetadataForm
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ self.terms += [:spatial, :temporal, :coverage, :issued, :provenance]
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module GeoConcerns
2
+ module ExternalMetadataFileForm
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ self.terms += [:should_populate_metadata]
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module GeoConcerns
2
+ module GeoreferencedForm
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ self.terms += [:cartographic_projection]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # Generated via
2
+ # `rails generate curation_concerns:work ImageWork`
3
+ module GeoConcerns
4
+ class ImageWorkForm < CurationConcerns::Forms::WorkForm
5
+ include ::GeoConcerns::BasicGeoMetadataForm
6
+ include ::GeoConcerns::ExternalMetadataFileForm
7
+ self.model_class = ::ImageWork
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ module GeoConcerns
2
+ class RasterWorkForm < CurationConcerns::Forms::WorkForm
3
+ include ::GeoConcerns::BasicGeoMetadataForm
4
+ include ::GeoConcerns::GeoreferencedForm
5
+ include ::GeoConcerns::ExternalMetadataFileForm
6
+ self.model_class = ::RasterWork
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module GeoConcerns
2
+ class VectorWorkForm < CurationConcerns::Forms::WorkForm
3
+ include ::GeoConcerns::BasicGeoMetadataForm
4
+ include ::GeoConcerns::GeoreferencedForm
5
+ include ::GeoConcerns::ExternalMetadataFileForm
6
+ self.model_class = ::VectorWork
7
+ end
8
+ end
@@ -0,0 +1,24 @@
1
+ module BoundingBoxHelper
2
+ ##
3
+ # Builds HTML string for bounding box selector tool.
4
+ # Calls boundingBoxSelector javascript function and
5
+ # passes the id of the location input element that it binds to.
6
+ # @param [Symbol] name of property that holds bounding box string
7
+ # @return[String]
8
+ def bbox(property)
9
+ %(
10
+ <div id='bbox'></div>
11
+ <script>
12
+ boundingBoxSelector({inputId: #{bbox_input_id(property)}});
13
+ </script>
14
+ ).html_safe
15
+ end
16
+
17
+ ##
18
+ # Returns id of location input that is bound to bbox selector.
19
+ # @param [Symbol] name of property that holds bounding box string
20
+ # @return[String] id of location input element
21
+ def bbox_input_id(property)
22
+ "#{curation_concern.class.name.underscore}_#{property}"
23
+ end
24
+ end
@@ -0,0 +1,4 @@
1
+ module GeoConcerns
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,21 @@
1
+ module GeoConcerns
2
+ # Attributes and methods for basic geospatial metadata used by Works
3
+ module BasicGeoMetadata
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ apply_schema ::GeoConcerns::BasicGeoMetadataRequired,
8
+ ActiveFedora::SchemaIndexingStrategy.new(
9
+ ActiveFedora::Indexers::GlobalIndexer.new(
10
+ [:stored_searchable, :facetable, :symbol]
11
+ )
12
+ )
13
+ apply_schema ::GeoConcerns::BasicGeoMetadataOptional,
14
+ ActiveFedora::SchemaIndexingStrategy.new(
15
+ ActiveFedora::Indexers::GlobalIndexer.new(
16
+ [:stored_searchable, :facetable, :symbol]
17
+ )
18
+ )
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ module GeoConcerns
2
+ # Attributes and methods for vector metadata files
3
+ module ExternalMetadataFileBehavior
4
+ extend ActiveSupport::Concern
5
+ include ::GeoConcerns::Extractors::Iso19139Helper
6
+ include ::GeoConcerns::Extractors::FgdcHelper
7
+ include ::GeoConcerns::Extractors::ModsHelper
8
+
9
+ # Extracts properties from the constitutent external metadata file
10
+ # @example
11
+ # extract_iso19139_metadata
12
+ # extract_fgdc_metadata
13
+ # extract_mods_metadata
14
+ # @return [Hash]
15
+ def extract_metadata
16
+ raise ArgumentError, "MIME type unspecified or not configured" if schema.blank?
17
+ fn = "extract_#{schema.downcase}_metadata"
18
+ raise ArgumentError, "Unsupported metadata standard: #{schema}" unless respond_to?(fn.to_sym)
19
+ send(fn, metadata_xml)
20
+ end
21
+
22
+ # Retrives data from PCDM::File
23
+ def metadata_xml
24
+ Nokogiri::XML(original_file.content)
25
+ end
26
+
27
+ def schema
28
+ (MetadataFormatService.label(mime_type) || '').parameterize('_')
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ module GeoConcerns
2
+ module Extractors
3
+ module FgdcHelper
4
+ def extract_fgdc_metadata(doc)
5
+ GeoConcerns::Extractors::FgdcMetadataExtractor.new(doc).to_hash
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,114 @@
1
+ module GeoConcerns
2
+ module Extractors
3
+ class FgdcMetadataExtractor
4
+ attr_reader :doc
5
+ def initialize(doc)
6
+ @doc = doc
7
+ end
8
+
9
+ def to_hash
10
+ metadata_required.merge(metadata_optional)
11
+ end
12
+
13
+ def metadata_required
14
+ {
15
+ coverage: coverage,
16
+ creator: creators,
17
+ description: [doc.at_xpath('//idinfo/descript/abstract').text],
18
+ title: [doc.at_xpath('//idinfo/citation/citeinfo/title').text]
19
+ }.compact
20
+ end
21
+
22
+ def metadata_optional
23
+ {
24
+ issued: issued,
25
+ publisher: publishers,
26
+ spatial: placenames,
27
+ subject: keywords,
28
+ temporal: timeperiods
29
+ }.compact
30
+ end
31
+
32
+ def coverage
33
+ doc.at_xpath('//idinfo/spdom/bounding').tap do |node|
34
+ return GeoConcerns::Coverage.new(
35
+ coverage_coordinate(node, 'north'),
36
+ coverage_coordinate(node, 'east'),
37
+ coverage_coordinate(node, 'south'),
38
+ coverage_coordinate(node, 'west')
39
+ ).to_s
40
+ end
41
+ nil
42
+ end
43
+
44
+ def coverage_coordinate(node, direction)
45
+ node.at_xpath("#{direction}bc").text.to_f
46
+ end
47
+
48
+ def issued
49
+ doc.at_xpath('//idinfo/citation/citeinfo/pubdate').tap do |node|
50
+ return node.text[0..3].to_i unless node.nil? # extract year only
51
+ end
52
+ nil
53
+ end
54
+
55
+ def timeperiods
56
+ ::GeoConcerns::TimePeriod.new(
57
+ extract_multivalued('//idinfo/keywords/temporal/tempkey'), doc
58
+ ).value
59
+ end
60
+
61
+ def publishers
62
+ extract_multivalued('//idinfo/citation/citeinfo/pubinfo/publish')
63
+ end
64
+
65
+ def creators
66
+ extract_multivalued('//idinfo/citation/citeinfo/origin')
67
+ end
68
+
69
+ def placenames
70
+ extract_multivalued('//idinfo/keywords/place/placekey')
71
+ end
72
+
73
+ def keywords
74
+ keywords = extract_multivalued('//idinfo/keywords/theme/themekey')
75
+ keywords.map! { |k| TOPIC_CATEGORIES[k.to_sym].present? ? TOPIC_CATEGORIES[k.to_sym] : k }
76
+ keywords.uniq!
77
+ keywords.present? ? keywords : nil
78
+ end
79
+
80
+ # ISO 19115 Topic Category
81
+ TOPIC_CATEGORIES = {
82
+ farming: 'Farming',
83
+ biota: 'Biology and Ecology',
84
+ climatologyMeteorologyAtmosphere: 'Climatology, Meteorology and Atmosphere',
85
+ boundaries: 'Boundaries',
86
+ elevation: 'Elevation',
87
+ environment: 'Environment',
88
+ geoscientificinformation: 'Geoscientific Information',
89
+ health: 'Health',
90
+ imageryBaseMapsEarthCover: 'Imagery and Base Maps',
91
+ intelligenceMilitary: 'Military',
92
+ inlandWaters: 'Inland Waters',
93
+ location: 'Location',
94
+ oceans: 'Oceans',
95
+ planningCadastre: 'Planning and Cadastral',
96
+ structure: 'Structures',
97
+ transportation: 'Transportation',
98
+ utilitiesCommunication: 'Utilities and Communication',
99
+ society: 'Society'
100
+ }.freeze
101
+
102
+ private
103
+
104
+ def extract_multivalued(xpath)
105
+ values = []
106
+ doc.xpath(xpath).each do |node|
107
+ values << node.text.strip
108
+ end
109
+ values.uniq!
110
+ values.present? ? values : nil
111
+ end
112
+ end
113
+ end
114
+ end