spatial_features 1.5.12 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -4
- data/app/models/feature.rb +22 -22
- data/lib/spatial_features/caching.rb +14 -5
- data/lib/spatial_features/has_spatial_features.rb +1 -1
- data/lib/spatial_features/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22436d934425f3bf26fa67267809556fee323e29
|
4
|
+
data.tar.gz: 61ffeaba1a567cde42cd084c3ef058389dc10595
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f4569629dbefd9a0d2f338135229ab285471d16a2ecbe52a1db52b2f0eacb3e23d29f24547bcd9066617d8071f05a2606254faa371ebe0878b8f37e56203a50
|
7
|
+
data.tar.gz: d46d59474311d6171ebcea73a6576ae4419cb6600a6a34cdbf294210880d8812fc30afe8d77021d5645ef8df0a9455f6d4af5fceee1c0779e59ccf1792d4b83f
|
data/README.md
CHANGED
@@ -12,12 +12,16 @@ execute("
|
|
12
12
|
name character varying(255),
|
13
13
|
feature_type character varying(255),
|
14
14
|
geog geography,
|
15
|
+
geom geometry(Geometry,3005),
|
16
|
+
geom_lowres geometry(Geometry,3005),
|
15
17
|
kml text,
|
16
|
-
geog_lowres geography(Geometry,4326),
|
17
|
-
geom geometry(Geometry,26910),
|
18
|
-
metadata hstore,
|
19
18
|
kml_lowres text,
|
20
|
-
|
19
|
+
metadata hstore,
|
20
|
+
area double precision,
|
21
|
+
north numeric(9,6),
|
22
|
+
east numeric(9,6),
|
23
|
+
south numeric(9,6),
|
24
|
+
west numeric(9,6)
|
21
25
|
);
|
22
26
|
|
23
27
|
CREATE TABLE spatial_caches (
|
data/app/models/feature.rb
CHANGED
@@ -32,17 +32,15 @@ class Feature < ActiveRecord::Base
|
|
32
32
|
unscoped { connection.select_value(select('ST_Area(ST_Union(geom))').from(current_scope, :features)).to_f }
|
33
33
|
end
|
34
34
|
|
35
|
-
def self.total_intersection_area_in_square_meters(
|
36
|
-
other_features = unscoped.flattened_features.where(:id => intersecting(other).select('other_features.id'))
|
37
|
-
|
35
|
+
def self.total_intersection_area_in_square_meters(other_features)
|
38
36
|
unscoped
|
39
|
-
.from("(#{
|
40
|
-
.pluck('ST_Area(ST_Intersection(features.geom, other_features.geom))')
|
37
|
+
.from("(#{select("ST_Union(geom) AS geom").to_sql}) features, (#{other_features.to_sql}) other_features")
|
38
|
+
.pluck('ST_Area(ST_UNION(ST_Intersection(features.geom, other_features.geom)))')
|
41
39
|
.first.to_f
|
42
40
|
end
|
43
41
|
|
44
42
|
def self.intersecting(other)
|
45
|
-
join_other_features(other).where('ST_Intersects(features.
|
43
|
+
join_other_features(other).where('ST_Intersects(features.geom_lowres, other_features.geom_lowres)').uniq
|
46
44
|
end
|
47
45
|
|
48
46
|
def self.invalid
|
@@ -63,19 +61,25 @@ class Feature < ActiveRecord::Base
|
|
63
61
|
end
|
64
62
|
|
65
63
|
def self.cache_derivatives(options = {})
|
66
|
-
options.reverse_merge! :lowres_simplification =>
|
64
|
+
options.reverse_merge! :lowres_simplification => 2, :lowres_precision => 5
|
65
|
+
|
66
|
+
update_all <<-SQL.squish
|
67
|
+
geom = ST_Transform(geog::geometry, #{detect_srid('geom')}),
|
68
|
+
north = ST_YMax(geog::geometry),
|
69
|
+
east = ST_XMax(geog::geometry),
|
70
|
+
south = ST_YMin(geog::geometry),
|
71
|
+
west = ST_XMin(geog::geometry),
|
72
|
+
area = ST_Area(geog)
|
73
|
+
SQL
|
74
|
+
|
75
|
+
update_all <<-SQL.squish
|
76
|
+
geom_lowres = ST_SimplifyPreserveTopology(geom, #{options[:lowres_simplification]})
|
77
|
+
SQL
|
67
78
|
|
68
|
-
update_all
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
update_all("kml = ST_AsKML(features.geog, 6),
|
73
|
-
kml_lowres = ST_AsKML(geog_lowres::geometry, #{options[:lowres_precision]}),
|
74
|
-
north = ST_YMax(geog::geometry),
|
75
|
-
east = ST_XMax(geog::geometry),
|
76
|
-
south = ST_YMin(geog::geometry),
|
77
|
-
west = ST_XMin(geog::geometry)"
|
78
|
-
.squish)
|
79
|
+
update_all <<-SQL.squish
|
80
|
+
kml = ST_AsKML(geog, 6),
|
81
|
+
kml_lowres = ST_AsKML(geom_lowres, #{options[:lowres_precision]})
|
82
|
+
SQL
|
79
83
|
end
|
80
84
|
|
81
85
|
def feature_bounds
|
@@ -92,10 +96,6 @@ class Feature < ActiveRecord::Base
|
|
92
96
|
|
93
97
|
private
|
94
98
|
|
95
|
-
def self.flattened_features
|
96
|
-
select('ST_Union(features.geom) AS geom')
|
97
|
-
end
|
98
|
-
|
99
99
|
def self.detect_srid(column_name)
|
100
100
|
connection.select_value("SELECT Find_SRID('public', '#{table_name}', '#{column_name}')")
|
101
101
|
end
|
@@ -2,6 +2,14 @@ module SpatialFeatures
|
|
2
2
|
mattr_accessor :default_cache_buffer_in_meters
|
3
3
|
self.default_cache_buffer_in_meters = 100
|
4
4
|
|
5
|
+
def self.update_spatial_cache(scope)
|
6
|
+
scope.with_stale_spatial_cache.includes(:spatial_cache).find_each do |record|
|
7
|
+
record.spatial_cache.each do |spatial_cache|
|
8
|
+
cache_record_proximity(record, spatial_cache.intersection_model_type) if spatial_cache.stale?
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
5
13
|
# Create or update the spatial cache of a spatial class in relation to another
|
6
14
|
# NOTE: Arguments are order independent, so their names do not reflect the _a _b
|
7
15
|
# naming scheme used in other cache methods
|
@@ -41,13 +49,14 @@ module SpatialFeatures
|
|
41
49
|
end
|
42
50
|
|
43
51
|
def self.clear_record_cache(record, klass)
|
44
|
-
record.spatial_cache.where(:intersection_model_type => klass
|
45
|
-
SpatialProximity.where(:model_a_type => record.class
|
46
|
-
SpatialProximity.where(:model_b_type => record.class
|
52
|
+
record.spatial_cache.where(:intersection_model_type => klass).delete_all
|
53
|
+
SpatialProximity.where(:model_a_type => record.class, :model_a_id => record.id, :model_b_type => klass).delete_all
|
54
|
+
SpatialProximity.where(:model_b_type => record.class, :model_b_id => record.id, :model_a_type => klass).delete_all
|
47
55
|
end
|
48
56
|
|
49
57
|
def self.create_spatial_proximities(record, klass)
|
50
|
-
|
58
|
+
klass = klass.to_s.constantize
|
59
|
+
record_is_a = record.class.to_s < klass.to_s
|
51
60
|
|
52
61
|
scope = klass.within_buffer(record, default_cache_buffer_in_meters, :intersection_area => true, :distance => true, :cache => false)
|
53
62
|
scope.find_each do |klass_record|
|
@@ -63,7 +72,7 @@ module SpatialFeatures
|
|
63
72
|
def self.create_spatial_cache(model, klass)
|
64
73
|
SpatialCache.create! do |cache|
|
65
74
|
cache.spatial_model = model
|
66
|
-
cache.intersection_model_type = klass
|
75
|
+
cache.intersection_model_type = klass
|
67
76
|
cache.intersection_cache_distance = default_cache_buffer_in_meters
|
68
77
|
cache.features_hash = model.features_hash if model.has_spatial_features_hash?
|
69
78
|
end
|
@@ -234,7 +234,7 @@ module SpatialFeatures
|
|
234
234
|
module FeaturesAssociationExtensions
|
235
235
|
def area(options = {})
|
236
236
|
if options[:cache] == false || !proxy_association.owner.class.has_features_area?
|
237
|
-
|
237
|
+
pluck('ST_Area(ST_UNION(geom))').first.to_f
|
238
238
|
else
|
239
239
|
proxy_association.owner.features_area
|
240
240
|
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.
|
4
|
+
version: 1.6.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: 2016-07-
|
12
|
+
date: 2016-07-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|