Reverse-Abfrage einen Standort in Rails-Geocoder mit max Distanzattribut

stimmen
1

Ein Beispiel habe ich ein Modell wie diese

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

Wie kann ich eine Abfrage erreichen, die einen Koordinatenpunkt gegeben, wird alle Orte innerhalb in Bereich zwischen Abstand Koordinatenpunkt und MAX_DISTANCE Feld bekommen.

lat = 37.792
lng = -122.393

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

Ich habe mich in Geocoder & Geo-Kit gem Dokumentation, aber keine Funktionalität wie das gefunden.

Wenn Juwel nicht die Funktionalität unterstützt oben, kann jede andere Methode vorschlagen, die das Problem lösen können?

Vielen Dank

Veröffentlicht am 20/01/2018 um 12:53
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Ich denke , dass nearFunktionen von Geocoder Ihre Anforderung erfüllen kann.

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

Geocoder Dokument auf diese Funktion beziehen: https://github.com/alexreisner/geocoder#for-activerecord-models

Beantwortet am 20/01/2018 um 13:29
quelle vom benutzer

stimmen
0

Sorry, ich bin Entsendung dies als eine Antwort, aber die Formatierung ist ausgeschaltet, wenn Code-Beispiele im Kommentarbereich veröffentlichen.

....

von Ort, meine ich mit den latitude, longitude, max_distanceEigenschaften, denn wenn das der Fall ist, dann können Sie nur brauchen

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

Um diese Orte in der Umgebung zuzugreifen, gerade tun:

place = Place.first
nearby_places = place.nearby_places
Beantwortet am 20/01/2018 um 14:30
quelle vom benutzer

stimmen
1

Ich denke, dass das folgende Patch das Problem lösen kann.

Erstellen Sie die folgende Datei config / 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

Dann können Sie abfragen, wie

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

Beantwortet am 28/02/2018 um 20:44
quelle vom benutzer

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