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.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.rubocop.yml +101 -0
- data/.travis.yml +17 -0
- data/Gemfile +46 -0
- data/LICENSE +202 -0
- data/README.md +46 -0
- data/Rakefile +21 -0
- data/app/actors/geo_concerns/file_actor.rb +20 -0
- data/app/actors/geo_concerns/file_set_actor.rb +7 -0
- data/app/assets/images/geo_concerns/.keep +0 -0
- data/app/assets/images/geo_concerns/images/geocoder.png +0 -0
- data/app/assets/images/geo_concerns/images/throbber.gif +0 -0
- data/app/assets/images/geo_concerns/img/filter-icon.png +0 -0
- data/app/assets/images/geo_concerns/img/move-handle.png +0 -0
- data/app/assets/images/geo_concerns/img/resize-handle.png +0 -0
- data/app/assets/javascripts/geo_concerns/Control.Geocoder.js +1056 -0
- data/app/assets/javascripts/geo_concerns/application.js +5 -0
- data/app/assets/javascripts/geo_concerns/bounding_box_selector.js +100 -0
- data/app/assets/javascripts/geo_concerns/leaflet-boundingbox.js +467 -0
- data/app/assets/stylesheets/geo_concerns/Control.Geocoder.css +104 -0
- data/app/assets/stylesheets/geo_concerns/application.css +18 -0
- data/app/assets/stylesheets/geo_concerns/bounding_box.scss +7 -0
- data/app/assets/stylesheets/geo_concerns/leaflet-boundingbox.css +17 -0
- data/app/controllers/concerns/geo_concerns/file_sets_controller_behavior.rb +19 -0
- data/app/controllers/concerns/geo_concerns/image_works_controller_behavior.rb +13 -0
- data/app/controllers/concerns/geo_concerns/raster_works_controller_behavior.rb +23 -0
- data/app/controllers/concerns/geo_concerns/vector_works_controller_behavior.rb +23 -0
- data/app/forms/geo_concerns/basic_geo_metadata_form.rb +8 -0
- data/app/forms/geo_concerns/external_metadata_file_form.rb +8 -0
- data/app/forms/geo_concerns/georeferenced_form.rb +9 -0
- data/app/forms/geo_concerns/image_work_form.rb +9 -0
- data/app/forms/geo_concerns/raster_work_form.rb +8 -0
- data/app/forms/geo_concerns/vector_work_form.rb +8 -0
- data/app/helpers/bounding_box_helper.rb +24 -0
- data/app/helpers/geo_concerns/application_helper.rb +4 -0
- data/app/models/concerns/geo_concerns/basic_geo_metadata.rb +21 -0
- data/app/models/concerns/geo_concerns/external_metadata_file_behavior.rb +31 -0
- data/app/models/concerns/geo_concerns/extractors/fgdc_helper.rb +9 -0
- data/app/models/concerns/geo_concerns/extractors/fgdc_metadata_extractor.rb +114 -0
- data/app/models/concerns/geo_concerns/extractors/iso19139_helper.rb +50 -0
- data/app/models/concerns/geo_concerns/extractors/mods_helper.rb +15 -0
- data/app/models/concerns/geo_concerns/file_set/derivatives.rb +60 -0
- data/app/models/concerns/geo_concerns/file_set_presenter_behavior.rb +7 -0
- data/app/models/concerns/geo_concerns/geo_file_format_behavior.rb +37 -0
- data/app/models/concerns/geo_concerns/geo_file_set_behavior.rb +11 -0
- data/app/models/concerns/geo_concerns/georeferenced_behavior.rb +18 -0
- data/app/models/concerns/geo_concerns/image_file_behavior.rb +14 -0
- data/app/models/concerns/geo_concerns/image_work_behavior.rb +69 -0
- data/app/models/concerns/geo_concerns/metadata_extraction_helper.rb +28 -0
- data/app/models/concerns/geo_concerns/raster_file_behavior.rb +14 -0
- data/app/models/concerns/geo_concerns/raster_work_behavior.rb +82 -0
- data/app/models/concerns/geo_concerns/solr_document_behavior.rb +25 -0
- data/app/models/concerns/geo_concerns/vector_file_behavior.rb +14 -0
- data/app/models/concerns/geo_concerns/vector_work_behavior.rb +78 -0
- data/app/presenters/geo_concerns/geo_concerns_show_presenter.rb +30 -0
- data/app/presenters/geo_concerns/image_work_show_presenter.rb +18 -0
- data/app/presenters/geo_concerns/raster_work_show_presenter.rb +18 -0
- data/app/presenters/geo_concerns/vector_work_show_presenter.rb +10 -0
- data/app/processors/geo_concerns/processors/base_geo_processor.rb +86 -0
- data/app/processors/geo_concerns/processors/raster.rb +11 -0
- data/app/processors/geo_concerns/processors/raster/aig.rb +44 -0
- data/app/processors/geo_concerns/processors/raster/base.rb +74 -0
- data/app/processors/geo_concerns/processors/raster/dem.rb +46 -0
- data/app/processors/geo_concerns/processors/raster/processor.rb +27 -0
- data/app/processors/geo_concerns/processors/vector.rb +11 -0
- data/app/processors/geo_concerns/processors/vector/base.rb +68 -0
- data/app/processors/geo_concerns/processors/vector/processor.rb +25 -0
- data/app/processors/geo_concerns/processors/vector/shapefile.rb +20 -0
- data/app/processors/geo_concerns/processors/zip.rb +31 -0
- data/app/renderers/coverage_renderer.rb +34 -0
- data/app/runners/geo_concerns/runners/raster_derivatives.rb +9 -0
- data/app/runners/geo_concerns/runners/vector_derivatives.rb +9 -0
- data/app/schemas/geo_concerns/basic_geo_metadata_optional.rb +39 -0
- data/app/schemas/geo_concerns/basic_geo_metadata_required.rb +25 -0
- data/app/services/authority_service.rb +23 -0
- data/app/services/geo_concerns/derivative_path.rb +16 -0
- data/app/services/image_format_service.rb +4 -0
- data/app/services/metadata_format_service.rb +4 -0
- data/app/services/raster_format_service.rb +4 -0
- data/app/services/vector_format_service.rb +4 -0
- data/app/values/geo_concerns/coverage.rb +36 -0
- data/app/values/geo_concerns/time_period.rb +31 -0
- data/app/views/curation_concerns/file_sets/_form.html.erb +48 -0
- data/app/views/curation_concerns/image_works/_form.html.erb +23 -0
- data/app/views/curation_concerns/image_works/_image_work.html.erb +2 -0
- data/app/views/curation_concerns/image_works/_members.html.erb +30 -0
- data/app/views/curation_concerns/image_works/_related_image_files.html.erb +24 -0
- data/app/views/curation_concerns/image_works/_show_actions.html.erb +16 -0
- data/app/views/curation_concerns/image_works/show.html.erb +17 -0
- data/app/views/curation_concerns/raster_works/_form.html.erb +25 -0
- data/app/views/curation_concerns/raster_works/_members.html.erb +30 -0
- data/app/views/curation_concerns/raster_works/_raster_work.html.erb +2 -0
- data/app/views/curation_concerns/raster_works/_related_raster_files.html.erb +24 -0
- data/app/views/curation_concerns/raster_works/_show_actions.html.erb +16 -0
- data/app/views/curation_concerns/raster_works/show.html.erb +17 -0
- data/app/views/curation_concerns/vector_works/_form.html.erb +25 -0
- data/app/views/curation_concerns/vector_works/_related_vector_files.html.erb +24 -0
- data/app/views/curation_concerns/vector_works/_show_actions.html.erb +15 -0
- data/app/views/curation_concerns/vector_works/_vector_work.html.erb +2 -0
- data/app/views/curation_concerns/vector_works/show.html.erb +15 -0
- data/app/views/geo_concerns/_attribute_rows.html.erb +11 -0
- data/app/views/geo_concerns/_attributes.html.erb +13 -0
- data/app/views/geo_concerns/_form_additional_information.html.erb +11 -0
- data/app/views/geo_concerns/_form_bounding_box.html.erb +9 -0
- data/app/views/geo_concerns/_form_descriptive_fields.html.erb +9 -0
- data/app/views/geo_concerns/_form_files_and_links.html.erb +0 -0
- data/app/views/geo_concerns/_form_populate_metadata.html.erb +8 -0
- data/app/views/geo_concerns/_form_required_information.html.erb +12 -0
- data/app/views/geo_concerns/_form_supplementary_fields.html.erb +15 -0
- data/app/views/geo_concerns/_related_external_metadata_files.html.erb +24 -0
- data/app/vocabs/geo_concerns/geo_terms.rb +12 -0
- data/bin/rails +12 -0
- data/config/routes.rb +6 -0
- data/geo_concerns.gemspec +36 -0
- data/lib/generators/geo_concerns/install_generator.rb +119 -0
- data/lib/generators/geo_concerns/templates/actors/curation_concerns/image_work_actor.rb +4 -0
- data/lib/generators/geo_concerns/templates/actors/curation_concerns/raster_work_actor.rb +4 -0
- data/lib/generators/geo_concerns/templates/actors/curation_concerns/vector_work_actor.rb +4 -0
- data/lib/generators/geo_concerns/templates/config/authorities/image_formats.yml +5 -0
- data/lib/generators/geo_concerns/templates/config/authorities/metadata_formats.yml +7 -0
- data/lib/generators/geo_concerns/templates/config/authorities/raster_formats.yml +9 -0
- data/lib/generators/geo_concerns/templates/config/authorities/vector_formats.yml +5 -0
- data/lib/generators/geo_concerns/templates/controllers/curation_concerns/file_sets_controller.rb +6 -0
- data/lib/generators/geo_concerns/templates/controllers/curation_concerns/image_works_controller.rb +5 -0
- data/lib/generators/geo_concerns/templates/controllers/curation_concerns/raster_works_controller.rb +6 -0
- data/lib/generators/geo_concerns/templates/controllers/curation_concerns/vector_works_controller.rb +6 -0
- data/lib/generators/geo_concerns/templates/geo_concerns.js +1 -0
- data/lib/generators/geo_concerns/templates/geo_concerns.scss +3 -0
- data/lib/generators/geo_concerns/templates/jobs/characterize_job.rb +12 -0
- data/lib/generators/geo_concerns/templates/models/file_set.rb +4 -0
- data/lib/generators/geo_concerns/templates/models/image_work.rb +6 -0
- data/lib/generators/geo_concerns/templates/models/raster_work.rb +7 -0
- data/lib/generators/geo_concerns/templates/models/vector_work.rb +7 -0
- data/lib/generators/geo_concerns/templates/presenters/file_set_presenter.rb +3 -0
- data/lib/generators/geo_concerns/templates/spec/actor_spec.rb.erb +9 -0
- data/lib/generators/geo_concerns/templates/spec/controller_spec.rb.erb +9 -0
- data/lib/generators/geo_concerns/templates/spec/model_spec.rb.erb +9 -0
- data/lib/geo_concerns.rb +6 -0
- data/lib/geo_concerns/engine.rb +4 -0
- data/lib/geo_concerns/version.rb +3 -0
- data/lib/tasks/geo_concerns_tasks.rake +4 -0
- data/solr/config/_rest_managed.json +3 -0
- data/solr/config/admin-extra.html +31 -0
- data/solr/config/elevate.xml +36 -0
- data/solr/config/mapping-ISOLatin1Accent.txt +246 -0
- data/solr/config/protwords.txt +21 -0
- data/solr/config/schema.xml +372 -0
- data/solr/config/scripts.conf +24 -0
- data/solr/config/solrconfig.xml +312 -0
- data/solr/config/spellings.txt +2 -0
- data/solr/config/stopwords.txt +58 -0
- data/solr/config/stopwords_en.txt +58 -0
- data/solr/config/synonyms.txt +31 -0
- data/solr/config/xslt/example.xsl +132 -0
- data/solr/config/xslt/example_atom.xsl +67 -0
- data/solr/config/xslt/example_rss.xsl +66 -0
- data/solr/config/xslt/luke.xsl +337 -0
- data/spec/actors/geo_concerns/file_actor_spec.rb +26 -0
- data/spec/controllers/image_works_controller_spec.rb +25 -0
- data/spec/controllers/raster_works_controller_spec.rb +50 -0
- data/spec/controllers/vector_works_controller_spec.rb +50 -0
- data/spec/factories/external_metadata_files.rb +20 -0
- data/spec/factories/image_files.rb +32 -0
- data/spec/factories/image_works.rb +68 -0
- data/spec/factories/raster_files.rb +35 -0
- data/spec/factories/raster_works.rb +86 -0
- data/spec/factories/users.rb +26 -0
- data/spec/factories/vector_files.rb +31 -0
- data/spec/factories/vector_works.rb +83 -0
- data/spec/features/create_raster_work_spec.rb +49 -0
- data/spec/forms/geo_concerns/basic_geo_metadata_form_spec.rb +27 -0
- data/spec/forms/geo_concerns/external_metadata_file_form_spec.rb +27 -0
- data/spec/forms/geo_concerns/georeferenced_form_spec.rb +29 -0
- data/spec/forms/geo_concerns/image_work_form_spec.rb +11 -0
- data/spec/forms/geo_concerns/raster_work_form_spec.rb +15 -0
- data/spec/forms/geo_concerns/vector_work_form_spec.rb +15 -0
- data/spec/helpers/bounding_box_helper_spec.rb +34 -0
- data/spec/models/concerns/basic_geo_metadata_spec.rb +21 -0
- data/spec/models/concerns/geo_concerns/file_set/derivatives_spec.rb +108 -0
- data/spec/models/concerns/geo_concerns/file_set/geo_file_format_behavior_spec.rb +56 -0
- data/spec/models/external_metadata_file_spec.rb +118 -0
- data/spec/models/file_set_spec.rb +9 -0
- data/spec/models/image_file_spec.rb +48 -0
- data/spec/models/image_work_spec.rb +71 -0
- data/spec/models/raster_file_spec.rb +48 -0
- data/spec/models/raster_work_spec.rb +122 -0
- data/spec/models/solr_document_spec.rb +35 -0
- data/spec/models/vector_file_spec.rb +48 -0
- data/spec/models/vector_work_spec.rb +113 -0
- data/spec/presenters/file_set_presenter_spec.rb +13 -0
- data/spec/presenters/geo_concerns_show_presenter_spec.rb +56 -0
- data/spec/presenters/image_work_show_presenter_spec.rb +52 -0
- data/spec/presenters/raster_work_show_presenter_spec.rb +52 -0
- data/spec/presenters/vector_work_show_presenter_spec.rb +41 -0
- data/spec/processors/geo_concerns/processors/base_geo_processor_spec.rb +109 -0
- data/spec/processors/geo_concerns/processors/raster/aig_spec.rb +28 -0
- data/spec/processors/geo_concerns/processors/raster/base_spec.rb +86 -0
- data/spec/processors/geo_concerns/processors/raster/dem_spec.rb +26 -0
- data/spec/processors/geo_concerns/processors/raster/processor_spec.rb +39 -0
- data/spec/processors/geo_concerns/processors/vector/base_spec.rb +67 -0
- data/spec/processors/geo_concerns/processors/vector/processor_spec.rb +28 -0
- data/spec/processors/geo_concerns/processors/vector/shapefile_spec.rb +17 -0
- data/spec/processors/geo_concerns/processors/zip_spec.rb +39 -0
- data/spec/renderers/coverage_renderer_spec.rb +21 -0
- data/spec/services/derivative_path_spec.rb +12 -0
- data/spec/services/raster_format_service_spec.rb +13 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/controllers/engine_helpers.rb +7 -0
- data/spec/support/database_cleaner.rb +18 -0
- data/spec/support/devise.rb +10 -0
- data/spec/support/devise_helpers.rb +6 -0
- data/spec/support/factory_girl.rb +3 -0
- data/spec/support/features.rb +14 -0
- data/spec/support/features/session_helpers.rb +40 -0
- data/spec/support/fixture_reader.rb +7 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +20 -0
- data/spec/values/coverage_spec.rb +40 -0
- data/tasks/ci.rake +49 -0
- 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,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,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,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
|