Zpětného vyhledávání umístění v Rails-Geocoder s maximální vzdáleností atributem

hlasů
1

Pro příklad, mám model takového

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

Jak mohu dosáhnout dotaz, který daný souřadnicový bod, bude mít všechna místa uvnitř v rozmezí od vzdálenosti bodu a MAX_DISTANCE pole souřadnic.

lat = 37.792
lng = -122.393

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

Hledala jsem v Geocoder & gem dokumentaci Geo-Kit, ale nenašli žádnou funkci takového.

Pokud gem výše nepodporuje funkci, může kdokoliv navrhnout jiný způsob, který může vyřešit tento problém?

dík

Položena 20/01/2018 v 12:53
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
0

Domnívám se, že nearfunkce Geocoder může uspokojit vaše požadavky.

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

Geocoder dokumentu odkazují na tuto funkci: https://github.com/alexreisner/geocoder#for-activerecord-models

Odpovězeno 20/01/2018 v 13:29
zdroj uživatelem

hlasů
0

Omlouvám se, že jsem toto vysílání jako odpověď, ale formátování je vypnutý, když vysílání ukázky kódu v sekci komentáře.

....

podle místa, myslím, mající latitude, longitude, max_distancevlastnosti, protože pokud tomu tak je, pak budete potřebovat pouze

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

Pro přístup k těmto míst v okolí, to prostě udělat:

place = Place.first
nearby_places = place.nearby_places
Odpovězeno 20/01/2018 v 14:30
zdroj uživatelem

hlasů
1

Myslím, že následující opravu lze tento problém vyřešit.

Vytvořte následující soubor config / inicializátory / 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

Potom můžete dotaz líbí

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

Odpovězeno 28/02/2018 v 20:44
zdroj uživatelem

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