spatial_features 2.10.6 → 2.11.1

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
  SHA256:
3
- metadata.gz: bcb19db9366e628655a5197f84d4274271013822121071a820941237eeb86fa0
4
- data.tar.gz: ac12926f535a66226a8297f13e65dd7a2e5ef72315ecf816d4fe17d177a13b28
3
+ metadata.gz: 6c14269424ac2b30935b7f291f51080271e0932c400036bf5156223325ead8ba
4
+ data.tar.gz: d715d47e9dfa87eee07e01bc71b03dc9af5ceb6415552f24663eef9a8d81bda6
5
5
  SHA512:
6
- metadata.gz: a130a20a293bfa1f9fd79ba33bfb2f270b51bcdb612cefb054d2c48a390f66b55072a5e2a797d054b266800f2943b98cd93f6263b44fecc153e879c06b1e3d48
7
- data.tar.gz: 02cd94b02d8ae93a39f238e9ec66cd259d663943815677673c2c446621af8ccc9a0121d887445e1b8cf625c1a9d19b04eb80bc31863d350bfed860cde49f11d9
6
+ metadata.gz: 2b7fef2ae89493b544b46896136bddcd59afc470db34be530c2763cede9dca82082c695056583aa7665f03dab0c21f87d16429cc37d74682cf9ac984956c83cb
7
+ data.tar.gz: 16bc0f99d7249a85f0c48e07f0b9dd5b02058fa307c4eea20142dedf6e695b9c035528d26b26c22dc9ec420247d36a4f8476f8e5b5a0fe865bac68650d64ecfb
@@ -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 }
@@ -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
@@ -142,9 +142,11 @@ module SpatialFeatures
142
142
  scope = features_scope(self).select("#{geom} AS geom").select(:spatial_model_id)
143
143
 
144
144
  other_scope = features_scope(other).select("ST_Union(#{geom}) AS geom")
145
-
146
145
  return joins(%Q(INNER JOIN (#{scope.to_sql}) AS #{table_alias} ON #{table_alias}.spatial_model_id = #{table_name}.id))
147
- .joins(%Q(INNER JOIN (#{other_scope.to_sql}) AS #{other_alias} ON ST_DWithin(#{table_alias}.geom, #{other_alias}.geom, #{buffer})))
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})))
148
150
  end
149
151
 
150
152
  def features_scope(other)
@@ -181,7 +183,7 @@ module SpatialFeatures
181
183
  end
182
184
 
183
185
  def intersects?(other)
184
- self.class.intersecting(other).exists?(self)
186
+ self.class.unscoped { self.class.intersecting(other).exists?(id) }
185
187
  end
186
188
 
187
189
  def total_intersection_area_percentage(klass)
@@ -6,22 +6,24 @@ module SpatialFeatures
6
6
  private
7
7
 
8
8
  def each_record(&block)
9
- Nokogiri::XML(@data).css('Placemark').each do |placemark|
10
- name = placemark.css('name').text
11
- metadata = extract_metadata(placemark)
12
-
13
- {'Polygon' => 'POLYGON', 'LineString' => 'LINE', 'Point' => 'POINT'}.each do |kml_type, sql_type|
14
- placemark.css(kml_type).each do |placemark|
15
- next if blank_placemark?(placemark)
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 blank_placemark?(placemark)
24
- placemark.css('coordinates').text.blank?
25
+ def blank_feature?(feature)
26
+ feature.css('coordinates').text.blank?
25
27
  end
26
28
 
27
29
  def geom_from_kml(kml)
@@ -1,3 +1,3 @@
1
1
  module SpatialFeatures
2
- VERSION = "2.10.6"
2
+ VERSION = "2.11.1"
3
3
  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.6
4
+ version: 2.11.1
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-22 00:00:00.000000000 Z
12
+ date: 2020-06-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails