Revertir consulta un lugar en los carriles-Geocoder con el atributo distancia máxima

votos
1

Por ejemplo, tengo un modelo como este

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

¿Cómo puedo lograr una consulta que le da un punto de coordenadas, recibirá todos los lugares dentro de rango de distancia entre el punto y el campo MAX_DISTANCE de coordenadas.

lat = 37.792
lng = -122.393

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

He estado buscando en Geocoder y documentación joya Geo-Kit, pero no se ha encontrado ningún funcionalidad de esa manera.

Si joya anterior no admite la funcionalidad, puede alguien sugerir otro método que puede resolver el problema?

Gracias

Publicado el 20/01/2018 a las 09:53
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

Creo que nearlas funciones de Geocoder pueden satisfacer sus necesidades.

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

Geocoder documento se refiere a esta función: https://github.com/alexreisner/geocoder#for-activerecord-models

Respondida el 20/01/2018 a las 10:29
fuente por usuario

votos
0

En este momento estoy publicando esto como una respuesta, pero el formato está apagado cuando la publicación de ejemplos de código en la sección de comentarios.

....

por el lugar, me refiero a tener el latitude, longitude, max_distancepropiedades, ya que si ese es el caso, entonces es posible que sólo necesita

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

Para acceder a estos lugares cercanos, acaba de hacer:

place = Place.first
nearby_places = place.nearby_places
Respondida el 20/01/2018 a las 11:30
fuente por usuario

votos
1

Creo que el siguiente parche puede resolver el problema.

Cree el siguiente archivo de configuración / inicializadores / 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

A continuación, puede consultar como

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

Respondida el 28/02/2018 a las 17:44
fuente por usuario

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