Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
7
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

9

Анализ данных о местоположении

Любое событие происходит в каком-либо месте, поэто-

му при анализе данных местоположение объекта может

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

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

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

Получение данных о местоположении

Первый шаг пространственного анализа — получение данных о местоположении интересующих объектов. В частности, эти данные о местоположении должны

192      Глава 9. Анализ данных о местоположении

быть представлены географическими координатами (или просто геокоординатами) — значениями широты и долготы. Такая система координат позволяет задать любую точку на планете в виде набора чисел. Это означает, что местоположение можно анализировать программно. В этом разделе мы рассмотрим способы получения геокоординат как неподвижных, так и движущихся объектов. Это покажет, несколько хорошо наша гипотетическая служба такси сможет определять место посадки клиента и локацию автомобилей в реальном времени.

Преобразование стандартного вида адреса в геокоординаты

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

Как преобразовать названия улиц и номера домов в геокоординаты? Один из способов — использовать Geocoding (Google API, предназначенный именно для этой цели). Чтобы взаимодействовать с Geocoding API из Python-скрипта, понадобится библиотека googlemaps. Установите ее с помощью команды pip:

$ pip install -U googlemaps

Также необходимо получить API-ключ для Geocoding API, используя учетную запись Google Cloud. Информацию о приобретении ключа API см. на Google Maps Platform1. Подробнее о стоимости API можно узнать в разделе Pricing2. На момент написания этой статьи Google предоставлял пользователям API ежемесячный кредит в размере $200, которого вполне достаточно, чтобы экспериментировать с кодом, приведенным в этой книге.

В следующем фрагменте кода показан пример вызова Geocoding API с использованием googlemaps. В нем мы получаем координаты широты и долготы, соответствующие адресу 1600 Amphitheatre Parkway, Mountain View, CA:

import googlemaps

gmaps = googlemaps.Client(key='YOUR_API_KEY_HERE') address = '1600 Amphitheatre Parkway, Mountain View, CA'

1 https://developers.google.com/maps/documentation/geocoding/get-api-key

2 https://cloud.google.com/maps-platform/pricing

Получение данных о местоположении      193

geocode_result = gmaps.geocode(address)

print(geocode_result[0]['geometry']['location'].values())

В приведенном выше скрипте мы устанавливаем соединение с API и отправляем адрес, который требуется преобразовать. API возвращает документ JSON с вложенной структурой. Геокоординаты хранятся в поле location, которое является подполем geometry. В последней строке мы обращаемся к координатам и выводим их на экран, получая следующий результат:

dict_values([37.422388, -122.0841883])

Получение геокоординат движущегося объекта

Теперь вы знаете, как получить геокоординаты статичного объекта по его адресу, но как получить местоположение движущегося объекта, например автомобиля в режиме реального времени? Некоторые службы такси используют для этой цели специализированные GPS-устройства, но мы остановимся на недорогом и простом в реализации решении. Все, что нам потребуется, — это смартфон.

Смартфоны определяют свое местоположение с помощью встроенных датчиков GPS и могут быть настроены на обмен этой информацией. Здесь мы рассмотрим, как собирать GPS-координаты смартфона через популярный мессенджер Telegram. Используя Telegram Bot API, создадим telegram-бота. Боты обычно используются для обработки естественного языка, однако наш бот будет собирать и регистрировать геолокацию пользователей Telegram, которые решили поделиться данными с ботом.

Установка telegram-бота

Чтобы создать telegram-бота, установите приложение Telegram и создайте учетную запись. Затем выполните следующие действия, используя смартфон либо ПК:

1.В приложении Telegram найдите @BotFather. BotFather — это telegram-бот, который управляет всеми остальными ботами вашего аккаунта.

2.В диалоге с BotFather нажмите Start, чтобы увидеть список команд для настройки telegram-ботов.

3.Введите /newbot в поле сообщения. Вам будет предложено ввести название и имя пользователя для нового бота. Затем вы получите для него токен авторизации. Запишите этот токен; он понадобится при программировании бота.

194      Глава 9. Анализ данных о местоположении

После выполнения этих шагов вы можете создать бота на языке Python с помощью библиотеки python-telegram-bot. Установите библиотеку следующим образом:

$ pip install python-telegram-bot –upgrade

Инструменты, необходимые, чтобы написать бота, находятся в модуле библиотеки telegram.ext. Он построен на базе Telegram Bot API.

Программирование бота

Мы используем модуль telegram.ext библиотеки python-telegram-bot, чтобы запрограммировать бота на прослушивание и логирование GPS-координат:

from telegram.ext import Updater, MessageHandler, Filters from datetime import datetime

import csv

def get_location(update, context): msg = None

if update.edited_message: msg = update.edited_message

else:

msg = update.messagegps = msg.location

sender = msg.from_user.username

tm = datetime.now().strftime("%H:%M:%S")

with open(r'/HOME/PI/LOCATION_BOT/LOG.CSV', 'a') as f: writer = csv.writer(f)

writer.writerow([sender, gps.latitude, gps.longitude, tm])context.bot.send_message(chat_id=msg.chat_id, text=str(gps))

def main():

updater = Updater('TOKEN', use_context=True)

updater.dispatcher.add_handler(MessageHandler(Filters.location, get_location))

updater.start_polling()updater.idle()

if __name__ == '__main__': main()

Функция main() содержит общие вызовы, находящиеся в скрипте, где реализован telegram-бот. Начинаем с создания объекта Updater , передав ему токен авторизации бота (сгенерированный BotFather). Этот объект организует процесс выполнения бота на протяжении всего скрипта. Затем используем объект

Получение данных о местоположении      195

Dispatcher, связанный с Updater, чтобы добавить функцию-обработчик get_ location()для входящих сообщений . Указав Filters.location, мы добавляем фильтр к обработчику так, чтобы он вызывался только тогда, когда бот получает сообщения, содержащие данные о местоположении отправителя. Запускаем бота, вызывая метод start_polling()объекта Updater . Поскольку start_polling()

является неблокирующим методом, необходимо также вызвать метод idle() объекта Updater для блокировки скрипта до получения сообщения.

В начале скрипта мы объявляем обработчик get_location() . В обработчике сохраняем входящее сообщение как переменную msg, затем извлекаем данные

оместоположении отправителя, используя свойство сообщения location . Также мы логируем имя отправителя и генерируем строку, содержащую текущее

время. Затем, используя модуль Python csv, сохраняем всю эту информацию в виде строки в CSV-файле по выбранному пути. Мы также отправляем данные

оместоположении назад отправителю, чтобы он знал, что его местоположение получено .

Получение данных от бота

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

1.Создайте учетную запись Telegram.

2.В Telegram нажмите на имени бота.

3.Коснитесь значка скрепки и выберите в меню Location (Геопозиция).

4.Нажмите Share My Location For (Транслировать мою геопозицию) и выберите время, в течение которого Telegram будет делиться с ботом данными о местоположении в реальном времени. Возможные варианты: 15 минут, 1 час или 8 часов.

На рис. 9.1 представлен скриншот, демонстрирующий эту процедуру.

Бот будет отправлять полученные от пользователей данные об их местоположении в CSV-файл в виде строк, имеющих вид:

cab_26,43.602508,39.715685,14:47:44 cab_112,43.582243,39.752077,14:47:55 cab_26,43.607480,39.721521,14:49:11 cab_112,43.579258,39.758944,14:49:51 cab_112,43.574906,39.766325,14:51:53 cab_26,43.612203,39.720491,14:52:48