Odwrotne zapytanie o położenie w Szyny geocoder z atrybut maksymalnej odległości

głosy
1

Na przykład, mam model takiego

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

Jak mogę osiągnąć zapytanie, które dany punkt współrzędnych, dostanie wszystkie miejsca wewnątrz w zakresie odległości między punktem i pole MAX_DISTANCE współrzędnych.

lat = 37.792
lng = -122.393

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

Szukałem w geocoder & Geo-Kit dokumentacji gem, ale nie znaleziono żadnych funkcji takiego.

Jeśli gem nie wspiera funkcjonalności powyżej, może ktoś zasugerować inną metodę, która może rozwiązać ten problem?

Dzięki

Utwórz 20/01/2018 o 12:53
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

Myślę, że nearfunkcje geocoder może spełnić swoje wymagania.

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

Dokument geocoder odnoszą się do tej funkcji: https://github.com/alexreisner/geocoder#for-activerecord-models

Odpowiedział 20/01/2018 o 13:29
źródło użytkownik

głosy
0

Niestety jestem delegowania to jako odpowiedź, ale formatowanie jest wyłączony podczas wysyłania próbki kodu w sekcji komentarzy.

....

według miejsca, to znaczy mający latitude, longitude, max_distancewłaściwości, bo jeśli tak jest, to może wystarczy

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

Aby uzyskać dostęp do tych miejsc w pobliżu, po prostu zrobić:

place = Place.first
nearby_places = place.nearby_places
Odpowiedział 20/01/2018 o 14:30
źródło użytkownik

głosy
1

Myślę, że po plaster może rozwiązać ten problem.

Utwórz następujący plik konfiguracyjny / inicjatorów / 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

Następnie można wyszukać jak

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

Odpowiedział 28/02/2018 o 20:44
źródło użytkownik

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