Omvendt spør et sted i Rails-Geocoder med max avstand attributt

stemmer
1

For et eksempel, jeg har en modell som dette

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

Hvordan kan jeg oppnå en spørring som gitt et koordinatsystem punktet, vil få alle steder innenfor i området mellom avstand koordinere punkt og MAX_DISTANCE feltet.

lat = 37.792
lng = -122.393

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

Jeg har vært ute i Geocoder & Geo-Kit perle dokumentasjon, men ikke funnet noe funksjonalitet sånn.

Hvis perle ovenfor støttes ikke funksjonaliteten, kan noen foreslå en annen metode som kan løse problemet?

Takk

Publisert på 20/01/2018 klokken 12:53
kilden bruker
På andre språk...                            


3 svar

stemmer
0

Jeg tror at nearfunksjonene Geocoder kan tilfredsstille dine behov.

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

Geocoder dokumentet refererer til denne funksjonen: https://github.com/alexreisner/geocoder#for-activerecord-models

Svarte 20/01/2018 kl. 13:29
kilden bruker

stemmer
0

Beklager at jeg legger inn dette som et svar, men formateringen er slått av når du legger ut kodeeksempler i kommentarfeltet.

....

av sted, mener jeg å ha latitude, longitude, max_distanceegenskaper, fordi hvis det er tilfelle, så kan du bare trenger

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

For å få tilgang til disse nærliggende steder, bare gjør:

place = Place.first
nearby_places = place.nearby_places
Svarte 20/01/2018 kl. 14:30
kilden bruker

stemmer
1

Jeg tror at etter oppdateringen kan løse problemet.

Opprett følgende filen 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

Deretter kan du spørre ut

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

Svarte 28/02/2018 kl. 20:44
kilden bruker

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