Как узнать температуру только по координатам
Предисловие:
Когда мы делали админку для заполнения городов, стран, аэропортов и прочих локаций мы обязательно указывали местонахождения при помощи карт гугл. Мы написали небольшой скрипт, который по клику на карте отправлял на сервер точные координаты точки и привязывал эти координаты к заполняемому объекту.
Из опыта работы я понял, что нужно максимально упростить ввод информации для уменьшения человеческих ошибок, но в то же время имея возможность максимально расширить функционал готового предложения.
У нас в компании мы много данных ассоциируем с помощью именно точных координат у объекта. Сегодня я хочу рассказать как же можно использовать координаты для получения погоды.
Шаг 1. Получение API openweathermap.org
Есть такой замечательный сервис openweathermap.org который имеет очень удобное api, в том числе, может выавать погоду по координатам. Для того, что б воспользоваться их api нужно зарегистрироваться и получить ключ. У них есть несколько видов подписки, в том числе и бесплатная которой хватит для большинства разработчиков.
И так, регистрируемся:
Заходим на страницу регистрации.
Вводим логин, адрес электронной почты, пароль, соглашаемся с условиями и жмем кнопку "CREATE ACCOUNT".
Вы сразу же будете перенаправлены в Ваш личный кабинет.
Нас интересует "API key", вот он:
Скопируйте его, он нам понадобится дальше.
Шаг 2. Функция получения текста, картинки и температуры
Теперь создайте файл. Например weather.py со следующим содержанием:
# -*- coding: utf-8 -*- import urllib import json def current_weather (Lat, Lng, OPENWEATHER_API): result = {} #создаем словарь result try: try: url = "http://api.openweathermap.org/data/2.5/weather?lat=%s&lon=%s&appid=%s" % (float(Lat), float(Lng),str(OPENWEATHER_API)) #отправляем запрос на апи response = urllib.urlopen(url); #получаем ответ от апи data = json.loads(response.read()) #переводим json в словарь питон except: status = None #присваиваем значение NONE если не достучались до апи result['middle_temp'] = None #присваиваем значение NONE если не достучались до апи icon = None #присваиваем значение NONE если не достучались до апи else: weather_data = data['weather'] weather_data = weather_data[0] weather_data2 = data['main'] status = weather_data['main'].lower() icon = weather_data['icon'] result['middle_temp'] = (float(weather_data2['temp'])-273.15) #считываем среднюю температуру и переводим ее из кельвинов в цельсий if result['middle_temp'] == None or status == None or icon == None: result['picture'] = 'panda.png' #если возникли проблемы присваиваем картинку панды (почему бы и нет) result['middle_temp'] = '-273' #если возникли проблемы присваиваем температуру абсолютного 0 (ну, немного выше, что б не вдаваться в подробности) result['text'] = 'сервер недоступен'.decode('utf8') #если возникли проблемы присваиваем текст "сервер не доступен" return result if int(result['middle_temp']) > 0: result['middle_temp'] = "+" + str(int(result['middle_temp'])) #если температура больше 0 - добавляем перед значением плюс else: result['middle_temp'] = str(int(result['middle_temp'])) #если температура меньше 0 - так и отправляем с минусом result['picture'] = '%s.png' % (icon) if status == 'clear': #переименовываем английские названия в русские status = 'ясно'.decode('utf8') #переименовываем английские названия в русские elif status == 'rain': #переименовываем английские названия в русские status = 'дождь'.decode('utf8') #переименовываем английские названия в русские elif status == 'clouds': #переименовываем английские названия в русские status = 'облачно'.decode('utf8') #переименовываем английские названия в русские elif status == 'snow': #переименовываем английские названия в русские status = 'снег'.decode('utf8') #переименовываем английские названия в русские elif status == 'thunderstorm': #переименовываем английские названия в русские status = 'гроза'.decode('utf8') #переименовываем английские названия в русские elif status == 'drizzle': #переименовываем английские названия в русские status = 'дождь'.decode('utf8') #переименовываем английские названия в русские elif status == 'mist': #переименовываем английские названия в русские status = 'туман'.decode('utf8') #переименовываем английские названия в русские elif status == 'dust': #переименовываем английские названия в русские status = 'пыльно'.decode('utf8') #переименовываем английские названия в русские elif status == 'fog': #переименовываем английские названия в русские status = 'туман'.decode('utf8') #переименовываем английские названия в русские result['text'] = status #переименовываем английские названия в русские return result except: result['picture'] = 'panda.png' #если возникли проблемы присваиваем картинку панды (почему бы и нет) result['middle_temp'] = '-273' #если возникли проблемы присваиваем температуру абсолютного 0 (ну, немного выше, что б не вдаваться в подробности) result['text'] = 'сервер недоступен'.decode('utf8') #если возникли проблемы присваиваем текст "сервер не доступен" return result Kiev_lat = 50.450026 #широта киева Kiev_lng = 30.524003 #долгота киева print current_weather(Kiev_lat, Kiev_lng, 'openweathermap_api')
вместо openweathermap_api - подставляем API key из личного кабинета openweathermap.org. И вуаля, получаете словарь с описание погоды, с картинкой и самой температурой.
Шаг 3. Что означают коды картинок
Все коды картинок и описание находятся на этой странице: