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,27 @@
1
+ module GeoConcerns
2
+ module Processors
3
+ module Raster
4
+ class Processor < Hydra::Derivatives::Processors::Processor
5
+ def process
6
+ raster_processor_class.new(source_path,
7
+ directives,
8
+ output_file_service: output_file_service).process
9
+ end
10
+
11
+ # Returns a raster processor class based on mime type passed in the directives object.
12
+ #
13
+ # @return raster processing class
14
+ def raster_processor_class
15
+ case directives.fetch(:input_format)
16
+ when 'text/plain; gdal-format=USGSDEM'
17
+ GeoConcerns::Processors::Raster::Dem
18
+ when 'application/octet-stream; gdal-format=AIG'
19
+ GeoConcerns::Processors::Raster::Aig
20
+ else
21
+ GeoConcerns::Processors::Raster::Base
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ module GeoConcerns
2
+ module Processors
3
+ module Vector
4
+ extend ActiveSupport::Autoload
5
+
6
+ eager_autoload do
7
+ autoload :Processor
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,68 @@
1
+ module GeoConcerns
2
+ module Processors
3
+ module Vector
4
+ class Base < Hydra::Derivatives::Processors::Processor
5
+ include Hydra::Derivatives::Processors::ShellBasedProcessor
6
+ include GeoConcerns::Processors::BaseGeoProcessor
7
+ include GeoConcerns::Processors::Zip
8
+
9
+ def self.encode(path, options, output_file)
10
+ case options[:label]
11
+ when :thumbnail
12
+ encode_vector(path, options, output_file)
13
+ when :display_vector
14
+ reproject_vector(path, options, output_file)
15
+ end
16
+ end
17
+
18
+ def self.encode_vector(in_path, options, out_path)
19
+ tiff_path = "#{File.dirname(in_path)}/out.tif"
20
+ execute rasterize(in_path, options, tiff_path)
21
+ execute translate(tiff_path, options, out_path)
22
+ File.unlink(tiff_path)
23
+ File.unlink("#{out_path}.aux.xml")
24
+ end
25
+
26
+ def self.reproject_vector(in_path, options, out_path)
27
+ shapefile_path = intermediate_shapefile_path(out_path)
28
+ execute reproject(in_path, options, shapefile_path)
29
+ zip(shapefile_path, out_path)
30
+ FileUtils.rm_rf(shapefile_path)
31
+ end
32
+
33
+ # Returns a formatted gdal_rasterize command. Used to rasterize vector
34
+ # format into raster format.
35
+ #
36
+ # @param in_path [String] file input path
37
+ # #param options [Hash] creation options
38
+ # @param out_path [String] processor output file path
39
+ # @return [String] command for rasterizing vector dataset
40
+ def self.rasterize(in_path, options, out_path)
41
+ "gdal_rasterize -q -burn 0 -init 255 -ot Byte -ts "\
42
+ "#{options[:output_size]} -of GTiff #{in_path} #{out_path}"
43
+ end
44
+
45
+ # Returns a formatted ogr2ogr command. Used to reproject a
46
+ # vector dataset and save the output as a shapefile.
47
+ #
48
+ # @param in_path [String] file input path
49
+ # #param options [Hash] creation options
50
+ # @param out_path [String] processor output file path
51
+ # @return [String] command for reprojecting vector data
52
+ def self.reproject(in_path, options, out_path)
53
+ "env SHAPE_ENCODING= ogr2ogr -q -nln #{options[:basename]} "\
54
+ "-f 'ESRI Shapefile' -t_srs #{options[:output_srid]} '#{out_path}' '#{in_path}'"
55
+ end
56
+
57
+ # Returns a path to an intermediate shape file directory.
58
+ #
59
+ # @param path [String] file path to base temp path on
60
+ # @return [String] tempfile path
61
+ def self.intermediate_shapefile_path(path)
62
+ ext = File.extname(path)
63
+ "#{File.dirname(path)}/#{File.basename(path, ext)}/"
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,25 @@
1
+ module GeoConcerns
2
+ module Processors
3
+ module Vector
4
+ class Processor < Hydra::Derivatives::Processors::Processor
5
+ def process
6
+ vector_processor_class.new(source_path,
7
+ directives,
8
+ output_file_service: output_file_service).process
9
+ end
10
+
11
+ # Returns a vector processor class based on mime type passed in the directives object.
12
+ #
13
+ # @return vector processing class
14
+ def vector_processor_class
15
+ case directives.fetch(:input_format)
16
+ when 'application/zip; ogr-format="ESRI Shapefile"'
17
+ GeoConcerns::Processors::Vector::Shapefile
18
+ else
19
+ GeoConcerns::Processors::Vector::Base
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ module GeoConcerns
2
+ module Processors
3
+ module Vector
4
+ class Shapefile < GeoConcerns::Processors::Vector::Base
5
+ include GeoConcerns::Processors::Zip
6
+
7
+ def self.encode(path, options, output_file)
8
+ unzip(path, output_file) do |zip_path|
9
+ case options[:label]
10
+ when :thumbnail
11
+ encode_vector(zip_path, options, output_file)
12
+ when :display_vector
13
+ reproject_vector(zip_path, options, output_file)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ module GeoConcerns
2
+ module Processors
3
+ module Zip
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ # Unzips a file, invokes a block, and then deletes the unzipped file(s).
8
+ # Use to wrap processor methods for geo file formats that
9
+ # are zipped before uploading.
10
+ #
11
+ # @param in_path [String] file input path
12
+ # @param output_file [String] processor output file path
13
+ def self.unzip(in_path, output_file)
14
+ basename = File.basename(output_file, File.extname(output_file))
15
+ zip_out_path = "#{File.dirname(output_file)}/#{basename}_out"
16
+ execute "unzip -qq -j -d \"#{zip_out_path}\" \"#{in_path}\""
17
+ yield zip_out_path
18
+ FileUtils.rm_rf(zip_out_path)
19
+ end
20
+
21
+ # Zips a file or directory.
22
+ #
23
+ # @param in_path [String] file input path
24
+ # @param output_file [String] output zip file
25
+ def self.zip(in_path, output_file)
26
+ execute "zip -j -qq -r \"#{output_file}\" \"#{in_path}\""
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,34 @@
1
+ class CoverageRenderer < CurationConcerns::AttributeRenderer
2
+ def render
3
+ coverage = values.first if values
4
+ return '' unless coverage
5
+ markup(coverage).html_safe
6
+ end
7
+
8
+ private
9
+
10
+ def markup(coverage)
11
+ markup = ''
12
+ markup << %(<tr><th>#{label}</th>\n<td id='accordion'><ul class='tabular'>)
13
+ markup << value(coverage)
14
+ markup << toggle_button
15
+ markup << map(coverage)
16
+ markup << %(</ul></td></tr>)
17
+ markup
18
+ end
19
+
20
+ def value(coverage)
21
+ attributes = microdata_object_attributes(field).merge(class: "attribute #{field}")
22
+ %(<li#{html_attributes(attributes)}>#{attribute_value_to_html(coverage.to_s)})
23
+ end
24
+
25
+ def toggle_button
26
+ %( <a data-toggle='collapse' data-parent='accordion' href='#bbox' class='btn btn-default'>
27
+ Toggle Map</a>)
28
+ end
29
+
30
+ def map(coverage)
31
+ %(<div id='bbox' class='collapse in'></div>
32
+ <script>boundingBoxSelector({coverage: '#{coverage}', readonly: true});</script>)
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ module GeoConcerns
2
+ module Runners
3
+ class RasterDerivatives < Hydra::Derivatives::Runner
4
+ def self.processor_class
5
+ GeoConcerns::Processors::Raster::Processor
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module GeoConcerns
2
+ module Runners
3
+ class VectorDerivatives < Hydra::Derivatives::Runner
4
+ def self.processor_class
5
+ GeoConcerns::Processors::Vector::Processor
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,39 @@
1
+ module GeoConcerns
2
+ class BasicGeoMetadataOptional < ActiveTriples::Schema
3
+ #
4
+ # The following properties are inherited from Curation Concerns' metadata
5
+ #
6
+ # @see https://github.com/projecthydra-labs/curation_concerns/blob/master/curation_concerns-models/app/models/concerns/curation_concerns/basic_metadata.rb
7
+ # Optional:
8
+ # :contributor
9
+ # :creator
10
+ # :date_created (DC.created)
11
+ # :description
12
+ # :identifier
13
+ # :language
14
+ # :part_of
15
+ # :publisher
16
+ # :resource_type (DC.type)
17
+ # :rights
18
+ # :source
19
+ # :subject
20
+ # :tag (DC11.relation)
21
+ #
22
+
23
+ # Defines the placenames related to the layer
24
+ # @example
25
+ # image.spatial = [ 'France', 'Spain' ]
26
+ property :spatial, predicate: ::RDF::Vocab::DC.spatial
27
+
28
+ # Defines the temporal coverage of the layer
29
+ # @example
30
+ # vector.temporal = [ '1998-2006', 'circa 2000' ]
31
+ property :temporal, predicate: ::RDF::Vocab::DC.temporal
32
+
33
+ # Defines the issued date for the layer, using XML Schema dateTime format
34
+ # (YYYY-MM-DDThh:mm:ssZ).
35
+ # @example
36
+ # vector.issued = '2001-01-01T00:00:00Z'
37
+ property :issued, predicate: ::RDF::Vocab::DC.issued, multiple: false
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ module GeoConcerns
2
+ class BasicGeoMetadataRequired < ActiveTriples::Schema
3
+ #
4
+ # The following properties are inherited from Curation Concerns' metadata
5
+ #
6
+ # @see https://github.com/projecthydra-labs/curation_concerns/blob/master/curation_concerns-models/app/models/concerns/curation_concerns/required_metadata.rb
7
+ # Required:
8
+ # :title
9
+ # :date_uploaded (DC.dateSubmitted)
10
+ # :date_modified (DC.modified)
11
+ #
12
+
13
+ # Defines the bounding box for the layer.
14
+ # We always assert units of decimal degrees and EPSG:4326 projection.
15
+ # @see http://dublincore.org/documents/dcmi-box/
16
+ # @example
17
+ # vector.coverage = 'northlimit=43.039; eastlimit=-69.856; southlimit=42.943; westlimit=-71.032; units=degrees; projection=EPSG:4326'
18
+ property :coverage, predicate: ::RDF::Vocab::DC11.coverage, multiple: false
19
+
20
+ # Defines the institution which holds the layer
21
+ # @example
22
+ # raster.provenance = 'Stanford University'
23
+ property :provenance, predicate: ::RDF::Vocab::DC.provenance, multiple: false
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ module AuthorityService
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ mattr_accessor :authority
6
+ end
7
+
8
+ class_methods do
9
+ def select_options
10
+ authority.all.map do |element|
11
+ [element[:label], element[:id]]
12
+ end
13
+ end
14
+
15
+ def label(id)
16
+ (authority.find(id) || {}).fetch('term', nil)
17
+ end
18
+
19
+ def include?(id)
20
+ !authority.find(id).nil? && !authority.find(id).empty?
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ module GeoConcerns
2
+ class DerivativePath < CurationConcerns::DerivativePath
3
+ def self.extension_for(destination_name)
4
+ case destination_name
5
+ when 'thumbnail'
6
+ ".#{MIME::Types.type_for('jpg').first.extensions.first}"
7
+ when 'display_raster'
8
+ '.tif'
9
+ when 'display_vector'
10
+ '.zip'
11
+ else
12
+ ".#{destination_name}"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ class ImageFormatService
2
+ include AuthorityService
3
+ self.authority = Qa::Authorities::Local.subauthority_for('image_formats')
4
+ end
@@ -0,0 +1,4 @@
1
+ class MetadataFormatService
2
+ include AuthorityService
3
+ self.authority = Qa::Authorities::Local.subauthority_for('metadata_formats')
4
+ end
@@ -0,0 +1,4 @@
1
+ class RasterFormatService
2
+ include AuthorityService
3
+ self.authority = Qa::Authorities::Local.subauthority_for('raster_formats')
4
+ end
@@ -0,0 +1,4 @@
1
+ class VectorFormatService
2
+ include AuthorityService
3
+ self.authority = Qa::Authorities::Local.subauthority_for('vector_formats')
4
+ end
@@ -0,0 +1,36 @@
1
+ module GeoConcerns
2
+ class Coverage
3
+ class ParseError < StandardError; end
4
+ class InvalidGeometryError < StandardError; end
5
+
6
+ attr_reader :n, :e, :s, :w
7
+
8
+ def self.parse(str)
9
+ n = parse_coordinate(str, /northlimit=([\.\d\-]+);/)
10
+ e = parse_coordinate(str, /eastlimit=([\.\d\-]+);/)
11
+ s = parse_coordinate(str, /southlimit=([\.\d\-]+);/)
12
+ w = parse_coordinate(str, /westlimit=([\.\d\-]+);/)
13
+ raise ParseError, str if n.nil? || e.nil? || s.nil? || w.nil?
14
+ new(n, e, s, w)
15
+ rescue
16
+ nil
17
+ end
18
+
19
+ def self.parse_coordinate(str, regex)
20
+ Regexp.last_match(1).to_f if str =~ regex
21
+ end
22
+
23
+ def initialize(n, e, s, w)
24
+ raise InvalidGeometryError, "n=#{n} < s=#{s}" if n.to_f < s.to_f
25
+ raise InvalidGeometryError, "e=#{e} < w=#{w}" if e.to_f < w.to_f
26
+ @n = n
27
+ @e = e
28
+ @s = s
29
+ @w = w
30
+ end
31
+
32
+ def to_s
33
+ "northlimit=#{n}; eastlimit=#{e}; southlimit=#{s}; westlimit=#{w}; units=degrees; projection=EPSG:4326"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,31 @@
1
+ module GeoConcerns
2
+ class TimePeriod
3
+ attr_accessor :doc, :initial_value
4
+ def initialize(initial_value, doc)
5
+ @initial_value = initial_value
6
+ @doc = doc
7
+ append_caldate
8
+ append_begdate
9
+ initial_value.uniq!
10
+ end
11
+
12
+ def value
13
+ return nil unless initial_value.present?
14
+ initial_value
15
+ end
16
+
17
+ private
18
+
19
+ def append_caldate
20
+ doc.at_xpath('//idinfo/timeperd/timeinfo/mdattim/sngdate/caldate | //idinfo/timeperd/timeinfo/sngdate/caldate').tap do |node|
21
+ initial_value << node.text[0..3] unless node.nil? # extract year only
22
+ end
23
+ end
24
+
25
+ def append_begdate
26
+ doc.at_xpath('//idinfo/timeperd/timeinfo/rngdates/begdate').tap do |node|
27
+ initial_value << node.text[0..3] unless node.nil? # extract year only
28
+ end
29
+ end
30
+ end
31
+ end