2014-09-22 68 views
0

使用地理编码器,我已经能够解析给定的经度/纬度并获得城市,省份等。虽然我需要的是子地点,我还没有看到这个变量。我一直在使用Google地图自动完成功能,并且在很多建议中都有子地点。例如,从安大略省多伦多的Etobicoke地区,我需要抓住Etobicoke。有没有办法与Geocoder做到这一点?使用地理编码器获取经纬度的邻近地点或邻域

@location = Geocoder.coordinates(params[:search_address]) 
    result = Geocoder.search(@location).first 
    cookies[:display_location] = "#{need the region here}, #{result.city}, #{result.state_code}" 

回答

1

答案比我想象的更简单,我只是不清楚我正在寻找的位置类型的正确术语。在Geocoder :: Result模块内部,我找到了方法neighborhood

module Geocoder::Result 
    class Google < Base 

    def coordinates 
     ['lat', 'lng'].map{ |i| geometry['location'][i] } 
    end 

    def address(format = :full) 
     formatted_address 
    end 

    def neighborhood 
     if neighborhood = address_components_of_type(:neighborhood).first 
     neighborhood['long_name'] 
     end 
    end 

    def city 
     fields = [:locality, :sublocality, 
     :administrative_area_level_3, 
     :administrative_area_level_2] 
     fields.each do |f| 
     if entity = address_components_of_type(f).first 
      return entity['long_name'] 
     end 
     end 
     return nil # no appropriate components found 
    end 

    def state 
     if state = address_components_of_type(:administrative_area_level_1).first 
     state['long_name'] 
     end 
    end 

    def state_code 
     if state = address_components_of_type(:administrative_area_level_1).first 
     state['short_name'] 
     end 
    end 

    def sub_state 
     if state = address_components_of_type(:administrative_area_level_2).first 
     state['long_name'] 
     end 
    end 

    def sub_state_code 
     if state = address_components_of_type(:administrative_area_level_2).first 
     state['short_name'] 
     end 
    end 

    def country 
     if country = address_components_of_type(:country).first 
     country['long_name'] 
     end 
    end 

    def country_code 
     if country = address_components_of_type(:country).first 
     country['short_name'] 
     end 
    end 

    def postal_code 
     if postal = address_components_of_type(:postal_code).first 
     postal['long_name'] 
     end 
    end 

    def route 
     if route = address_components_of_type(:route).first 
     route['long_name'] 
     end 
    end 

    def street_number 
     if street_number = address_components_of_type(:street_number).first 
     street_number['long_name'] 
     end 
    end 

    def street_address 
     [street_number, route].compact.join(' ') 
    end 

    def types 
     @data['types'] 
    end 

    def formatted_address 
     @data['formatted_address'] 
    end 

    def address_components 
     @data['address_components'] 
    end 

    ## 
    # Get address components of a given type. Valid types are defined in 
    # Google's Geocoding API documentation and include (among others): 
    # 
    # :street_number 
    # :locality 
    # :neighborhood 
    # :route 
    # :postal_code 
    # 
    def address_components_of_type(type) 
     address_components.select{ |c| c['types'].include?(type.to_s) } 
    end 

    def geometry 
     @data['geometry'] 
    end 

    def precision 
     geometry['location_type'] if geometry 
    end 
    end 
end 

我是新来的编码,这很可能进行重构,但是这是我使用的是什么:

 @latlng = Geocoder.coordinates(params[:searched_address]) 
     result = Geocoder.search(@latlng).first 

     if result.address_components_of_type(:neighborhood).first.nil? 
      @display_location = "#{result.city}, #{result.state_code}" 
     else 
      neighborhood = result.address_components_of_type(:neighborhood).first['short_name'] 
      @display_location = "#{neighborhood}, #{result.city}, #{result.state_code}" 
     end 

大部分地址不会有sublocality,所以if语句我用了一个以防止在返回零值时失败。如果您将neighborhood切换为sublocality,它可能会给您更好的结果;我仍然必须玩弄它。

相关问题