Районный бот

Я живу в классическом районе новостроек: широкие проспекты или лес по краям, десятки высоток внутри, и всё в пешей доступности. Застройщик не знал меры с торговыми площадями: у нас три ТЦ и офисные помещения в подвалах почти каждого дома. Короче, столько магазинов и заведений вокруг, что запомнить невозможно, поэтому хочется нарисовать карту.

Вместо карты я за три недели написал телеграм-бота. Кажется странным: неужели это удобнее, чем интерактивная карта с маркерами, в которые можно тыкать? А вот да: во-первых, как я постоянно говорю, интерактивная карта — признак ленивого интерфейса. Всегда можно придумать лучший интерфейс, который не будет заставлять человека таскать картинки по экрану.

Во-вторых, веб не нужен. Жизнь уходит из страничек в браузере, они — для чтения лонгридов, а тыкают люди в экраны телефонов. Делать проекты нужно там, где живёт твоя целевая аудитория. Ларёк с мороженым лучше открывать на пляже, а не в музее. Указания, куда пройти, — с собой, а не дома на компьютере. Ну и наконец, интерфейс телеграма — отличный вызов для картографического приложения.

Поле ввода и ряд кнопок под ним — это всё, что есть. Нечего таскать, некуда кликать. Бот простой и умеет только отвечать на вопросы. Но знает многое:

  • Ищет заведения по ключевым словам. Да, я внезапно написал геокодер.
  • Выдаёт карту из космоснимка, который я специально обрисовал в гимпе.
  • Подсказывает подъезд и этаж по номеру квартиры для всех домов.

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

Самым интересным было не делать базовые штуки для людей, а организовать процесс сбора заведений, чтобы он не напрягал неразобранными фоточками и записями, был быстр и приятен, не требовал дня отдыха после дня работы. Решение довольно простое: отказаться от двухэтапного картирования. Подошёл к магазину — открыл телеграм — понажимал там кнопочки и вписал слова — сфоткал — сохранил, и магазин сразу появился в выдаче.

Каждый вечер я возвращался домой и дописывал бота, чтобы переложить с себя на него все сложности. Вводить «https://» муторно — пусть бот сам превращает «Ttn. By» в «https://ttn.by». Не ждём точек с запятой и дефисов, позволяем пробелы и запятые. Вместо ввода номера дома предлагаем выбор из ближайших адресов. Ну и так далее: не нужно заставлять человека делать работу, с которой справится машина.

Так я собирал по 60-100 заведений в день, около 15 в час. Это включало в себя не только списывание данных, но и иногда разговоры с сотрудниками, которым я раздавал визитки бота. На районе около полутысячи заведений — знай я это заранее, дважды бы подумал, запуская проект. Но теперь он почти завершён, и я готовлю доклад на FOSDEM и приглашения для СМИ.

Уверен, эта новость вызовет три вопроса:

  1. Кто будет обновлять данные, когда я съеду с Маяка Минска?

Не знаю. То есть, конечно, любой человек может нажать кнопку «Поправить» под любым найденным в боте заведением, равно как и добавить новое. Но по опыту понятно, что никто этим заниматься не будет: людям, даже владельцам, проще написать админу в личку или забить. Нужны такие же энтузиасты, как я. И нужен интерфейс, который позволит на повторный обход полутысячи заведений угрохать не неделю, а один-два дня. Его зачатки уже есть (и способ описан в документации), но можно сделать удобнее, особенно для торговых центров. Я пока думаю, как.

  1. Где тут OpenStreetMap?

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

  1. Как мне поднять такого же бота для своего района?

Самый главный вопрос! Бот опубликован на гитхабе, рядом с ним лежит огромная документация в пяти частях на русском языке. В ней я описал весь процесс, от обхода подъездов и установки бота до сбора заведений и администрирования. Если не считать русского языка, сообщения на котором разбросаны по коду, бот не привязан ни к каким атрибутам моего района. Хотите потратить неделю на обход каждого здания и потом поднять полезный сервис для всех соседей — буду рад помочь!

Приложение пилят — опенсорсные щепки летят. Пока готовил данные и писал бота, разочаровался в сложности базовых операций в вебе. Например, получить числа координат для прямоугольника можно на нескольких сайтах (например), и довольно удобно. А вот скопировать координаты одной точки — непросто. Специальные сайты писались семь-восемь лет назад и все сломались. А использовать для этого osm.org, где нужно открывать панель, ставить галочку, нажимать Ctrl+C... Линукс-версия телеграма не позволяет прикреплять координаты, поэтому пришлось писать свой сайт на замену. Очень простой: двигаешь карту, нажимаешь кнопку, вставляешь куда нужно.

Ещё я горжусь редактором точек в GeoJSON, которым пользуюсь для причёсывания базы заведений бота. Классические редакторы типа geojson.io, uMap, QGIS не катят: чтобы отредактировать точку, нужно ползать по таблицам, двигать мышкой, нажимать «сохранить». Здесь же всё супер-просто: двойной клик для создания точки, все свойства — простым текстом типа «name Название», по примеру Level0. Поэтому копипаст пачки атрибутов вообще не проблема. Есть фильтр а-ля поиск в JOSM, всё сохраняется автоматически и можно восстановить, если закроешь вкладку. Никаких меню и не больше шести кнопок на экране.

