Reverse interogare o locație în Rails-geocoder cu atributul distanta de max

voturi
1

De exemplu, am un model ca acesta

class Place < ActiveRecord::Base
    # has a latitude & longitude field
    # notice it has max_distance field (meter), will be different on each record
end

Cum pot realiza o interogare că, având un punct de coordonate, va primi toate locurile în termen în intervalul între distanța punct și câmpul MAX_DISTANCE de coordonate.

lat = 37.792
lng = -122.393

Place.query_in_range_by_point([lat, lng])
# will get nearest places within range max_distance field 

Am fost în căutarea în geocoder & documentație bijuterie Geo-Kit-ul, dar nu a fost găsit nici o funcționalitate de genul asta.

Dacă nu gem de mai sus acceptată funcționalitatea, poate cineva sugera o altă metodă care poate rezolva problema?

Mulțumiri

Întrebat 20/01/2018 la 12:53
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
0

Cred că nearfuncțiile de geocoder poate satisface cerința dumneavoastră.

class Place < ActiveRecord::Base
  def self.query_in_range_by_point(lat, lng)
    self.near([lat, lng], self.max_distance)
  end
end

Document geocoder se referă la această funcție: https://github.com/alexreisner/geocoder#for-activerecord-models

Publicat 20/01/2018 la 13:29
sursa de către utilizator

voturi
0

Îmi pare rău că am posta acest lucru ca un răspuns, dar formatarea este oprit atunci când postați mostre de cod în secțiunea de comentarii.

....

de loc, adică având latitude, longitude, max_distanceproprietăți, pentru că în cazul în care este cazul, atunci s -ar putea nevoie doar de

class Place < AR::Base
  ...
  def nearby_places
    Place.where.not(id: id).near([latitude, longitude], max_distance)
  end
  ...
end

Pentru a avea acces la aceste locuri din apropiere, nu doar:

place = Place.first
nearby_places = place.nearby_places
Publicat 20/01/2018 la 14:30
sursa de către utilizator

voturi
1

Cred că următorul patch-uri poate rezolva problema.

Creați următorul fișier de configurare / initializatori / geokit_rails_patch.rb

module Geokit::ActsAsMappable
  module ClassMethods
    def query_in_range_by_point(options = {})
      sql = build_distance_sql(options)

      where("#{sql} <= #{table_name}.max_distance")
    end

    private

    def build_distance_sql(options)
      origin = extract_origin_from_options(options)
      units = extract_units_from_options(options)
      formula = extract_formula_from_options(options)

      distance_sql(origin, units, formula)
    end
  end
end

Apoi, puteți interoga ca

Place.query_in_range_by_point(origin: [-23.5062855, -55.0919171])

Publicat 28/02/2018 la 20:44
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more