geo_concerns 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|