Class: FacilitiesQuery::BoundingBoxQuery

Inherits:
Base
  • Object
show all
Defined in:
app/models/facilities_query/bounding_box_query.rb

Instance Attribute Summary

Attributes inherited from Base

#params

Instance Method Summary collapse

Methods inherited from Base

#get_facility_data, #ids_for_types, #initialize, #service_condition

Constructor Details

This class inherits a constructor from FacilitiesQuery::Base

Instance Method Details

#build_result_set(bbox_num, type, services) ⇒ Object



20
21
22
23
24
25
# File 'app/models/facilities_query/bounding_box_query.rb', line 20

def build_result_set(bbox_num, type, services)
  lats = bbox_num.values_at(1, 3)
  longs = bbox_num.values_at(2, 0)
  conditions = { lat: (lats.min..lats.max), long: (longs.min..longs.max) }
  BaseFacility::TYPES.flat_map { |facility_type| get_facility_data(conditions, type, facility_type, services) }
end

#dist_from_center(bbox) ⇒ Object

Naive distance calculation, but accurate enough for map display sorting. If greater precision is ever needed, use Haversine formula.



12
13
14
15
16
17
18
# File 'app/models/facilities_query/bounding_box_query.rb', line 12

def dist_from_center(bbox)
  lambda do |facility|
    center_x = (bbox[0] + bbox[2]) / 2.0
    center_y = (bbox[1] + bbox[3]) / 2.0
    Math.sqrt((facility.long - center_x)**2 + (facility.lat - center_y)**2)
  end
end

#runObject



5
6
7
8
# File 'app/models/facilities_query/bounding_box_query.rb', line 5

def run
  bbox_num = @params[:bbox].map { |x| Float(x) }
  build_result_set(bbox_num, @params[:type], @params[:services]).sort_by(&(dist_from_center bbox_num))
end