maksimum mesafe özniteliği ile sorgu Raylar-geocoder bir konumu Ters

oy
1

bir örnek için, böyle bir model var

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

Nasıl mesafe arasındaki noktasını MAX_DISTANCE alanını koordinat aralığında içindeki yerleri alacak, bir koordinat noktası verilen bir sorgu elde edebilirsiniz.

lat = 37.792
lng = -122.393

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

Ben geocoder & Coğrafi Kiti mücevher belgelerinde bakarak, ama böyle herhangi bir işlevi bulunmayan edilmiştir.

taş işlevselliği desteklenmiyorsa yukarıdaki, herkes sorunu çözebilir başka bir yöntem önerebilir?

Teşekkürler

Oluştur 20/01/2018 saat 12:53
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

Ben düşünüyorum neargeocoder fonksiyonları gereksinimi karşılamak olabilir.

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

Geocoder belge bu işlev bakın: https://github.com/alexreisner/geocoder#for-activerecord-models

Cevap 20/01/2018 saat 13:29
kaynak kullanıcı

oy
0

Üzgünüm cevap olarak bu mesaj, ancak yorum bölümünde kod örnekleri yayınlarken biçimlendirme kapalıdır.

....

yerine göre, yaşadığım demek latitude, longitude, max_distanceEğer durum buysa, çünkü özellikleri, o zaman sadece gerekebilir

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

Bu yakındaki yerlere erişmek için, sadece yapın:

place = Place.first
nearby_places = place.nearby_places
Cevap 20/01/2018 saat 14:30
kaynak kullanıcı

oy
1

Aşağıdaki yama sorunu çözebilir düşünüyorum.

Aşağıdaki dosya config / başlatıcıları / geokit_rails_patch.rb oluştur

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

Sonra gibi sorgulayabilir

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

Cevap 28/02/2018 saat 20:44
kaynak kullanıcı

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