Fordított keresett egy helyet a Rails-Geocoder max távolság attribútum

szavazat
1

Példaként, van egy modell, mint ez

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

Hogyan tudok elérni egy lekérdezést, hogy adott egy koordináta pontot fog kapni minden helyen belül közötti tartományba esik távolság koordináta pont és MAX_DISTANCE területen.

lat = 37.792
lng = -122.393

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

Már keresi Geocoder & Geo-Kit gem dokumentáció, de nem találtam olyan funkciót, mint ezt.

Ha gem felett nem támogatja a funkcionalitás, tud valaki javasolni egy másik módszer, amely képes megoldani a problémát?

Kösz

A kérdést 20/01/2018 12:53
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

Úgy vélem, hogy nearfunkcióit Geocoder is megfelel a követelménynek.

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

Geocoder dokumentum utal ez a funkció: https://github.com/alexreisner/geocoder#for-activerecord-models

Válaszolt 20/01/2018 13:29
a forrás felhasználó

szavazat
0

Bocs Én kiküldetés ezt a választ, de a formázás ki, ha a kiküldetés kódmintákat a megjegyzés rovatban.

....

a helyen, azt jelentené, a latitude, longitude, max_distanceingatlan, mert ha ez a helyzet, akkor csak be kell

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

Az ilyen helyek eléréséhez közeli helyek, csak csinálni:

place = Place.first
nearby_places = place.nearby_places
Válaszolt 20/01/2018 14:30
a forrás felhasználó

szavazat
1

Úgy gondolom, hogy a következő javítást képes megoldani a problémát.

Hozza létre az alábbi fájlt config / inicializáló / 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

Akkor lehet lekérdezni, mint

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

Válaszolt 28/02/2018 20:44
a forrás felhasználó

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