0

Я использую я использую https://github.com/alexreisner/geocoder Gem и когда я называю: results = Geocoder.search("McCarren Park, Brooklyn, NY") мои результаты вар взгляд s как здесь:Как читать значения из ActiveRecord

[#<Geocoder::Result::Google:0x007fc0e6a016e0 @data={"address_components"=> 
[{"long_name"=>"McCarren Park", "short_name"=>"McCarren Park", "types"=>["point_of_interest", "establishment"]}, {"long_name"=>"776", "short_name"=>"776", "types"=>["street_number"]}, {"long_name"=>"Lorimer Street", "short_name"=>"Lorimer St", "types"=>["route"]}, {"long_name"=>"Williamsburg", "short_name"=>"Williamsburg", "types"=>["neighborhood", "political"]}, {"long_name"=>"Brooklyn", "short_name"=>"Brooklyn", "types"=>["sublocality_level_1", "sublocality", "political"]}, {"long_name"=>"Brooklyn", "short_name"=>"Brooklyn", "types"=>["locality", "political"]}, {"long_name"=>"Kings County", "short_name"=>"Kings County", "types"=>["administrative_area_level_2", "political"]}, {"long_name"=>"New York", "short_name"=>"NY", "types"=>["administrative_area_level_1", "political"]}, {"long_name"=>"United States", "short_name"=>"US", "types"=>["country", "political"]}, {"long_name"=>"11222", "short_name"=>"11222", "types"=>["postal_code"]}], "formatted_address"=>"McCarren Park, 776 Lorimer St, Brooklyn, NY 11222, USA", "geometry"=>{"location"=>{"lat"=>40.7214499, "lng"=>-73.9520707}, "location_type"=>"APPROXIMATE", "viewport"=>{"northeast"=>{"lat"=>40.72279888029149, "lng"=>-73.95072171970848}, "southwest"=>{"lat"=>40.7201009197085, "lng"=>-73.9534196802915}}}, "place_id"=>"ChIJtzAltURZwokRSNfNakChZPU", "types"=>["park", "point_of_interest", "establishment"]}, @cache_hit=nil>] 

Как я могу читать lat и lng ВАР от results переменной?

ответ

1

Как говорит Андрей, это массив хешей, вам нужно будет выбрать массив, в котором есть переменные lat и lng, которые, кажется, являются хеш-файлом postal_code. Найдите хеш, в котором присутствует клавиша «geometry».

Так,

location_results = results.data.select{|r| r['geometry']}.first 
location_results['geometry']['location']['lat'] # 40.7214499 
location_results['geometry']['location']['lng'] # 73.9520707 
+0

после первой строки у меня есть ошибка: ** NoMethodError: undefined method '[] 'для # ** – Ponciusz

+0

Ах, правый массив находится в атрибуте' data'. Я изменил свой ответ, дайте мне знать, если это работает лучше ... – SteveTurczyn

1

От source code:

# Takes a search string (eg: "Mississippi Coast Coliseumf, Biloxi, MS", 
# "205.128.54.202") for geocoding, or coordinates (latitude, longitude) 
# for reverse geocoding. Returns an array of <tt>Geocoder::Result</tt>s. 

Таким образом, это простой массив.

Оформить заказ this documentation для получения дополнительной информации о запросить его.

+0

не работает, когда я пытаюсь у меня есть это: 'NoMethodError: неопределенные данные метод для # <Массив: 0x007fc0e2679d28>' – Ponciusz

+0

@Ponciusz заказ теперь, пожалуйста, –

+0

'TypeError: нет неявного преобразования строки в Integer' – Ponciusz

0
result = Geocoder.search("McCarren Park, Brooklyn, NY").first 

And then simply call it like this, 
-> result.latitude and 
-> result.longitude 

Но также обязательно проверить результат, иногда ответ Geocoder API принимает более умолчанию, заданное значение тайм-аута и возвращает NIL. Поэтому, если вы сталкиваетесь с этим, просто просто увеличивайте значение тайм-аута в интинераторах.

Geocoder :: Configuration.timeout = 15 # изменить 15 на любое значение, которое вы предпочитаете.

Для более ссылок проверить https://github.com/alexreisner/geocoder#advanced-geocoding

0
location_results = results.data.select{|r| r['geometry']}.first 

и я есть сейчас

["geometry", 
{"location"=>{"lat"=>40.7214499, "lng"=>-73.9520707}, 
"location_type"=>"APPROXIMATE", 
"viewport"=>{"northeast"=>{"lat"=>40.72279888029149, "lng"=>-73.95072171970848}, 
"southwest"=>{"lat"=>40.7201009197085, 
"lng"=>-73.9534196802915}}}] 

, но после этого

location_results['geometry']['location']['lat'] 

я получаю снова ошибка:

TypeError: no implicit conversion of String into Integer