2015-02-05 4 views
0

Я пытаюсь найти значение ['locality', 'political'] в обратном геокодировании API Карт Google.Итерация через ответ API геокодирования в python

я мог бы добиться того же в Javascript следующим образом:

var formatted = data.results; 
$.each(formatted, function(){ 
    if(this.types.length!=0){ 
      if(this.types[0]=='locality' && this.types[1]=='political'){ 
       address_array = this.formatted_address.split(','); 
      }else{ 
       //somefunction 
      } 
    }else{ 
     //somefunction 
    } 
}); 

Использование Python, я попытался следующие:

url = 'https://maps.googleapis.com/maps/api/geocode/json?latlng='+lat+','+long+'&result_type=locality&key='+MAPS_API_KEY 
results = json.loads(urllib.request.urlopen(url).read().decode('utf-8')) 
city_components = results['results'][0] 
for c in results: 
    if c['types']: 
     if c['types'][0] == 'locality': 
      print(c['types']) 

Это дает мне кучу ошибок. Я не могу заткнуться, итерации через объект ответа, чтобы найти значение ['locality', 'political'], чтобы найти соответствующий Город short_name. Как мне решить это?

+0

Каковы эти ошибки? Вы случайно [конкатенируете поплавки и строки] (https://stackoverflow.com/questions/26540270/cannot-concatenate-str-and-float-objects)? –

+0

@OliverW. Я получаю ошибку 'Str индексы должны быть целочисленными'. – Newtt

+0

, пожалуйста, добавьте полную трассировку, чтобы мы могли видеть *, где * эта ошибка появляется, а не отслеживать ваш код. –

ответ

2

Вы пытаетесь получить доступ к ключам словаря, но вместо того, чтобы вы итерация персонажей этого ключа:

for c in results: 
    if c['types']: 

results является словарь (очевидный из вашей city_components= линии). Когда вы вводите for c in results, вы связываете c с ключами этого словаря (в свою очередь). Это означает, что c - это строка (в вашем сценарии, скорее всего, все клавиши являются строками). Итак, набрав c['types'] не имеет смысла: вы пытаетесь получить доступ к значению/атрибут 'types' строки ...

Скорее всего вы хотели:

for option in results['results']: 
    addr_comp = option.get('address_components', []) 
    for address_type in addr_comp: 
     flags = address_type.get('types', []) 
     if 'locality' in flags and 'political' in flags: 
      print(address_type['short_name']) 
+0

Работали как шарм. Спасибо за объяснение и исправление! :) – Newtt

Смежные вопросы