Module: SpatialFeatures::ClassMethods

Defined in:
lib/spatial_features/has_spatial_features.rb

Instance Method Summary collapse

Instance Method Details

#acts_like_spatial_features?Boolean

Returns:

  • (Boolean)


35
36
37
# File 'lib/spatial_features/has_spatial_features.rb', line 35

def acts_like_spatial_features?
  true
end

#aggregate_featuresObject



84
85
86
87
88
89
90
91
# File 'lib/spatial_features/has_spatial_features.rb', line 84

def aggregate_features
  type = base_class.to_s # Rails stores polymorphic foreign keys as the base class
  if all == unscoped
    AggregateFeature.where(:spatial_model_type => type)
  else
    AggregateFeature.where(:spatial_model_type => type, :spatial_model_id => all.unscope(:select))
  end
end

#area_in_square_metersObject



103
104
105
# File 'lib/spatial_features/has_spatial_features.rb', line 103

def area_in_square_meters
  features.area_in_square_meters
end

#featuresObject



75
76
77
78
79
80
81
82
# File 'lib/spatial_features/has_spatial_features.rb', line 75

def features
  type = base_class.to_s # Rails stores polymorphic foreign keys as the base class
  if all == unscoped
    Feature.where(:spatial_model_type => type)
  else
    Feature.where(:spatial_model_type => type, :spatial_model_id => all.unscope(:select))
  end
end

#features_cache_keyObject

Add methods to generate cache keys for a record or all records of this class NOTE: features are never updated, only deleted and created, therefore we can tell if they have changed by finding the maximum id and count instead of needing timestamps



42
43
44
45
# File 'lib/spatial_features/has_spatial_features.rb', line 42

def features_cache_key
  # Do two separate queries because it is much faster for some reason
  "#{name}/#{features.cache_key}"
end

#has_features_area?Boolean

Returns true if the model stores a cache of the features area

Returns:

  • (Boolean)


99
100
101
# File 'lib/spatial_features/has_spatial_features.rb', line 99

def has_features_area?
  column_names.include? 'features_area'
end

#has_spatial_features_hash?Boolean

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

Returns:

  • (Boolean)


94
95
96
# File 'lib/spatial_features/has_spatial_features.rb', line 94

def has_spatial_features_hash?
  column_names.include? 'features_hash'
end

#intersecting(other, options = {}) ⇒ Object



47
48
49
# File 'lib/spatial_features/has_spatial_features.rb', line 47

def intersecting(other, options = {})
  within_buffer(other, 0, options)
end

#linesObject



67
68
69
# File 'lib/spatial_features/has_spatial_features.rb', line 67

def lines
  features.lines
end

#pointsObject



71
72
73
# File 'lib/spatial_features/has_spatial_features.rb', line 71

def points
  features.points
end

#polygonsObject



63
64
65
# File 'lib/spatial_features/has_spatial_features.rb', line 63

def polygons
  features.polygons
end

#within_buffer(other, buffer_in_meters = 0, options = {}) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/spatial_features/has_spatial_features.rb', line 51

def within_buffer(other, buffer_in_meters = 0, options = {})
  return none if other.is_a?(ActiveRecord::Base) && other.new_record?

  # Cache only works on single records, not scopes.
  # This is because the cached intersection_area doesn't account for overlaps between the features in the scope.
  if options[:cache] != false && other.is_a?(ActiveRecord::Base)
    cached_within_buffer_scope(other, buffer_in_meters, options)
  else
    uncached_within_buffer_scope(other, buffer_in_meters, options)
  end
end