Reverse vraag een locatie in Rails-Geocoder met max afstand attribuut

stemmen
1

Voor een voorbeeld, ik heb een dergelijk model

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

Hoe kan ik het bereiken van een query die een coördinaat gegeven, zullen alle plaatsen te bereiken binnen het bereik tussen afstand coördineren punt en MAX_DISTANCE veld.

lat = 37.792
lng = -122.393

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

Ik ben al op zoek in Geocoder & Geo-Kit gem documentatie, maar vond geen functionaliteit als dat.

Als gem de functionaliteit die hierboven niet ondersteund, kan iemand wijzen op een andere methode die het probleem kunnen oplossen?

Bedankt

De vraag is gesteld op 20/01/2018 om 12:53
bron van user
In andere talen...                            


3 antwoorden

stemmen
0

Ik denk dat de nearfuncties van Geocoder uw eisen kan voldoen.

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

Geocoder document verwijzen naar deze functie: https://github.com/alexreisner/geocoder#for-activerecord-models

antwoordde op 20/01/2018 om 13:29
bron van user

stemmen
0

Sorry dat ik dit plaatsen als een antwoord, maar de opmaak is uitgeschakeld bij het plaatsen van codevoorbeelden in de commentaar sectie.

....

door plaats, ik bedoel met de latitude, longitude, max_distanceeigenschappen, want als dat het geval is, dan kunt u alleen nodig

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

Voor toegang tot deze plaatsen in de buurt, gewoon doen:

place = Place.first
nearby_places = place.nearby_places
antwoordde op 20/01/2018 om 14:30
bron van user

stemmen
1

Ik denk dat de volgende patch het probleem kunnen oplossen.

Maak het volgende bestand config / initialiseerders / 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

Dan kunt u opvragen, zoals

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

antwoordde op 28/02/2018 om 20:44
bron van user

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