geo_concerns 0.0.10 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/.travis.yml +8 -4
- data/README.md +23 -8
- data/app/controllers/concerns/geo_concerns/messenger_behavior.rb +29 -0
- data/app/jobs/delivery_job.rb +15 -2
- data/app/jobs/geoblacklight_job.rb +10 -0
- data/app/models/concerns/geo_concerns/file_set/derivatives.rb +11 -9
- data/app/models/concerns/geo_concerns/solr_document_behavior.rb +5 -0
- data/app/presenters/geo_concerns/geo_concerns_show_presenter.rb +1 -1
- data/app/processors/geo_concerns/processors/base_geo_processor.rb +9 -24
- data/app/processors/geo_concerns/processors/image.rb +59 -0
- data/app/processors/geo_concerns/processors/ogr.rb +1 -1
- data/app/processors/geo_concerns/processors/raster.rb +18 -3
- data/app/processors/geo_concerns/processors/raster/base.rb +1 -0
- data/app/processors/geo_concerns/processors/rendering.rb +79 -0
- data/app/processors/geo_concerns/processors/vector.rb +16 -3
- data/app/processors/geo_concerns/processors/vector/base.rb +3 -2
- data/app/processors/geo_concerns/processors/vector/info.rb +21 -3
- data/app/services/geo_concerns/delivery/geoserver.rb +43 -6
- data/app/services/geo_concerns/discovery/abstract_document.rb +2 -1
- data/app/services/geo_concerns/discovery/document_builder.rb +2 -3
- data/app/services/geo_concerns/discovery/document_builder/basic_metadata_builder.rb +13 -2
- data/app/services/geo_concerns/discovery/document_builder/date_builder.rb +2 -0
- data/app/services/geo_concerns/discovery/document_builder/document_path.rb +12 -7
- data/app/services/geo_concerns/discovery/document_builder/references_builder.rb +20 -1
- data/app/services/geo_concerns/discovery/document_builder/spatial_builder.rb +2 -0
- data/app/services/geo_concerns/discovery/document_builder/wxs.rb +81 -0
- data/app/services/geo_concerns/discovery/geoblacklight_document.rb +9 -3
- data/app/services/geo_concerns/events_generator.rb +25 -0
- data/app/services/geo_concerns/events_generator/base_events_generator.rb +22 -0
- data/app/services/geo_concerns/events_generator/composite_generator.rb +18 -0
- data/app/services/geo_concerns/events_generator/geoblacklight_event_generator.rb +44 -0
- data/app/services/geo_concerns/events_generator/geoserver_event_generator.rb +30 -0
- data/app/services/geo_concerns/local_messaging_client.rb +18 -0
- data/app/services/geo_concerns/rabbit_messaging_client.rb +38 -0
- data/app/values/geo_concerns/time_period.rb +4 -5
- data/app/views/geo_concerns/_attribute_rows.html.erb +1 -0
- data/app/views/geo_concerns/_form_additional_information.html.erb +1 -0
- data/app/views/geo_concerns/file_sets/actions/_default_actions.html.erb +1 -1
- data/app/views/geo_concerns/file_sets/actions/_image_actions.html.erb +1 -1
- data/app/views/geo_concerns/file_sets/actions/_metadata_actions.html.erb +1 -1
- data/app/views/geo_concerns/file_sets/actions/_raster_actions.html.erb +2 -2
- data/app/views/geo_concerns/file_sets/actions/_vector_actions.html.erb +2 -2
- data/app/views/geo_concerns/file_sets/media_display/_geo.html.erb +2 -1
- data/docker-compose-full.yml +30 -0
- data/docker-compose.yml +4 -5
- data/geo_concerns.gemspec +5 -4
- data/lib/generators/geo_concerns/install_generator.rb +19 -25
- data/lib/generators/geo_concerns/templates/config/geoblacklight.yml +12 -0
- data/lib/generators/geo_concerns/templates/config/geoserver.yml +2 -0
- data/lib/generators/geo_concerns/templates/config/initializers/geoblacklight_config.rb +13 -0
- data/lib/generators/geo_concerns/templates/config/initializers/messaging_config.rb +34 -0
- data/lib/generators/geo_concerns/templates/config/initializers/simpler_tiles.rb +65 -0
- data/lib/generators/geo_concerns/templates/config/messaging.yml +15 -0
- data/lib/generators/geo_concerns/templates/config/simpler_tiles.yml +24 -0
- data/lib/generators/geo_concerns/templates/controllers/curation_concerns/file_sets_controller.rb +1 -0
- data/lib/generators/geo_concerns/templates/controllers/curation_concerns/image_works_controller.rb +1 -0
- data/lib/generators/geo_concerns/templates/controllers/curation_concerns/raster_works_controller.rb +1 -0
- data/lib/generators/geo_concerns/templates/controllers/curation_concerns/vector_works_controller.rb +1 -0
- data/lib/geo_concerns/version.rb +1 -1
- data/run-docker.sh +11 -1
- data/spec/controllers/file_sets_controller_spec.rb +50 -0
- data/spec/jobs/delivery_job_spec.rb +30 -7
- data/spec/models/concerns/geo_concerns/file_set/derivatives_spec.rb +9 -3
- data/spec/models/solr_document_spec.rb +6 -0
- data/spec/processors/geo_concerns/processors/base_geo_processor_spec.rb +15 -22
- data/spec/processors/geo_concerns/processors/image_spec.rb +71 -0
- data/spec/processors/geo_concerns/processors/rendering_spec.rb +64 -0
- data/spec/processors/geo_concerns/processors/vector/base_spec.rb +1 -1
- data/spec/processors/geo_concerns/processors/vector/info_spec.rb +10 -1
- data/spec/services/geo_concerns/delivery/geoserver_spec.rb +30 -6
- data/spec/services/{derivative_path_spec.rb → geo_concerns/derivative_path_spec.rb} +0 -0
- data/spec/services/geo_concerns/discovery/document_builder/wxs_spec.rb +69 -0
- data/spec/services/geo_concerns/discovery/document_builder_spec.rb +48 -32
- data/spec/services/geo_concerns/discovery/geoblacklight_document_spec.rb +1 -0
- data/spec/services/geo_concerns/events_generator/geoblacklight_event_generator_spec.rb +87 -0
- data/spec/services/geo_concerns/events_generator/geoserver_event_generator_spec.rb +40 -0
- data/spec/services/geo_concerns/local_messaging_client_spec.rb +35 -0
- data/spec/services/geo_concerns/rabbit_messaging_client_spec.rb +35 -0
- data/spec/services/{raster_format_service_spec.rb → geo_concerns/raster_format_service_spec.rb} +0 -0
- data/template.rb +1 -1
- metadata +85 -31
- data/app/processors/geo_concerns/processors/mapnik.rb +0 -35
- data/app/processors/geo_concerns/processors/raster/processor.rb +0 -26
- data/app/processors/geo_concerns/processors/vector/processor.rb +0 -24
- data/lib/generators/geo_concerns/templates/config/locales/geo_concerns.en.yml +0 -4
- data/lib/generators/geo_concerns/templates/config/mapnik.yml +0 -24
- data/spec/processors/geo_concerns/processors/mapnik_spec.rb +0 -70
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d62f2f9412e6303a2245195a93b9d18b15c19461
|
4
|
+
data.tar.gz: 0e2cb97544d7aa1ace8c595f89637833bb00d860
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0fa7ca52d44573c6bce5021977bc0502c87ebd125cf4f20b1725203ee761494b528ed7a7d196a284d8df1388b7b76af20685a0e6e59b399663bb13132632a27
|
7
|
+
data.tar.gz: 94b8701dcd59dcfc1160ddb11e9cbae5a03da1e925305b61eb9c90473904000984012c5d6edb74cebd30cfe1c0f0b2390f84ecbca02c4c0dbad17f44d201cf92
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -8,16 +8,17 @@ jdk:
|
|
8
8
|
env:
|
9
9
|
global:
|
10
10
|
- NOKOGIRI_USE_SYSTEM_LIBRARIES=true
|
11
|
-
- MAPNIK_VERSION="2.3"
|
12
11
|
matrix:
|
13
12
|
- RAILS_VERSION=4.2.7.1
|
14
13
|
RDF_VERSION=1.99.1
|
15
14
|
- RAILS_VERSION=5.0.0.1
|
16
15
|
RDF_VERSION=2.1.0
|
17
16
|
before_install:
|
18
|
-
-
|
19
|
-
-
|
20
|
-
-
|
17
|
+
- git clone https://github.com/propublica/simple-tiles.git
|
18
|
+
- cd simple-tiles
|
19
|
+
- ./configure && make
|
20
|
+
- sudo make install
|
21
|
+
- cd ..
|
21
22
|
- gem install bundler -v 1.13.1 # hopefully temporary
|
22
23
|
install: bundle install --jobs=3 --retry=3
|
23
24
|
before_script:
|
@@ -27,4 +28,7 @@ services:
|
|
27
28
|
addons:
|
28
29
|
apt:
|
29
30
|
packages:
|
31
|
+
- libgdal-dev
|
30
32
|
- gdal-bin
|
33
|
+
- libcairo2-dev
|
34
|
+
- libpango1.0-dev
|
data/README.md
CHANGED
@@ -23,18 +23,32 @@ Rails application for developing Hydra Geo models. Built around Curation Concern
|
|
23
23
|
* On Ubuntu, use `sudo apt-get install gdal-bin`.
|
24
24
|
1. [GeoServer](http://geoserver.org/) (Optional)
|
25
25
|
|
26
|
-
##
|
26
|
+
## Simple Tiles
|
27
27
|
|
28
|
-
GeoConcerns requires
|
28
|
+
GeoConcerns requires the image generation library [Simple Tiles](http://propublica.github.io/simple-tiles/).
|
29
29
|
|
30
30
|
Mac OS X:
|
31
31
|
|
32
|
-
-
|
32
|
+
- Install via Homebrew: ```brew install simple-tiles```
|
33
33
|
|
34
34
|
Linux:
|
35
35
|
|
36
|
-
-
|
37
|
-
|
36
|
+
- Install dependencies:
|
37
|
+
|
38
|
+
```
|
39
|
+
libgdal-dev
|
40
|
+
libcairo2-dev
|
41
|
+
libpango1.0-dev
|
42
|
+
```
|
43
|
+
|
44
|
+
- Compile:
|
45
|
+
|
46
|
+
```
|
47
|
+
$ git clone git@github.com:propublica/simple-tiles.git
|
48
|
+
$ cd simple-tiles
|
49
|
+
$ ./configure
|
50
|
+
$ make && make install
|
51
|
+
```
|
38
52
|
|
39
53
|
## Installation
|
40
54
|
|
@@ -49,8 +63,9 @@ $ rake hydra:server
|
|
49
63
|
Add GeoConcerns models to an existing CurationConcerns application:
|
50
64
|
|
51
65
|
1. Add `gem 'geo_concerns'` to your Gemfile.
|
52
|
-
|
53
|
-
|
66
|
+
1. `bundle install`
|
67
|
+
1. `rails generate curation_concerns:install`
|
68
|
+
1. `rails generate geo_concerns:install -f`
|
54
69
|
|
55
70
|
## Development
|
56
71
|
|
@@ -122,4 +137,4 @@ rspec spec/path/to/your_spec.rb:linenumber
|
|
122
137
|
$ cd geoserver-vagrant/
|
123
138
|
$ vagrant up
|
124
139
|
|
125
|
-
```
|
140
|
+
```
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module GeoConcerns
|
2
|
+
module MessengerBehavior
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def destroy
|
6
|
+
messenger.record_deleted(geo_concern)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def after_create_response
|
11
|
+
super
|
12
|
+
messenger.record_created(geo_concern)
|
13
|
+
end
|
14
|
+
|
15
|
+
def after_update_response
|
16
|
+
super
|
17
|
+
messenger.record_updated(geo_concern)
|
18
|
+
end
|
19
|
+
|
20
|
+
def messenger
|
21
|
+
@messenger ||= Messaging.messenger
|
22
|
+
end
|
23
|
+
|
24
|
+
def geo_concern
|
25
|
+
doc = SolrDocument.new(curation_concern.to_solr)
|
26
|
+
show_presenter.new(doc, current_ability, request)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/app/jobs/delivery_job.rb
CHANGED
@@ -10,9 +10,22 @@ class DeliveryJob < ActiveJob::Base
|
|
10
10
|
# Precondition is that all derivatives are created and saved.
|
11
11
|
# @param [FileSet] file_set
|
12
12
|
# @param [String] content_url contains the display copy to deliver
|
13
|
-
def perform(
|
14
|
-
|
13
|
+
def perform(message)
|
14
|
+
file_set = ActiveFedora::Base.find(message['id'])
|
15
|
+
uri = URI.parse(content_url(file_set))
|
16
|
+
raise NotImplementedError, 'Only supports vector and raster file formats' if uri.path == ''
|
15
17
|
raise NotImplementedError, 'Only supports file URLs' unless uri.scheme == 'file'
|
16
18
|
GeoConcerns::DeliveryService.new(file_set, uri.path).publish
|
17
19
|
end
|
20
|
+
|
21
|
+
def content_url(file_set)
|
22
|
+
case file_set.geo_mime_type
|
23
|
+
when *GeoConcerns::RasterFormatService.select_options.map(&:last)
|
24
|
+
return file_set.send(:derivative_url, 'display_raster')
|
25
|
+
when *GeoConcerns::VectorFormatService.select_options.map(&:last)
|
26
|
+
return file_set.send(:derivative_url, 'display_vector')
|
27
|
+
else
|
28
|
+
return ''
|
29
|
+
end
|
30
|
+
end
|
18
31
|
end
|
@@ -3,31 +3,25 @@ module GeoConcerns
|
|
3
3
|
module Derivatives
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
# rubocop:disable Metrics/MethodLength
|
7
6
|
def create_derivatives(filename)
|
8
|
-
content_url = nil
|
9
7
|
case geo_mime_type
|
10
8
|
when *GeoConcerns::ImageFormatService.select_options.map(&:last)
|
11
9
|
image_derivatives(filename)
|
12
10
|
when *GeoConcerns::RasterFormatService.select_options.map(&:last)
|
13
11
|
raster_derivatives(filename)
|
14
|
-
content_url = derivative_url('display_raster')
|
15
12
|
when *GeoConcerns::VectorFormatService.select_options.map(&:last)
|
16
13
|
vector_derivatives(filename)
|
17
|
-
content_url = derivative_url('display_vector')
|
18
14
|
end
|
19
|
-
|
20
15
|
super
|
21
16
|
|
22
|
-
# Once all the derivatives are created,
|
23
|
-
|
24
|
-
DeliveryJob.perform_later(self, content_url) if content_url.present?
|
17
|
+
# Once all the derivatives are created, send a derivatives created message
|
18
|
+
messenger.derivatives_created(self)
|
25
19
|
end
|
26
|
-
# rubocop:enable Metrics/MethodLength
|
27
20
|
|
28
21
|
def image_derivatives(filename)
|
29
22
|
Hydra::Derivatives::ImageDerivatives
|
30
23
|
.create(filename, outputs: [{ label: :thumbnail,
|
24
|
+
id: id,
|
31
25
|
format: 'png',
|
32
26
|
size: '200x150>',
|
33
27
|
url: derivative_url('thumbnail') }])
|
@@ -37,10 +31,12 @@ module GeoConcerns
|
|
37
31
|
GeoConcerns::Runners::RasterDerivatives
|
38
32
|
.create(filename, outputs: [{ input_format: geo_mime_type,
|
39
33
|
label: :display_raster,
|
34
|
+
id: id,
|
40
35
|
format: 'tif',
|
41
36
|
url: derivative_url('display_raster') },
|
42
37
|
{ input_format: geo_mime_type,
|
43
38
|
label: :thumbnail,
|
39
|
+
id: id,
|
44
40
|
format: 'png',
|
45
41
|
size: '200x150',
|
46
42
|
url: derivative_url('thumbnail') }])
|
@@ -50,10 +46,12 @@ module GeoConcerns
|
|
50
46
|
GeoConcerns::Runners::VectorDerivatives
|
51
47
|
.create(filename, outputs: [{ input_format: geo_mime_type,
|
52
48
|
label: :display_vector,
|
49
|
+
id: id,
|
53
50
|
format: 'zip',
|
54
51
|
url: derivative_url('display_vector') },
|
55
52
|
{ input_format: geo_mime_type,
|
56
53
|
label: :thumbnail,
|
54
|
+
id: id,
|
57
55
|
format: 'png',
|
58
56
|
size: '200x150',
|
59
57
|
url: derivative_url('thumbnail') }])
|
@@ -64,6 +62,10 @@ module GeoConcerns
|
|
64
62
|
def derivative_path_factory
|
65
63
|
GeoConcerns::DerivativePath
|
66
64
|
end
|
65
|
+
|
66
|
+
def messenger
|
67
|
+
@messenger ||= Messaging.messenger
|
68
|
+
end
|
67
69
|
end
|
68
70
|
end
|
69
71
|
end
|
@@ -37,5 +37,10 @@ module GeoConcerns
|
|
37
37
|
dt = first(Solrizer.solr_name('system_modified', :stored_sortable, type: :date))
|
38
38
|
dt.nil? ? nil : DateTime.parse(dt).utc
|
39
39
|
end
|
40
|
+
|
41
|
+
# @return [Array<String>]
|
42
|
+
def identifier
|
43
|
+
fetch(Solrizer.solr_name('identifier'), [])
|
44
|
+
end
|
40
45
|
end
|
41
46
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module GeoConcerns
|
2
2
|
class GeoConcernsShowPresenter < CurationConcerns::WorkShowPresenter
|
3
3
|
delegate :spatial, :temporal, :issued, :coverage, :provenance, :layer_modified,
|
4
|
-
to: :solr_document
|
4
|
+
:identifier, to: :solr_document
|
5
5
|
class_attribute :file_format_service
|
6
6
|
|
7
7
|
def geo_file_set_presenters
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'mini_magick'
|
2
|
-
|
3
1
|
module GeoConcerns
|
4
2
|
module Processors
|
5
3
|
module BaseGeoProcessor
|
@@ -36,26 +34,6 @@ module GeoConcerns
|
|
36
34
|
time = (Time.now.to_f * 1000).to_i
|
37
35
|
"#{File.dirname(path)}/#{File.basename(path, File.extname(path))}_#{time}"
|
38
36
|
end
|
39
|
-
|
40
|
-
# Uses imagemagick to resize an image and convert it to the output format.
|
41
|
-
# Keeps the aspect ratio of the original image and adds padding to
|
42
|
-
# to the output image. The file extension is the output format.
|
43
|
-
# @param in_path [String] file input path
|
44
|
-
# @param out_path [String] processor output file path.
|
45
|
-
# @param options [Hash] creation options
|
46
|
-
# @option options [String] `:output_size` as "w h" or "wxh"
|
47
|
-
def self.convert(in_path, out_path, options)
|
48
|
-
image = MiniMagick::Image.open(in_path) # copies image
|
49
|
-
image.combine_options do |i|
|
50
|
-
size = options[:output_size].tr(' ', 'x')
|
51
|
-
i.resize size
|
52
|
-
i.background 'white'
|
53
|
-
i.gravity 'center'
|
54
|
-
i.extent size
|
55
|
-
end
|
56
|
-
image.format File.extname(out_path).gsub(/^\./, '')
|
57
|
-
image.write(out_path)
|
58
|
-
end
|
59
37
|
end
|
60
38
|
|
61
39
|
def options_for(_format)
|
@@ -63,7 +41,8 @@ module GeoConcerns
|
|
63
41
|
label: label,
|
64
42
|
output_size: output_size,
|
65
43
|
output_srid: output_srid,
|
66
|
-
basename: basename
|
44
|
+
basename: basename,
|
45
|
+
id: id
|
67
46
|
}
|
68
47
|
end
|
69
48
|
|
@@ -73,7 +52,7 @@ module GeoConcerns
|
|
73
52
|
directives.fetch(:label, '')
|
74
53
|
end
|
75
54
|
|
76
|
-
#
|
55
|
+
# Transforms the size directive into a GDAL size parameter.
|
77
56
|
# @return [String] derivative size
|
78
57
|
def output_size
|
79
58
|
return unless directives[:size]
|
@@ -91,6 +70,12 @@ module GeoConcerns
|
|
91
70
|
def basename
|
92
71
|
File.basename(source_path, File.extname(source_path))
|
93
72
|
end
|
73
|
+
|
74
|
+
# Gets the fileset id or returns nil.
|
75
|
+
# @return [String] fileset id
|
76
|
+
def id
|
77
|
+
directives.fetch(:id, nil)
|
78
|
+
end
|
94
79
|
end
|
95
80
|
end
|
96
81
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'mini_magick'
|
2
|
+
|
3
|
+
module GeoConcerns
|
4
|
+
module Processors
|
5
|
+
module Image
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
included do
|
8
|
+
# Uses imagemagick to resize an image and convert it to the output format.
|
9
|
+
# Keeps the aspect ratio of the original image and adds padding to
|
10
|
+
# to the output image. The file extension is the output format.
|
11
|
+
# @param in_path [String] file input path
|
12
|
+
# @param out_path [String] processor output file path.
|
13
|
+
# @param options [Hash] creation options
|
14
|
+
# @option options [String] `:output_size` as "w h" or "wxh"
|
15
|
+
def self.convert(in_path, out_path, options)
|
16
|
+
image = MiniMagick::Image.open(in_path) # copies image
|
17
|
+
image.combine_options do |i|
|
18
|
+
size = options[:output_size].tr(' ', 'x')
|
19
|
+
i.resize size
|
20
|
+
i.background 'white'
|
21
|
+
i.gravity 'center'
|
22
|
+
i.extent size
|
23
|
+
end
|
24
|
+
image.format File.extname(out_path).gsub(/^\./, '')
|
25
|
+
image.write(out_path)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Trims extra whitespace.
|
29
|
+
# @param in_path [String] file input path
|
30
|
+
# @param out_path [String] processor output file path.
|
31
|
+
# @param options [Hash] creation options
|
32
|
+
def self.trim(in_path, out_path, _options)
|
33
|
+
MiniMagick::Tool::Convert.new do |convert|
|
34
|
+
convert << in_path
|
35
|
+
convert << "-trim"
|
36
|
+
convert << out_path
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Centers and pads image.
|
41
|
+
# @param in_path [String] file input path
|
42
|
+
# @param out_path [String] processor output file path.
|
43
|
+
# @param options [Hash] creation options
|
44
|
+
def self.center(in_path, out_path, options)
|
45
|
+
MiniMagick::Tool::Convert.new do |convert|
|
46
|
+
convert << "-size"
|
47
|
+
convert << options[:output_size].tr(' ', 'x')
|
48
|
+
convert << "xc:white"
|
49
|
+
convert << in_path
|
50
|
+
convert << "-gravity"
|
51
|
+
convert << "center"
|
52
|
+
convert << "-composite"
|
53
|
+
convert << out_path
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -10,7 +10,7 @@ module GeoConcerns
|
|
10
10
|
# #param options [Hash] creation options
|
11
11
|
# @param out_path [String] processor output file path
|
12
12
|
def self.reproject(in_path, out_path, options)
|
13
|
-
execute "env SHAPE_ENCODING= ogr2ogr -q -nln #{options[:
|
13
|
+
execute "env SHAPE_ENCODING= ogr2ogr -q -nln #{options[:id]} -f 'ESRI Shapefile'"\
|
14
14
|
" -t_srs #{options[:output_srid]} -preserve_fid '#{out_path}' '#{in_path}'"
|
15
15
|
end
|
16
16
|
end
|
@@ -1,10 +1,25 @@
|
|
1
1
|
module GeoConcerns
|
2
2
|
module Processors
|
3
3
|
module Raster
|
4
|
-
|
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
|
5
10
|
|
6
|
-
|
7
|
-
|
11
|
+
# Returns a raster processor class based on mime type passed in the directives object.
|
12
|
+
# @return raster processing class
|
13
|
+
def raster_processor_class
|
14
|
+
case directives.fetch(:input_format)
|
15
|
+
when 'text/plain; gdal-format=USGSDEM'
|
16
|
+
GeoConcerns::Processors::Raster::Dem
|
17
|
+
when 'application/octet-stream; gdal-format=AIG'
|
18
|
+
GeoConcerns::Processors::Raster::Aig
|
19
|
+
else
|
20
|
+
GeoConcerns::Processors::Raster::Base
|
21
|
+
end
|
22
|
+
end
|
8
23
|
end
|
9
24
|
end
|
10
25
|
end
|
@@ -4,6 +4,7 @@ module GeoConcerns
|
|
4
4
|
class Base < Hydra::Derivatives::Processors::Processor
|
5
5
|
include Hydra::Derivatives::Processors::ShellBasedProcessor
|
6
6
|
include GeoConcerns::Processors::BaseGeoProcessor
|
7
|
+
include GeoConcerns::Processors::Image
|
7
8
|
include GeoConcerns::Processors::Gdal
|
8
9
|
|
9
10
|
def self.encode(path, options, output_file)
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'simpler_tiles'
|
2
|
+
|
3
|
+
module GeoConcerns
|
4
|
+
module Processors
|
5
|
+
module Rendering
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
included do
|
8
|
+
# Renders a thumbnail from a vector dataset.
|
9
|
+
# @param in_path [String] file input path
|
10
|
+
# @param out_path [String] processor output file path
|
11
|
+
# @param options [Hash] creation options
|
12
|
+
def self.vector_thumbnail(in_path, out_path, options)
|
13
|
+
map = GeoConcerns::Processors::Rendering.simple_tiles_map(in_path, options)
|
14
|
+
File.open(out_path, 'wb') { |f| f.write map.to_png }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
# Builds a simple tiles map from a shapefile.
|
20
|
+
# @param in_path [String] file input path
|
21
|
+
# @param options [Hash] creation
|
22
|
+
# @return [SimplerTiles::Map] simple tiles map
|
23
|
+
def simple_tiles_map(in_path, options)
|
24
|
+
assign_rendering_options(in_path, options)
|
25
|
+
size = rendering_size(options)
|
26
|
+
SimplerTiles::Map.new do |m|
|
27
|
+
m.srs = 'EPSG:4326'
|
28
|
+
m.bgcolor = SimplerTiles.config.bg_color
|
29
|
+
m.width = size[0]
|
30
|
+
m.height = size[1]
|
31
|
+
m.set_bounds(*simple_tiles_bounds(options))
|
32
|
+
add_shapefile_layer(in_path, m)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Adds a shapefile layer to a simple tiles map.
|
39
|
+
# @param in_path [String] file input path
|
40
|
+
# @param options [Hash] creation options
|
41
|
+
def add_shapefile_layer(in_path, map)
|
42
|
+
Dir.glob("#{in_path}/*.shp").each do |shp|
|
43
|
+
map.layer shp do |l|
|
44
|
+
l.query "select * from '#{File.basename shp, '.shp'}'" do |q|
|
45
|
+
q.styles SimplerTiles.config.to_h
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Re-orders options bounds for use with a simple tiles map.
|
52
|
+
# @param options [Hash] creation options
|
53
|
+
# @return [Array] simple tiles map bounds
|
54
|
+
def simple_tiles_bounds(options)
|
55
|
+
[options[:bounds][:east],
|
56
|
+
options[:bounds][:north],
|
57
|
+
options[:bounds][:west],
|
58
|
+
options[:bounds][:south]]
|
59
|
+
end
|
60
|
+
|
61
|
+
# Transforms the size directive into an array.
|
62
|
+
# @param options [Hash] creation options
|
63
|
+
# @return [Array] derivative size
|
64
|
+
def rendering_size(options)
|
65
|
+
options[:output_size].split(' ').map(&:to_i)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Assigns new values from the vector info command to the creation options hash.
|
69
|
+
# @param in_path [String] file input path
|
70
|
+
# @param options [Hash] creation options
|
71
|
+
def assign_rendering_options(in_path, options)
|
72
|
+
vector_info = GeoConcerns::Processors::Vector::Info.new(in_path)
|
73
|
+
options[:name] = vector_info.name
|
74
|
+
options[:bounds] = vector_info.bounds
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|