- Оригинальный адрес:Build a bikesharing app with Redis and Python
- Оригинальный автор:Tague Griffith
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:Starrier
- Корректор:Raoul1996,rydensun
Создайте приложение для совместного использования велосипедов с помощью Redis и Python
Узнайте, как использовать Redis и Python для создания приложений с учетом местоположения.
Источник изображения:Travis Wise. CC BY-SA 2.0
Хотя я много путешествую, я не очень люблю водить машину, поэтому, когда у меня есть свободное время, я предпочитаю гулять или кататься на велосипеде по городу. Во многих городах, в которых я путешествовал, есть системы проката велосипедов, которые позволяют арендовать велосипед на несколько часов. У большинства этих систем есть приложение, помогающее пользователям находить и арендовать свои велосипеды, но для таких пользователей, как я, было бы лучше иметь единое место для получения информации обо всех велосипедах, доступных для аренды в городе.
Чтобы решить эту проблему и открыть исходный код для добавления функций определения местоположения в веб-приложения, я объединил общедоступные данные о совместном использовании велосипедов,PythonЯзыки программирования и открытый исходный кодRedisСервер структуры данных в памяти для индексации и запроса геопространственных данных.
Получившееся в результате приложение для совместного использования велосипедов объединяет данные из множества различных систем обмена, в том числе в Нью-Йорке.Citi BikeОбщие велосипеды. Он использует общий поток данных о совместном использовании велосипедов, предоставляемый системой Citi Bike, и использует его данные для демонстрации некоторых возможностей, которые можно создать с помощью Redis для индексации геопространственных данных. Данные Citi Bike основаны наЛицензионное соглашение о данных Citi Bikeкоторый предоставил.
Общая спецификация потока данных общего велосипеда
Спецификация общего потока данных для совместного использования велосипедов (GBFS) созданаСевероамериканская ассоциация велопрокатаразвитиеспецификация данных с открытым исходным кодом, целью которого является упрощение картографическим и транспортным приложениям добавления систем велопроката на свои платформы. В настоящее время в мире существует более 60 различных систем обмена, использующих эту спецификацию.
Поток данных состоит из нескольких простых частей, содержащих информацию о состоянии системы.JSONсостав файла данных. Поток данных начинается с файла JSON верхнего уровня, ссылающегося на URL-адрес данных подпотока:
{
"data": {
"en": {
"feeds": [
{
"name": "system_information",
"url": "https://gbfs.citibikenyc.com/gbfs/en/system_information.json"
},
{
"name": "station_information",
"url": "https://gbfs.citibikenyc.com/gbfs/en/station_information.json"
},
. . .
]
}
},
"last_updated": 1506370010,
"ttl": 10
}
Первым шагом является загрузка данных из system_information и station_information, информации потока данных о станциях проката велосипедов, в Redis.
system_information
Идентификатор системы потока данных, который представляет собой короткий код, который можно использовать для создания пространств имен для ключей Redis. Спецификация GBFS не определяет формат системного идентификатора, но гарантирует его глобальное уникаль- ность. Для системных идентификаторов многие потоки данных велопроката используют короткие имена, такие как Coast_bike_share, boise_greenbike или topeka_metro_bikes. Другие используют знакомые географические аббревиатуры, такие как NYC или BA, а один использует универсальный уникальный идентификатор (UUID). Приложение для проката велосипедов использует идентификатор в качестве префикса для создания уникального ключа для данной системы.
Station_Information
Потоки данных предоставляют статическую информацию об общих сайтах, составляющих систему. Сайты представлены объектами JSON с несколькими полями. В объекте сайта есть несколько обязательных полей, которые предоставляют идентификатор, имя и местоположение реального сайта. Есть также несколько необязательных полей, которые предоставляют полезную информацию, такую как ближайший перекресток или доступные способы оплаты. Это основной источник информации для этой части приложения для проката велосипедов.
создать базу данных
Я написал пример приложения -load_station_data.py, который имитирует то, что может произойти во внутреннем процессе, загружающем данные из внешнего источника.
Найдите сайт проката велосипедов
отРепозиторий Github GBFSизsystems.csvфайл для загрузки общих данных велосипеда.
складsystems.csvФайл предоставляет URL-адрес обнаружения с доступными потоками данных GBFS для зарегистрированных систем проката велосипедов. URL-адрес обнаружения является отправной точкой для обработки информации о велопрокате.
load_station_data
Приложение берет каждый URL-адрес, найденный в системных файлах, и использует его для запроса двух URL-адресов потока данных: информации о системе и информации о сайте. Поток данных системной информации предоставляет один ключевой элемент информации: уникальный идентификатор системы. (Примечание. В файле systems.csv также содержатся системные идентификаторы, но некоторые идентификаторы в этом файле не совпадают с идентификаторами в ленте, поэтому я всегда получаю идентификаторы из отзывов.) системные данные, такие как URL-адрес проката велосипедов, номер телефона и адрес электронной почты. Может быть добавлено в будущих версиях приложения. Так что используйте ключ${system_id}:system_info
Храните данные в хэшах Redis.
Загрузить данные сайта
Информация о сайте предоставляет данные для каждого сайта в системе, включая местоположение системы.load_station_data
Приложение выполняет итерацию по каждому сайту в отзыве сайта, используя что-то вроде${system_id}:station:${station_id}
Ключ хранит данные каждого сайта в хеше Redis. использоватьGEOADD
Команда добавляет местоположение каждой станции в геопространственный индекс велопроката.
обновить данные
При последующих запусках я не хотел, чтобы код удалял все потоковые данные из Redis и перезагружал их в пустую базу данных Redis, поэтому я тщательно обдумал, как обрабатывать локальные обновления данных.
Код сначала загружает набор данных обо всех сайтах проката велосипедов, которые были загружены в память системой. При загрузке информации для сайта удалить сайт (нажатие клавиши) из набора памяти сайта. После загрузки всех данных сайта мы получаем набор данных, содержащий все сайты, которые система должна удалить.
Приложение перебирает набор сайтов и создает транзакцию для удаления информации сайта, удаления ключа сайта из геопространственного индекса и удаления сайта из списка сайтов системы.
комментарии к коду
существуетобразец кодаЕсть некоторые интересные вещи, на которые стоит обратить внимание. Во-первых, используйтеGEOADD
команда для добавления термина в геопространственный индекс, но сZREM
команда удалить. Поскольку базовая реализация геопространственных типов использует отсортированные наборы, используйтеZREM
Удалить записи. Обратите внимание, что для краткости пример кода демонстрирует, как использовать один узел Redis; при работе в кластерной среде модуль транзакций необходимо будет реорганизовать.
Если вы используете Redis 4.0 (или более позднюю версию), есть некоторыеDELETE
иHMSET
Альтернатива команде. Redis 4.0 предлагаетUNLINK
команда какDELETE
Асинхронная замена команд.UNLINK
Ключ будет удален из пространства ключей, но освободит память в отдельном потоке.HMSET
командоватьУстарело в Redis 4.0,HSET
Команды теперь изменяемы(То есть он принимает переменное количество аргументов).
Уведомить клиента
В конце процесса клиенту будет отправлено уведомление на основе наших данных. Используя механизм публикации/подписки Redis, уведомления проходятgeobike:Station_Changed
Канал отправляется с идентификатором системы.
модель данных
При структурировании данных с помощью Redis важнее всего учитывать, как запрашивать информацию. Два основных запроса, которые должно поддерживать приложение для проката велосипедов:
- Найти ближайшие сайты
- Отображение информации о сайте
Redis предоставляет два основных типа данных для хранения данных: хэши и отсортированные наборы.тип хешаПрекрасно сопоставляется с объектами JSON, представляющими сайты; поскольку хэши Redis не применяют схемы, их можно использовать для хранения изменяемой информации о сайте.
Конечно, для географического поиска сайтов требуется геопространственный индекс для поиска мест относительно определенных координат. Предоставлено Редисомнекоторые командыиспользоватьотсортированный наборСтруктура данных строит географический контрольный индекс.
Мы используем${System_id}:Station:${Station_id}
Ключ построения хеша в формате, который содержит информацию о сайте и ключе, используемый${System_id}:Station:Location
формат для запроса геопространственного индекса сайта.
Получить местоположение пользователя
Следующим шагом в создании приложения является определение текущего местоположения пользователя. Большинство приложений делают это с помощью встроенных сервисов, предоставляемых операционной системой. Операционная система может предоставлять приложениям информацию о местоположении на основе встроенного в устройство оборудования GPS или приблизительной доступной сети Wi-Fi устройства.
местоположение запроса
Следующим шагом после определения местоположения пользователя является поиск ближайших сайтов проката велосипедов. Геопространственные функции Redis могут возвращать информацию о сайте в пределах заданного расстояния от текущих координат пользователя. Ниже приведен пример использования интерфейса командной строки Redis.
Представьте меня в магазине Apple на Пятой авеню в Нью-Йорке, я хочу пойти в Mood на 37-й улице в Вест-Сайде с моими друзьямиSwatchпоболтать с. Я мог бы взять такси или метро, но я бы предпочел покататься на велосипеде. Есть ли поблизости сайты обмена? Могу ли я арендовать машину там?
Apple Store находится по адресу 40.76384, -73.97297. Согласно карте, две велосипедные станции — Grand Army Plaza и Central Park South and East 58th St. & Madison — расположены в пределах 500 футов (синие на карте выше).
Я могу использовать RedisGEORADIUS
Команда запрашивает системный индекс Нью-Йорка для сайтов радиусом 500 футов:
127.0.0.1:6379> GEORADIUS NYC:stations:location -73.97297 40.76384 500 ft
1) "NYC:station:3457"
2) "NYC:station:281"
Redis возвращает два местоположения велопроката, найденные в этом радиусе, используя элементы геопространственного индекса в качестве ключей для метаданных, специфичных для сайта. Следующим шагом будет поиск названий этих двух сайтов:
127.0.0.1:6379> hget NYC:station:281 name
"Grand Army Plaza & Central Park S"
127.0.0.1:6379> hget NYC:station:3457 name
"E 58 St & Madison Ave"
Эти ключи соответствуют станциям, указанным на карте выше. Если я хочу, я могуGEORADIUS
Добавьте в команду больше флагов, чтобы получить список элементов, их координаты и расстояние от текущего сайта:
127.0.0.1:6379> GEORADIUS NYC:stations:location -73.97297 40.76384 500 ft WITHDIST WITHCOORD ASC
1) 1) "NYC:station:281"
2) "289.1995"
3) 1) "-73.97371262311935425"
2) "40.76439830559216659"
2) 1) "NYC:station:3457"
2) "383.1782"
3) 1) "-73.97209256887435913"
2) "40.76302702144496237"
Поиск имен, связанных с этими ключами, дает упорядоченный список сайтов, из которых я могу выбирать. Redis не предоставляет возможности направления или маршрутизации, поэтому я использую возможности маршрутизации ОС устройства, чтобы нарисовать маршрут от моего текущего местоположения до выбранной велосипедной станции.
GEORADIUS
Функции можно легко реализовать в API вашей любимой среды разработки, чтобы добавить в приложение функциональность определения местоположения.
Другие команды запроса
КромеGEORADIUS
В дополнение к команде Redis также предоставляет три команды для поиска данных из индексаGEOPOS
,GEODIST
и GEORADIUSBYMEMBER
.
GEOPOS
Команды могут предоставить координаты данного элемента из геохэша. Например, если я знаю, что на Западной 38-й и 8-й улицах есть станция проката велосипедов, и ее идентификатор — 523, то имя элемента для этой станции — NYC:station:523. Используя Redis, я могу найти долготу и широту сайта:
127.0.0.1:6379> geopos NYC:stations:location NYC:station:523
1) 1) "-73.99138301610946655"
2) "40.75466497634030105"
GEODIST
Команда предоставляет индекс расстояния между двумя элементами. Если бы я хотел узнать расстояние между Grand Army Plaza и Central Park South и остановками на East 58th St. & Madison, я бы выполнил следующую команду:
127.0.0.1:6379> GEODIST NYC:stations:location NYC:station:281 NYC:station:3457 ft
"671.4900"
Наконец,GEORADIUSBYMEMBER
Команды типаGEORADIUS
команда, но вместо набора координат эта команда берет имя другого элемента индекса и возвращает все элементы в пределах заданного радиуса с центром на этом элементе. Чтобы найти все станции в пределах 1000 футов к югу от площади Гранд Арми Плаза и Центрального парка, введите следующее:
127.0.0.1:6379> GEORADIUSBYMEMBER NYC:stations:location NYC:station:281 1000 ft WITHDIST
1) 1) "NYC:station:281"
2) "0.0000"
2) 1) "NYC:station:3132"
2) "793.4223"
3) 1) "NYC:station:2006"
2) "911.9752"
4) 1) "NYC:station:3136"
2) "940.3399"
5) 1) "NYC:station:3457"
2) "671.4900"
Хотя в этом примере основное внимание уделяется использованию Python и Redis для анализа данных и создания индекса местоположений системы проката велосипедов, его можно легко обобщить для определения местоположения ресторанов, общественного транспорта или любого другого типа места, чтобы помочь пользователям найти его.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.