spatial_features 2.10.7 → 2.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/abstract_feature.rb +5 -0
- data/app/models/aggregate_feature.rb +1 -3
- data/lib/spatial_features/has_spatial_features.rb +11 -2
- data/lib/spatial_features/has_spatial_features/feature_import.rb +4 -3
- data/lib/spatial_features/importers/kml.rb +13 -11
- data/lib/spatial_features/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '035228e67c042788f246694fb215346e72303a7eebe7052cec11a01db0b26ab7'
|
4
|
+
data.tar.gz: 4361a0cf3ffa83dfddbe54a35717b2dd31633245fc28438dace60675a2058147
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0e3d96ed8f19a968fbb1ff9fb583091cd7a6565a86d288977baf87eeea6be0412ee52321a24a911baaeb5326d1aa32bf65c176a992d1357e0055c06ad580bb5
|
7
|
+
data.tar.gz: 796f292feae7681fd6e4f6b3785421932d9a0a00585b17a5506c25f6399047cb04119e2bcae4db48f1418cace52267821a898fcbd84c1460026bb3dd8cabae26
|
@@ -40,6 +40,11 @@ class AbstractFeature < ActiveRecord::Base
|
|
40
40
|
where(:feature_type => 'point')
|
41
41
|
end
|
42
42
|
|
43
|
+
def self.within_distance(lat, lng, distance_in_meters)
|
44
|
+
# where("ST_DWithin(features.geog, ST_SetSRID( ST_Point( -71.104, 42.315), 4326)::geography, :distance)", :lat => lat, :lng => lng, :distance => distance_in_meters)
|
45
|
+
where("ST_DWithin(features.geog, ST_Point(:lng, :lat), :distance)", :lat => lat, :lng => lng, :distance => distance_in_meters)
|
46
|
+
end
|
47
|
+
|
43
48
|
def self.area_in_square_meters(geom = 'geom_lowres')
|
44
49
|
current_scope = all.polygons
|
45
50
|
unscoped { connection.select_value(select("ST_Area(ST_Union(#{geom}))").from(current_scope, :features)).to_f }
|
@@ -14,10 +14,8 @@ class AggregateFeature < AbstractFeature
|
|
14
14
|
SQL
|
15
15
|
|
16
16
|
# Remove empty features so ST_COLLECT doesn't choke. This seems to be a difference between PostGIS 2.x and 3.x
|
17
|
-
# NOTE: ST_CollectionHomogenize is used to normalize geometry representation in order to avoid a segmentation fault
|
18
|
-
# we were seeing when intersecting complex geometry.
|
19
17
|
self.geog = ActiveRecord::Base.connection.select_value <<~SQL
|
20
|
-
SELECT COALESCE(
|
18
|
+
SELECT COALESCE(ST_Collect(unnest)::geography, ST_GeogFromText('MULTIPOLYGON EMPTY'))
|
21
19
|
FROM (SELECT unnest(#{feature_array_sql})) AS features
|
22
20
|
WHERE NOT ST_IsEmpty(unnest)
|
23
21
|
SQL
|
@@ -81,6 +81,15 @@ module SpatialFeatures
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
+
def aggregate_features
|
85
|
+
type = base_class.to_s # Rails stores polymorphic foreign keys as the base class
|
86
|
+
if all == unscoped
|
87
|
+
AggregateFeature.where(:spatial_model_type => type)
|
88
|
+
else
|
89
|
+
AggregateFeature.where(:spatial_model_type => type, :spatial_model_id => all.unscope(:select))
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
84
93
|
# Returns true if the model stores a hash of the features so we don't need to process the features if they haven't changed
|
85
94
|
def has_spatial_features_hash?
|
86
95
|
column_names.include? 'features_hash'
|
@@ -131,7 +140,7 @@ module SpatialFeatures
|
|
131
140
|
scope = scope.select(options[:columns])
|
132
141
|
|
133
142
|
scope = scope.select("ST_Distance(features.geom, other_features.geom) AS distance_in_meters") if options[:distance]
|
134
|
-
scope = scope.select("ST_Area(ST_Intersection(features.geom, other_features.geom)) AS intersection_area_in_square_meters") if options[:intersection_area]
|
143
|
+
scope = scope.select("ST_Area(ST_Intersection(ST_CollectionExtract(features.geom, 3), ST_CollectionExtract(other_features.geom, 3))) AS intersection_area_in_square_meters") if options[:intersection_area] # Use ST_CollectionExtract to avoid a segfault we've been seeing when intersecting certain geometry
|
135
144
|
|
136
145
|
return scope
|
137
146
|
end
|
@@ -183,7 +192,7 @@ module SpatialFeatures
|
|
183
192
|
end
|
184
193
|
|
185
194
|
def intersects?(other)
|
186
|
-
self.class.intersecting(other).exists?(
|
195
|
+
self.class.unscoped { self.class.intersecting(other).exists?(id) }
|
187
196
|
end
|
188
197
|
|
189
198
|
def total_intersection_area_percentage(klass)
|
@@ -67,9 +67,10 @@ module SpatialFeatures
|
|
67
67
|
private
|
68
68
|
|
69
69
|
def spatial_feature_imports(import_options, make_valid)
|
70
|
-
import_options.
|
71
|
-
|
72
|
-
|
70
|
+
import_options.flat_map do |data_method, importer_name|
|
71
|
+
Array.wrap(send(data_method)).map do |data|
|
72
|
+
spatial_importer_from_name(importer_name).new(data, :make_valid => make_valid) if data.present?
|
73
|
+
end
|
73
74
|
end.compact
|
74
75
|
end
|
75
76
|
|
@@ -6,22 +6,24 @@ module SpatialFeatures
|
|
6
6
|
private
|
7
7
|
|
8
8
|
def each_record(&block)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
yield OpenStruct.new(:feature_type => sql_type, :geog => geom_from_kml(placemark), :name => name, :metadata => metadata)
|
9
|
+
{'Polygon' => 'POLYGON', 'LineString' => 'LINE', 'Point' => 'POINT'}.each do |kml_type, sql_type|
|
10
|
+
Nokogiri::XML(@data).css(kml_type).each do |feature|
|
11
|
+
if placemark = feature.ancestors('Placemark').first
|
12
|
+
name = placemark.css('name').text
|
13
|
+
metadata = extract_metadata(placemark)
|
14
|
+
else
|
15
|
+
metadata = {}
|
18
16
|
end
|
17
|
+
|
18
|
+
next if blank_feature?(feature)
|
19
|
+
|
20
|
+
yield OpenStruct.new(:feature_type => sql_type, :geog => geom_from_kml(feature), :name => name, :metadata => metadata)
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
|
-
def
|
24
|
-
|
25
|
+
def blank_feature?(feature)
|
26
|
+
feature.css('coordinates').text.blank?
|
25
27
|
end
|
26
28
|
|
27
29
|
def geom_from_kml(kml)
|
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: 2.
|
4
|
+
version: 2.12.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: 2020-
|
12
|
+
date: 2020-06-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|