Как сделать обратное геокодирование на сервере с помощью python, json и google maps?

Я пробую обратное геокодирование на стороне сервера, которое может дать мне ответ json, и теперь я хочу получить 2 или 3 переменные из ответа json:

Я хотел бы разобрать, например, эти данные и закончить на eg. administrative_area_level_1 = 'Stockholm'

jsondata = json.load(urllib2.urlopen('http://maps.googleapis.com/maps/api/geocode/json?latlng=59.3,18. 1&sensor=false'))

Вот мой код python, который получает json, теперь мне интересно, как разобрать его, чтобы получить только

  • administrative_area_level_1 long_name (т.е. название штата или региона)
  • locality long name (т.е. название города)
  • понимание, как разобрать мой json

Я могу разобрать его, но он не всегда выходит как administrative_area_1:

jsondata["results"][0]["address_components"][5]["long_name"]

Строка выше правильно выводит "New York" для точки в Нью-Йорке, но для Стокгольма выводит почтовый город, т.е. Johanneshow, который не является административной_областью_1 (регион/штат). Итак, как гарантировать, что функция всегда возвращает административную_область_1, желательно без циклов?

Я хочу, чтобы она работала примерно так, как показано ниже, с прямым доступом к стране, региону и городу:

logging.info("country:"+str(jsondata["results"][9]["formatted_address"]))
logging.info("administrative_area_level_1:"+str(jsondata["results"][8]["formatted_address"]))
logging.info("locality:"+str(jsondata["results"][8]["formatted_address"]))

Спасибо заранее

Обновление

Здесь хороший ответ с результатами, которые я ожидал. Пока я ждал ответа, я также попробовал реализовать решение самостоятельно, которое, похоже, справится:

jsondata = json.load(urllib2.urlopen('http://maps.googleapis.com/maps/api/geocode/json?latlng='+str(ad.geopt.lat)+','+str(ad.geopt.lon)+'&sensor=false'))
logging.info("geography:"+str(jsondata["results"][1]["formatted_address"]))
region = None
city = None
for result in jsondata["results"]:
  #logging.info("result:"+str(result))
  for component in result["address_components"]:
    logging.info("components:"+str(component))
    logging.info("components type:"+str(component["types"]))
    if 'administrative_area_level_1' in component["types"]:
      #logging.info(unicode('found admin area:%s' % component["long_name"]))
      region = component["long_name"]
    if 'locality' in component["types"]:
      logging.info("found locality:"+str(component["long_name"]))
      city = component["long_name"]

6
задан Niklas Rosencrantz 6 December 2011 в 05:27
поделиться