Загрузка...
Загрузка...

Как узнать температуру только по координатам

•   Программирование   •

Как узнать температуру только по координатам
29 мар 2016

Как узнать температуру только по координатам

 

 

Предисловие:

Когда мы делали админку для заполнения городов, стран, аэропортов и прочих локаций мы обязательно указывали местонахождения при помощи карт гугл. Мы написали небольшой скрипт, который по клику на карте отправлял на сервер точные координаты точки и привязывал эти координаты к заполняемому объекту.

Из опыта работы я понял, что нужно максимально упростить ввод информации для уменьшения человеческих ошибок, но в то же время имея возможность максимально расширить функционал готового предложения.

У нас в компании мы много данных ассоциируем с помощью именно точных координат у объекта. Сегодня я хочу рассказать как же можно использовать координаты для получения погоды.

Шаг 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. Что означают коды картинок

Все коды картинок и описание находятся на этой странице: