Sha256: 522e1147fb6e7712618b1d96047668b7af1022cf36b90ca428d86cd27e91fb0b

Contents?: true

Size: 1.28 KB

Versions: 2

Compression:

Stored size: 1.28 KB

Contents

require_dependency SpatialFeatures::Engine.root.join('app/models/abstract_feature')

class AggregateFeature < AbstractFeature
  has_many :features, lambda { |aggregate| where(:spatial_model_type => aggregate.spatial_model_type) }, :foreign_key => :spatial_model_id, :primary_key => :spatial_model_id

  # Aggregate the features for the spatial model into a single feature
  def refresh
    feature_array_sql = <<~SQL
      ARRAY[
        (#{features.select('ST_Multi(ST_Union(ST_CollectionExtract(geog::geometry, 1)))').to_sql}),
        (#{features.select('ST_Multi(ST_Union(ST_CollectionExtract(geog::geometry, 2)))').to_sql}),
        (#{features.select('ST_Multi(ST_Union(ST_CollectionExtract(geog::geometry, 3)))').to_sql})
      ]
    SQL

    # Remove empty features so ST_COLLECT doesn't choke. This seems to be a difference between PostGIS 2.x and 3.x
    compacted_feature_array_sql = <<~SQL
      array_remove(
        array_remove(
          array_remove(#{feature_array_sql},
          ST_GeomFromText('MultiPoint EMPTY')),
        ST_GeomFromText('MultiLinestring EMPTY')),
      ST_GeomFromText('MultiPolygon EMPTY'))
    SQL

    self.geog = ActiveRecord::Base.connection.select_value <<~SQL
      SELECT ST_Collect(#{compacted_feature_array_sql})::geography
    SQL
    self.save!
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
spatial_features-2.9.3 app/models/aggregate_feature.rb
spatial_features-2.9.2 app/models/aggregate_feature.rb