Обратный запрос, расположение в Rails-геокодировщиком с максимальным расстоянием атрибута

голоса
1

Для примера, у меня есть модель, как это

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

Как можно достичь запрос, заданный координатную точку, получит все места в пределах в пределах от расстояния координат точки и поля max_distance.

lat = 37.792
lng = -122.393

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

Я смотрел в геокодировщиком и документации гем Geo-Kit, но не нашли какой-либо функциональности, как это.

Если камень выше не поддерживает функциональные возможности, кто может предложить другой метод, который может решить эту проблему?

благодаря

Задан 20/01/2018 в 12:53
источник пользователем
На других языках...                            


3 ответов

голоса
0

Я думаю , что nearфункции геокодировщик могут удовлетворить ваши требования.

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

Geocoder документ относится к этой функции: https://github.com/alexreisner/geocoder#for-activerecord-models

Ответил 20/01/2018 в 13:29
источник пользователем

голоса
0

К сожалению я отправляю это как ответ, но форматирование выключено при отправке образцов коды в разделе комментариев.

....

на месте, я имею в виду , имеющий latitude, longitude, max_distanceсвойства, потому что если это так, то вам может понадобиться только

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

Для того, чтобы получить доступ к этим близлежащим местам, просто сделать:

place = Place.first
nearby_places = place.nearby_places
Ответил 20/01/2018 в 14:30
источник пользователем

голоса
1

Я думаю, что следующий патч может решить эту проблему.

Создайте следующий файл конфигурации / инициализаторами / 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

Тогда вы можете запросить как

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

Ответил 28/02/2018 в 20:44
источник пользователем

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