requête inverse d'un emplacement dans Rails-Géocodeur avec l'attribut de la distance max

voix
1

Pour un exemple, j'ai un modèle comme celui-ci

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

Comment puis-je obtenir une requête donnée d'un point de coordonnées, va obtenir tous les endroits à l'intérieur dans la plage entre la distance point de coordonnées et sur le terrain de 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 

J'ai cherché dans la documentation de géocodage et de pierres précieuses Geo-Kit, mais pas trouvé toutes les fonctionnalités comme ça.

Si gem ci-dessus pas pris en charge la fonctionnalité, quelqu'un peut-il proposer une autre méthode qui peut résoudre le problème?

Merci

Créé 20/01/2018 à 12:53
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

Je pense que les nearfonctions de géocodage peuvent satisfaire vos besoins.

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

Document de géocodage se réfèrent à cette fonction: https://github.com/alexreisner/geocoder#for-activerecord-models

Créé 20/01/2018 à 13:29
source utilisateur

voix
0

Désolé je posterai cela comme une réponse, mais la mise en forme est lorsque l'affichage des exemples de code dans la section des commentaires.

....

par lieu, je veux dire ayant la latitude, longitude, max_distancepropriétés, parce que si tel est le cas, alors vous ne aurez besoin

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

Pour accéder à ces lieux à proximité, il suffit de faire:

place = Place.first
nearby_places = place.nearby_places
Créé 20/01/2018 à 14:30
source utilisateur

voix
1

Je pense que le patch suivant peut résoudre le problème.

Créer le fichier config suivant / initializers / 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

Ensuite, vous pouvez interroger comme

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

Créé 28/02/2018 à 20:44
source utilisateur

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