Эти новогодние каникулы прошли под темой хорошего пользовательского интерфейса. Видишь неудобство — не мирись, исправь. Именно так развиваются открытые экосистемы: людям чего-то не хватает, и внезапно у них щёлкает понимание, как должно быть, и образовывается время это сделать. Сообщество открытого кода последние годы пытается решить вопрос, что делать, когда понимание и время возникают у разных людей, и откуда взять деньги, чтобы их соединить. Но пока жителям Маяка Минска и тем, кто работает с точками в GeoJSON, немного повезло.

Поделиться
Отправить
Запинить
3 мес   проекты

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

9 комментариев
Сергей Лещина ❤️✊✌️ 3 мес

Вопрос про OSM: понятно, что делать чисто на нём не очень удобно, и можно утонуть в тегах; но почему бы не брать базовую информацию оттуда и не обогащать своей?

Илья Зверев 3 мес

А что я от этого получу, кроме ODbL на всю свою дополненную базу?

Дмитрий Семиградский 3 мес

Натянуть бота на Яндекс.Справочник и было бы ещё полезнее. И отпал бы вопрос обновления данных.

Илья Зверев 3 мес

Яндекс не делится данными. И Яндекс зарабатывает на данных. Так что вопрос тот же: что я получу от Яндекса, когда обойду для него полтысячи заведений и ещё и напишу бота, чтобы сделать доступ к Справочнику удобнее?

Александр Сапожников 3 мес

Проверил — твой GeoJSON-редактор быстр и для одной из моих задач, ради которой пробовал, вполне подходит. Так что гордишься вполне заслуженно :-)
Спасибо!

AnakinNN 3 мес

А что я от этого получу, кроме ODbL на всю свою дополненную базу?

Да это вообще главный вопрос — что человек получает от участия именно в OSM? В Яндексе понятно — по новым адресам начинает работать такси и доставка, новые дороги видны в браузере, на мобильном и по ним начинает вести навигатор, да и вообще картой пользуются миллионы. Когда ты делаешь что-то у себя локально — ни с кем не надо согласовывать теги, думать об обратной совместимости, следить чтобы никто одарённый не переправил всё под себя. А что ты получишь, если решишь вести данные (по России) в OSM? Помогать их актуализировать сообщество не будет — проверено. Испортить/откатить из чувства прекрасного — запросто. Будут ли они кому-то нужны, даже свободными-бесплатными — вряд ли, учитывая, что картопродуктами на базе OSM в РФ пользуется мизерный процент. Пропихнуть новые теги на стандартный стиль — нереально, там более важные предложения годами висят, так что для визуализации придется становиться айтишником и осваивать Mapbox. По сути единственное, что ты получаешь — возможность составить хитрый запрос в Overpass и полюбоваться своими синими точками поверх подложки.

freeExec 3 мес

А мне фишка с ближайшими возможными адресами понравилась, надо брать на заметку.

Сергей Лещина ❤️✊✌️ 3 мес

А что я от этого получу, кроме ODbL на всю свою дополненную базу?

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

PS: Если хранить правильно, то не будет ODbL на дополнительную базу.

OverQuantum 3 мес

«Но тут Илья нашёл фатальный недостаток в OSM» :)
Как это решение масштабируется? В каждом районе завести своего бота? А тем кто между районами перемещается — им несколькими ботами пользоваться? Удобно, наверное...

Илья Зверев 3 мес

Никак не масштабируется. Много разных ботов, ага. Я думал насчёт хранения нескольких районов в одном боте, а в идеале — чтобы никому вообще ничего не пришлось устанавливать, просто я бы нажимал кнопочку «добавить район», и всё уже работало. Тогда и район переключить можно было бы хоть по геолокации. Но это бы всё слишком усложнило, потому что в конфиге много районо-специфичных текстов и кнопок.

Илья Зверев 3 мес

Да, вопрос про OpenStreetMap — он очень важный. ODbL — это так, подколка, потому что по гайдлайну о незначительных выгрузках, карта одного района не потребует share-alike, даже если там не только poi, но и всё остальное. Но действительно, почему бы не хранить всё в OSM, как я собирался раньше?

Система была бы примерно такая: картируем в OSM заведения, затем периодически вытаскиваем их по API и дополняем информацией из внутренней базы (фоточки, комментарии и т. п.). Связываем эти базы по тегу в OSM, например. Когда нужно что-то поправить или добавить — запускаем iD.

Получается: две базы данных, связанных через тег, общая система тегов, если хотим отредактировать из бота — то нужно приделывать OAuth и заливать объекты в OSM. Дальше, нужно фильтровать всякие скамейки и деревья, обогащать инфой не только POI, но и дома с подъездами, настраивать соответствия между addr:floor и нормальным обозначением этажа.

Короче, две недели работы на то, чтобы эту связь наладить, сохранить, и при этом не рассориться с белорусскими осмерами. А у меня на всё про всё было три недели. Тупо сделать свою базу гораздо проще.

При этом какая-то связь есть: в теории можно выгрузить POI из OSM, форматы тегов и часов работы совпадают, большую часть полей можно взять один в один. Правда, потом всё равно придётся всё заново обходить, потому что фоточек в осме нет.

bopoh13 3 мес

GeoJSON Editor хороший инструмент (попробовал импорт с параметрами). Спасибо, Илья.

Популярное