Reverse interrogazione una posizione in Rails-Geocoder con l'attributo max distanza

voti
1

Per un esempio, ho un modello come questo

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

Come posso realizzare una query che, dato un punto di coordinate, otterrà tutti i luoghi all'interno nella gamma tra la distanza e il punto di campo MAX_DISTANCE coordinate.

lat = 37.792
lng = -122.393

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

Sono stato a guardare in Geocoder & Geo-kit di documentazione gioiello, ma non ho trovato alcuna funzionalità del genere.

Se gioiello di cui sopra non supportata la funzionalità, qualcuno può suggerire un altro metodo che può risolvere il problema?

Grazie

È pubblicato 20/01/2018 alle 12:53
fonte dall'utente
In altre lingue...                            


3 risposte

voti
0

Credo che nearle funzioni del Geocoder possono soddisfare le vostre esigenze.

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

Documento Geocoder si riferiscono a questa funzione: https://github.com/alexreisner/geocoder#for-activerecord-models

Risposto il 20/01/2018 a 13:29
fonte dall'utente

voti
0

Spiacente sto postando questo come una risposta, ma la formattazione è spento durante la pubblicazione esempi di codice nella sezione commenti.

....

per luogo, voglio dire avere il latitude, longitude, max_distanceproprietà, perché se questo è il caso, allora si può solo bisogno

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

Per accedere a questi luoghi vicini, basta fare:

place = Place.first
nearby_places = place.nearby_places
Risposto il 20/01/2018 a 14:30
fonte dall'utente

voti
1

Penso che la seguente patch può risolvere il problema.

Creare il seguente file di configurazione / inizializzatori / 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

Poi si può interrogare come

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

Risposto il 28/02/2018 a 20:44
fonte dall'utente

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