spatial_features 3.4.8 → 3.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -0
- data/app/models/abstract_feature.rb +2 -14
- data/app/models/feature.rb +0 -2
- data/lib/spatial_features/has_spatial_features/queued_spatial_processing.rb +6 -5
- data/lib/spatial_features/importers/kml.rb +1 -1
- data/lib/spatial_features/importers/shapefile.rb +1 -2
- data/lib/spatial_features/version.rb +1 -1
- metadata +28 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58ed4738a69dce88104f9ad09ad32dc9f6ebe8819e6bd4bd87c30ea7bde58c70
|
4
|
+
data.tar.gz: b70f376893db22e801ce2b1535c26390f02a754a6884938713ad292cac7432da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e0aa77934a5e00d891bb22adc72e3779267193035deaad0e236ced895c0565c06a6d4b81218e2d2708a493f9913fefdec10cac6e64b40d105cb0e0518f57ec4
|
7
|
+
data.tar.gz: 9456cac927abb58f4710cbbc6366e5f906c93460e68013be9bd48cef90340d2ccf3d43d29e8ac8dff1752fc1c3950030aa494fbaffb3ca91e8ffc3ee179d8876
|
data/README.md
CHANGED
@@ -200,6 +200,23 @@ add_index :features, :source_identifier
|
|
200
200
|
MyModel.update_features!(:force => true) # Force an `update_features!` will populate the source_identifier column.
|
201
201
|
```
|
202
202
|
|
203
|
+
## Upgrading From 3.4 to 3.5
|
204
|
+
The gem now relies on virtual columns to set a number of derived column values.
|
205
|
+
```ruby
|
206
|
+
change_table :features do |t|
|
207
|
+
t.remove :tilegeom, :feature_type, :centroid, :area, :north, :east, :south, :west
|
208
|
+
|
209
|
+
t.virtual :tilegeom, :type => 'geometry(Geometry,3857)', as: "ST_Transform(geom, 3857)", stored: true, :index => { :using => :gist }
|
210
|
+
t.virtual :feature_type, :type => :string, as: "CASE GeometryType(geog) WHEN 'POLYGON' THEN 'polygon' WHEN 'MULTIPOLYGON' THEN 'polygon' WHEN 'GEOMETRYCOLLECTION' THEN 'polygon' WHEN 'LINESTRING' THEN 'line' WHEN 'MULTILINESTRING' THEN 'line' WHEN 'POINT' THEN 'point' WHEN 'MULTIPOINT' THEN 'point' END", stored: true, :index => true
|
211
|
+
t.virtual :centroid, :type => :geography, as: "ST_PointOnSurface(geog::geometry)", stored: true
|
212
|
+
t.virtual :area, :type => :decimal, as: "ST_Area(geog)", stored: true
|
213
|
+
t.virtual :north, :type => :decimal, as: "ST_YMax(geog::geometry)", stored: true
|
214
|
+
t.virtual :east, :type => :decimal, as: "ST_XMax(geog::geometry)", stored: true
|
215
|
+
t.virtual :south, :type => :decimal, as: "ST_YMin(geog::geometry)", stored: true
|
216
|
+
t.virtual :west, :type => :decimal, as: "ST_XMin(geog::geometry)", stored: true
|
217
|
+
end
|
218
|
+
```
|
219
|
+
|
203
220
|
## Testing
|
204
221
|
|
205
222
|
Create a postgres database:
|
@@ -13,7 +13,6 @@ class AbstractFeature < ActiveRecord::Base
|
|
13
13
|
|
14
14
|
FEATURE_TYPES = %w(polygon point line)
|
15
15
|
|
16
|
-
before_validation :sanitize_feature_type
|
17
16
|
validates_presence_of :geog
|
18
17
|
validate :validate_geometry, if: :will_save_change_to_geog?
|
19
18
|
before_save :sanitize, if: :will_save_change_to_geog?
|
@@ -113,13 +112,7 @@ class AbstractFeature < ActiveRecord::Base
|
|
113
112
|
|
114
113
|
def self.cache_derivatives(options = {})
|
115
114
|
update_all <<-SQL.squish
|
116
|
-
geom = ST_Transform(geog::geometry, #{detect_srid('geom')})
|
117
|
-
north = ST_YMax(geog::geometry),
|
118
|
-
east = ST_XMax(geog::geometry),
|
119
|
-
south = ST_YMin(geog::geometry),
|
120
|
-
west = ST_XMin(geog::geometry),
|
121
|
-
area = ST_Area(geog),
|
122
|
-
centroid = ST_PointOnSurface(geog::geometry)
|
115
|
+
geom = ST_Transform(geog::geometry, #{detect_srid('geom')})
|
123
116
|
SQL
|
124
117
|
|
125
118
|
invalid('geom').update_all <<-SQL.squish
|
@@ -127,8 +120,7 @@ class AbstractFeature < ActiveRecord::Base
|
|
127
120
|
SQL
|
128
121
|
|
129
122
|
update_all <<-SQL.squish
|
130
|
-
geom_lowres = ST_SimplifyPreserveTopology(geom, #{options.fetch(:lowres_simplification, lowres_simplification)})
|
131
|
-
tilegeom = ST_Transform(geom, 3857)
|
123
|
+
geom_lowres = ST_SimplifyPreserveTopology(geom, #{options.fetch(:lowres_simplification, lowres_simplification)})
|
132
124
|
SQL
|
133
125
|
|
134
126
|
invalid('geom_lowres').update_all <<-SQL.squish
|
@@ -286,10 +278,6 @@ class AbstractFeature < ActiveRecord::Base
|
|
286
278
|
return error.fetch('invalid_geometry_message') if error
|
287
279
|
end
|
288
280
|
|
289
|
-
def sanitize_feature_type
|
290
|
-
self.feature_type = FEATURE_TYPES.find {|type| self.feature_type.to_s.strip.downcase.include?(type) }
|
291
|
-
end
|
292
|
-
|
293
281
|
def sanitize_input_for_sql(input)
|
294
282
|
self.class.send(:sanitize_sql_for_conditions, input)
|
295
283
|
end
|
data/app/models/feature.rb
CHANGED
@@ -11,8 +11,6 @@ class Feature < AbstractFeature
|
|
11
11
|
|
12
12
|
scope :source_identifier, lambda {|source_identifier| where(:source_identifier => source_identifier) if source_identifier.present? }
|
13
13
|
|
14
|
-
validates_inclusion_of :feature_type, :in => FEATURE_TYPES
|
15
|
-
|
16
14
|
before_save :truncate_name
|
17
15
|
|
18
16
|
after_save :refresh_aggregate, if: :automatically_refresh_aggregate?
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module SpatialFeatures
|
2
2
|
module QueuedSpatialProcessing
|
3
3
|
extend ActiveSupport::Concern
|
4
|
+
mattr_accessor :priority_offset, default: 0 # Offsets the queued priority of spatial tasks. Lower numbers run with higher priority
|
4
5
|
|
5
6
|
def self.update_cached_status(record, method_name, state)
|
6
7
|
return unless record.has_attribute?(:spatial_processing_status_cache)
|
@@ -11,12 +12,12 @@ module SpatialFeatures
|
|
11
12
|
record.update_column(:spatial_processing_status_cache, cache) if record.will_save_change_to_spatial_processing_status_cache?
|
12
13
|
end
|
13
14
|
|
14
|
-
def queue_update_spatial_cache(*args, **kwargs)
|
15
|
-
queue_spatial_task('update_spatial_cache', *args, **kwargs)
|
15
|
+
def queue_update_spatial_cache(*args, priority: priority_offset + 1, **kwargs)
|
16
|
+
queue_spatial_task('update_spatial_cache', *args, priority:, **kwargs)
|
16
17
|
end
|
17
18
|
|
18
|
-
def delay_update_features!(*args, **kwargs)
|
19
|
-
queue_spatial_task('update_features!', *args, **kwargs)
|
19
|
+
def delay_update_features!(*args, priority: priority_offset + 0, **kwargs)
|
20
|
+
queue_spatial_task('update_features!', *args, priority:, **kwargs)
|
20
21
|
end
|
21
22
|
|
22
23
|
def updating_features?(**options)
|
@@ -77,7 +78,7 @@ module SpatialFeatures
|
|
77
78
|
|
78
79
|
def queue_spatial_task(method_name, *args, priority: 1, **kwargs)
|
79
80
|
# NOTE: We pass kwargs as an arg because Delayed::Job does not support separation of positional and keyword arguments in Ruby 3.0. Instead we perform manual extraction in `perform`.
|
80
|
-
Delayed::Job.enqueue SpatialProcessingJob.new(self, method_name, *args, kwargs), :queue => spatial_processing_queue_name + method_name, :
|
81
|
+
Delayed::Job.enqueue SpatialProcessingJob.new(self, method_name, *args, kwargs), :queue => spatial_processing_queue_name + method_name, priority:
|
81
82
|
end
|
82
83
|
|
83
84
|
def spatial_processing_queue_name
|
@@ -36,7 +36,7 @@ module SpatialFeatures
|
|
36
36
|
|
37
37
|
importable_image_paths = images_from_metadata(metadata)
|
38
38
|
|
39
|
-
yield OpenStruct.new(:
|
39
|
+
yield OpenStruct.new(:geog => geog, :name => name, :metadata => metadata, :importable_image_paths => importable_image_paths)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -6,7 +6,6 @@ module SpatialFeatures
|
|
6
6
|
class Shapefile < Base
|
7
7
|
class_attribute :default_proj4_projection
|
8
8
|
|
9
|
-
FEATURE_TYPE_FOR_DIMENSION = { 0 => 'point', 1 => 'line', 2 => 'polygon' }.freeze
|
10
9
|
PROJ4_4326 = '+proj=longlat +datum=WGS84 +no_defs'.freeze
|
11
10
|
|
12
11
|
def initialize(data, proj4: nil, **options)
|
@@ -46,7 +45,7 @@ module SpatialFeatures
|
|
46
45
|
def data_from_record(record, proj4 = nil)
|
47
46
|
geometry = record.geometry
|
48
47
|
wkt = geometry.as_text
|
49
|
-
data = { :metadata => record.attributes
|
48
|
+
data = { :metadata => record.attributes }
|
50
49
|
|
51
50
|
if proj4 == PROJ4_4326
|
52
51
|
data[:geog] = wkt
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spatial_features
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Wallace
|
8
8
|
- Nicholas Jakobsen
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-01-
|
12
|
+
date: 2024-01-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -51,14 +51,14 @@ dependencies:
|
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
54
|
+
version: '3.1'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
57
|
version_requirements: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '3.
|
61
|
+
version: '3.1'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: rgeo-geojson
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,6 +101,26 @@ dependencies:
|
|
101
101
|
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: rails
|
106
|
+
requirement: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '7'
|
111
|
+
- - "<"
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '8'
|
114
|
+
type: :development
|
115
|
+
prerelease: false
|
116
|
+
version_requirements: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '7'
|
121
|
+
- - "<"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '8'
|
104
124
|
- !ruby/object:Gem::Dependency
|
105
125
|
name: pg
|
106
126
|
requirement: !ruby/object:Gem::Requirement
|
@@ -188,7 +208,7 @@ homepage: https://github.com/culturecode/spatial_features
|
|
188
208
|
licenses:
|
189
209
|
- MIT
|
190
210
|
metadata: {}
|
191
|
-
post_install_message:
|
211
|
+
post_install_message:
|
192
212
|
rdoc_options: []
|
193
213
|
require_paths:
|
194
214
|
- lib
|
@@ -203,8 +223,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
203
223
|
- !ruby/object:Gem::Version
|
204
224
|
version: '0'
|
205
225
|
requirements: []
|
206
|
-
rubygems_version: 3.
|
207
|
-
signing_key:
|
226
|
+
rubygems_version: 3.5.1
|
227
|
+
signing_key:
|
208
228
|
specification_version: 4
|
209
229
|
summary: Adds spatial methods to a model.
|
210
230
|
test_files: []
|