spatial_features 1.0.2 → 1.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2502710a77234436e9df31b696307aec48406c4c
4
- data.tar.gz: 256709db267694b3313f8b848f4b8273e0d1ae40
3
+ metadata.gz: 53382056faffc16249a7d7787da478f0c5304642
4
+ data.tar.gz: b28b4a4c8048dc8e25714bd3e8b9a05c6b148962
5
5
  SHA512:
6
- metadata.gz: def0c22906ea9400a2b5985e53af034bb83b23f1d554cedc1400e0ca3e39265ea7900c8f10366d44bf1a2f29a26fe879f5230a3b06638ef1157faf61cc8f745d
7
- data.tar.gz: cdf4ca117eee31b4885fda6a1267b1284ebaed3efbc29202ceeacaef2e679c49e079c203df09af6af1446c201f9e9d7d86cc23ce84a439dd3489046d83645298
6
+ metadata.gz: 80d53442af20766b25679809a8f0ceddad23ec8f2ca97362392b4002cfd6653f4be70aea30e97314be84a863268b28c622bd33af3d326e7c655c402c0e12f182
7
+ data.tar.gz: bde880afe16008e1060563432b73daf032af42d6c4bca901435f81fc0e430eecc9ff0023ebc07db214ab12dc695a9407edf1df73476e26f807dac13ae13beb3c
@@ -11,6 +11,8 @@ require 'spatial_features/models/feature'
11
11
  require 'spatial_features/models/spatial_cache'
12
12
  require 'spatial_features/models/spatial_proximity'
13
13
 
14
+ require 'spatial_features/workers/arcgis_update_features_job'
15
+
14
16
  require 'spatial_features/engine'
15
17
 
16
18
  module SpatialFeatures
@@ -1,6 +1,24 @@
1
1
  module SpatialExtensions
2
2
  private
3
3
 
4
+ def abstract_refresh_geometry_action(model, cache_classes)
5
+ queue = "#{model.class}/#{model.id}/update_features"
6
+
7
+ # Destroy old failed jobs
8
+ Delayed::Job.where(:queue => queue).where.not(:failed_at => nil).destroy_all
9
+
10
+ Delayed::Job.enqueue(
11
+ ArcGISUpdateFeaturesJob.new(
12
+ :spatial_model_type => model.class,
13
+ :spatial_model_id => model.id,
14
+ :cache_classes => cache_classes
15
+ ),
16
+ :queue => queue
17
+ )
18
+
19
+ redirect_to :back
20
+ end
21
+
4
22
  def abstract_proximity_action(scope, target, distance, &block)
5
23
  @nearby_records = scope_for_search(scope).within_buffer(target, distance, :distance => true, :intersection_area => true).order('distance_in_meters ASC, intersection_area_in_square_meters DESC, id ASC')
6
24
  @target = target
@@ -28,6 +28,14 @@ module ArcGISKmzFeatures
28
28
  return true
29
29
  end
30
30
 
31
+ def updating_features?
32
+ Delayed::Job.where(queue: "#{self.class}/#{self.id}/update_features", failed_at: nil).exists?
33
+ end
34
+
35
+ def feature_update_error
36
+ (Delayed::Job.where(queue: "#{self.class}/#{self.id}/update_features").where.not(failed_at: nil).first.try(:last_error) || '').split("\n").first
37
+ end
38
+
31
39
  private
32
40
 
33
41
  def replace_features(kml_array)
@@ -29,7 +29,7 @@ module SpatialFeatures
29
29
  if options[:target]
30
30
  sql <<
31
31
  "INNER JOIN features
32
- ON features.spatial_model_type = '#{options[:target].class}' AND features.spatial_model_id = #{options[:target].id} AND ST_Intersects(features.geom, venn_polygons.geom)"
32
+ ON features.spatial_model_type = '#{options[:target].class}' AND features.spatial_model_id = #{options[:target].id} AND ST_Intersects(features.geom, venn_polygons.geom) "
33
33
  end
34
34
 
35
35
  # Join with the original polygons so we can determine which original polygons each venn polygon came from
@@ -1,3 +1,3 @@
1
1
  module SpatialFeatures
2
- VERSION = "1.0.2"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -0,0 +1,39 @@
1
+ class ArcGISUpdateFeaturesJob < Struct.new(:options)
2
+ def perform
3
+ model = options[:spatial_model_type].find(options[:spatial_model_id])
4
+
5
+ if model.update_features!
6
+ options[:cache_classes].each {|klass| SpatialFeatures.cache_record_proximity(model, klass) }
7
+ end
8
+ rescue => e
9
+ raise "Can't refresh geometry: #{normalize_message(e.message)}"
10
+ end
11
+
12
+ private
13
+
14
+ def normalize_message(message)
15
+ if message =~ /\Agetaddrinfo/
16
+ "ArcGIS Server is not responding."
17
+ elsif message =~ /invalid KML representation/
18
+ invalid_kml_reason(message) || "invalid KML being generated by ArcGIS."
19
+ elsif message =~ /Self-intersection/
20
+ message.scan(/\[(\d+(?:\.\d+)?) (\d+(?:\.\d+)?)\]/).each do |lng, lat|
21
+ "Self-intersection at #{lng},#{lat}"
22
+ end.join(', ')
23
+ else
24
+ message
25
+ end
26
+ end
27
+
28
+ NUMBER_REGEX = /-?\d+\.\d+/
29
+ COORDINATE_REGEX = /<LinearRing><coordinates>\s*((?:#{NUMBER_REGEX},#{NUMBER_REGEX},#{NUMBER_REGEX}\s*)+)<\/coordinates><\/LinearRing>/
30
+ def invalid_kml_reason(message)
31
+ message.scan(COORDINATE_REGEX) do |match|
32
+ coords = match[0].split(/(?:,0\.0+)?\s+/).chunk {|c| c }.map(&:first)
33
+
34
+ return "KML ring doesn't have enough points #{coords.first}" if coords.length < 4
35
+ end
36
+
37
+ return nil
38
+ end
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spatial_features
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Wallace
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-15 00:00:00.000000000 Z
12
+ date: 2015-01-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -25,6 +25,20 @@ dependencies:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '4.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: delayed_job_active_record
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
28
42
  - !ruby/object:Gem::Dependency
29
43
  name: pg
30
44
  requirement: !ruby/object:Gem::Requirement
@@ -61,6 +75,7 @@ files:
61
75
  - lib/spatial_features/models/spatial_proximity.rb
62
76
  - lib/spatial_features/venn_polygons.rb
63
77
  - lib/spatial_features/version.rb
78
+ - lib/spatial_features/workers/arcgis_update_features_job.rb
64
79
  - lib/tasks/spatial_features_tasks.rake
65
80
  - test/dummy/README.rdoc
66
81
  - test/dummy/Rakefile
@@ -117,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
132
  version: '0'
118
133
  requirements: []
119
134
  rubyforge_project:
120
- rubygems_version: 2.2.2
135
+ rubygems_version: 2.4.5
121
136
  signing_key:
122
137
  specification_version: 4
123
138
  summary: Adds spatial methods to a model.