spatial_features 2.10.4 → 2.10.9
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 +4 -0
- data/lib/spatial_features/has_spatial_features.rb +7 -8
- data/lib/spatial_features/importers/file.rb +5 -1
- data/lib/spatial_features/importers/shapefile.rb +1 -1
- data/lib/spatial_features/unzip.rb +5 -1
- data/lib/spatial_features/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a716f42ee3c557baa01ea0a9e209f58e7bfb94163059057c7ff6fe303018de09
|
4
|
+
data.tar.gz: 17b0fa1251fb09c2aef8d45f82adb89e2e5e141110c3b1a659b8f2b30ab28f07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3281304f2c534c57c98a2842cbf4cd77b14c59f3d54169c9ef0e39bd78b1f07e8ab775fe05cf575ee3f7443a3b13468638bebf3a7508e2931acfd0f4bacc96ea
|
7
|
+
data.tar.gz: aaf5163cd6403673d418943585b20bd4817e6bfd4885fe08f4e663d29d003adfaa80e480f69554fe4f31522e4cbd9e695ac38c19d9797bbfe1d1c0fba5ccef4e
|
@@ -131,7 +131,7 @@ module SpatialFeatures
|
|
131
131
|
scope = scope.select(options[:columns])
|
132
132
|
|
133
133
|
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]
|
134
|
+
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
135
|
|
136
136
|
return scope
|
137
137
|
end
|
@@ -141,13 +141,12 @@ module SpatialFeatures
|
|
141
141
|
def spatial_join(other, buffer = 0, table_alias = 'features', other_alias = 'other_features', geom = 'geom_lowres')
|
142
142
|
scope = features_scope(self).select("#{geom} AS geom").select(:spatial_model_id)
|
143
143
|
|
144
|
-
other_scope = features_scope(other)
|
145
|
-
other_scope_select_sql = "ST_Union(#{geom})"
|
146
|
-
other_scope_select_sql = "ST_Buffer(#{other_scope_select_sql}, #{buffer})" if buffer&.positive?
|
147
|
-
other_scope = other_scope.select("ST_Union(#{geom}) AS geom").select("#{other_scope_select_sql} AS buffered_geom")
|
148
|
-
|
144
|
+
other_scope = features_scope(other).select("ST_Union(#{geom}) AS geom")
|
149
145
|
return joins(%Q(INNER JOIN (#{scope.to_sql}) AS #{table_alias} ON #{table_alias}.spatial_model_id = #{table_name}.id))
|
150
|
-
.joins(%Q(INNER JOIN (#{other_scope.to_sql}) AS #{other_alias}
|
146
|
+
.joins(%Q(INNER JOIN (#{other_scope.to_sql}) AS #{other_alias}
|
147
|
+
ON NOT ST_IsEmpty(#{table_alias}.geom) -- Can't ST_DWithin empty geometry
|
148
|
+
AND NOT ST_IsEmpty(#{other_alias}.geom) -- Can't ST_DWithin empty geometry
|
149
|
+
AND ST_DWithin(#{table_alias}.geom, #{other_alias}.geom, #{buffer})))
|
151
150
|
end
|
152
151
|
|
153
152
|
def features_scope(other)
|
@@ -184,7 +183,7 @@ module SpatialFeatures
|
|
184
183
|
end
|
185
184
|
|
186
185
|
def intersects?(other)
|
187
|
-
self.class.intersecting(other).exists?(
|
186
|
+
self.class.unscoped { self.class.intersecting(other).exists?(id) }
|
188
187
|
end
|
189
188
|
|
190
189
|
def total_intersection_area_percentage(klass)
|
@@ -4,7 +4,11 @@ module SpatialFeatures
|
|
4
4
|
module Importers
|
5
5
|
class File < SimpleDelegator
|
6
6
|
def initialize(data, *args)
|
7
|
-
|
7
|
+
begin
|
8
|
+
file = Download.open(data, unzip: [/\.kml$/, /\.shp$/], downcase: true)
|
9
|
+
rescue Unzip::PathNotFound
|
10
|
+
raise ImportError, "Archive did not contain a .kml or .shp file. Supported formats are KMZ, KML, and zipped ArcGIS shapefiles."
|
11
|
+
end
|
8
12
|
|
9
13
|
case ::File.extname(file.path.downcase)
|
10
14
|
when '.kml'
|
@@ -26,7 +26,7 @@ module SpatialFeatures
|
|
26
26
|
rescue Errno::ENOENT => e
|
27
27
|
case e.message
|
28
28
|
when /No such file or directory @ rb_sysopen - (.+)/
|
29
|
-
raise IncompleteShapefileArchive, "Shapefile archive
|
29
|
+
raise IncompleteShapefileArchive, "Shapefile archive is missing a required file: #{::File.basename($1)}"
|
30
30
|
else
|
31
31
|
raise e
|
32
32
|
end
|
@@ -7,7 +7,7 @@ module SpatialFeatures
|
|
7
7
|
|
8
8
|
if find = Array.wrap(find).presence
|
9
9
|
paths = paths.detect {|path| find.any? {|pattern| path.index(pattern) } }
|
10
|
-
raise(
|
10
|
+
raise(PathNotFound, "Archive did not contain a file matching #{find}") unless paths.present?
|
11
11
|
end
|
12
12
|
|
13
13
|
return paths
|
@@ -44,5 +44,9 @@ module SpatialFeatures
|
|
44
44
|
rescue EOFError
|
45
45
|
return false
|
46
46
|
end
|
47
|
+
|
48
|
+
# EXCEPTIONS
|
49
|
+
|
50
|
+
class PathNotFound < StandardError; end
|
47
51
|
end
|
48
52
|
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: 2.10.
|
4
|
+
version: 2.10.9
|
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-05-
|
12
|
+
date: 2020-05-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -18,9 +18,9 @@ dependencies:
|
|
18
18
|
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '4.2'
|
21
|
-
- - "
|
21
|
+
- - "<"
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: '5.
|
23
|
+
version: '5.2'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -28,9 +28,9 @@ dependencies:
|
|
28
28
|
- - ">="
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: '4.2'
|
31
|
-
- - "
|
31
|
+
- - "<"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '5.
|
33
|
+
version: '5.2'
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: delayed_job_active_record
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|