Карты на стол: зачем нам понадобился собственный картографический сервис
Привет, Хабр! На связи Настя Швецова, руководитель проектов управления исследований и разработки «МосТрансПроекта». Недавно мы создали свой собственный картографический сервис. Вы спросите — зачем, есть же готовые решения? Да, но для наших нужд они не подходят по ряду причин. Что это за причины и в чем уникальность нашей ГИС расскажем под катом. Статья будет интересна тем, кто занимается картографией и геоинформационными системами.
Слой тонок
Наводить порядок с данными в институте мы начали в 2022 году, о чем рассказывали в отдельной статье. Львиная часть этих данных — это точки с координатами или полигоны, которые можно нанести на карту — автобусные остановки, светофоры, станции метро, выделенные полосы, санитарно-защитные зоны и т.д. Визуализация сильно помогает при работе, и мы решили, что хорошо бы иметь простой, удобный инструмент для сотрудников института и подведомственных организаций транспортного комплекса. Такой, чтобы можно быстро зайти в карту включить нужные слои, глянуть, все понять, принять решение и, если нужно, — скачать слой в файл.
На локальном уровне у многих «подведов» транспортного комплекса свои инструменты для визуализации данных уже были, но с ограниченным числом объектов и исключительно для локальных задач. Кто-то пользовался «Народными картами Яндекса», кто-то — опенсорс решениями. Данные у всех хранились в разных форматах и с разной точностью, единообразие отсутствовало. Очевидно, что нужно было нормальное корпоративное хранилище ГИС-данных с хорошей визуализацией, идею создания которой поддержали наши коллеги из департамента транспорта (а это было очень важно для старта и развития). Нашу ГИС мы назвали картографический информационный портал транспортного комплекса или КИП ТК.
Принять как данность
Проект можно поделить условно на две части. Первая — сбор данных, вторая — создание интерфейса.
Данных с разных «подведов» было действительно очень много, переварить их самостоятельно в разумные сроки было сложно. Мы подключили своих коллег из другого блока — ГИС специалистов. Процесс был устроен примерно так: они получали данные, вносили необходимые коррективы, готовили их для правильного отображения и отдавали нам. Мы со своей стороны обеспечивали то, что данные были «правильно» положены в базу данных. В качестве базы мы взяли за основу PostgresSQL с расширением PostGIS. Эта связка, пусть и не самая быстрая, позволяет очень гибко работать с геометрией. Можно, к примеру, вытащить объекты, входящие в полигон (например, полигон района Москвы), объединять полигоны, вырезать один из другого, строить полигоны из точек и так далее.
Чтобы понимать масштаб проведенной работы: два года назад у нас было 90 слоев разных данных, сейчас — порядка 170. Многих специфических данных нет ни в 2ГИС, ни в «Яндексе», ни где-либо еще.
Например, в КИП ТК нанесена информация о промерах глубин в Москва-реке (см. скришот выше). Зачем это нужно? Обычному пользователю это вряд ли понадобится (только если он решит нырнуть с аквалангом). А вот для дальнейшего развития речного транспорта в Москве такие знания очень важны. Другой слой — планы перспективных объектов (инфраструктуры, жилья и т.д.) с указанием сроков ввода в эксплуатацию: такого вы тоже нигде не найдете в достоверном виде. Зная эти планы, можно качественно спланировать схему транспортного обслуживания района не только в рамках отдельного строящегося объекта, но и с учетом перспективных объектов рядом, или решить, тянуть сюда ветку метро или линию трамвая. В нашей ГИС вообще много разной всячины, но не про все я могу рассказать, так как много данных для служебного пользования.
Вот пример, как в нашей системе выглядит рельсовый каркас Москвы:
Карта пошла
Теперь — про интерфейс.
Наносить слои с данными мы решили на готовую подложку. Тратить время на рисование собственной никто не собирался, поскольку у нас на тот момент уже была договоренность с 2ГИС об использовании их карты, ранее мы разработали «Узнай про ЖК» uznai.mos.ru, где уже использовали 2ГИС.
Мы выбрали для себя 2ГИС, в том числе, потому что в этой системе можно с карты по API забирать информацию о пространственном положении объекта в виде вектора и отгружать сведения в свою базу. В других сервисах такого функционала мы не нашли. А нам было прямо-то критически важно для расчета рейтингов новостроек получать всю информацию о расположении объектов. Для КИП ТК это уже не так принципиально, поскольку там объекты, по большей части, наши собственные. Но мы решили опираться на приобретенный опыт и не изобретать велосипед.
Кроме того, в 2ГИС можно улучшать подложку под наши нужды, что мы успешно протестили в «Узнай про ЖК» и чем мы впоследствии пользовались в КИП ТК.
На скриншоте: тепловая карта доступности ЖК на «Узнай про ЖК» на подложке 2ГИС
Рассматривался вариант и с опенсорс решениями. Тот же OpenStreetMap — классная альтернативная картографическая подложка, но сервис поддерживается сообществом фанатов на голом энтузиазме без какого–то понятного владельца. Ответственного и заинтересованного лица в обновлениях нет. Для нас, транспортников, важно, чтобы информация была максимально актуальной и без мусора. Ребята из 2ГИС и «Яндекс» на своем продукте зарабатывают, поэтому они следят за обновлениями и точностью. Кроме того, зависеть от иностранных серверов мы не хотели. Google также не рассматривали, поскольку нам нужно было отечественное решение.
Переключи скорость
По мере работы над КИП ТК мы столкнулись с парой интересных задач. Расскажу про самую сложную.
Наши объекты имеют довольно высокую точность, в результате объем данных, который нужно показывать поверх уже отрисованной подложки 2ГИС, получается очень большой. Например, один объект даже самой простой, на первый взгляд, формы (квадрат или треугольник), может состоять из тысячи точек с координатами. И когда мы начали смотреть нашу карту, включив все слои со всеми объектами, все начало жутко тормозить. Представьте, что вы открыли 500–мегабайтный PDF на старом ноутбуке. Вот примерно так же.
На скриншоте: санитарно-защитные зоны в КИП ТК
Мы начали думать над вариантами оптимизации. Первое, что пришло в голову — изменять точность данных (и как следствие — уменьшать их объем) в зависимости от масштаба карты. Но для этого нужно было хранить данные о геометрии каждого объекта для разных масштабов, что раздувало базу и добавляло риск, что данные начнут противоречить друг другу при возникновении ошибок.
Второй вариант — передавать набор данных клиенту для отрисовки каждого объекта в браузере клиента с помощью методов js библиотеки карт 2ГИС. Но и в этом случае компьютеры пользователей сильно тормозят, потому что данных передавалось ну очень много и рисовались они последовательно в цикле.
С этой проблемой мы пришли в 2ГИС, и они для нас доработали свой картографический модуль. Он получает нашу векторную информацию в geojson файле, который подключается, как источник данных в библиотеке, обрабатывает и значительно быстрее отрисовывает геометрию в браузере. За счет этого (а также за счет оптимизации по бэкенду на нашей стороне), ничего не тормозит и скорость загрузки слоев выросла в несколько десятков раз. Раньше такого инструмента у 2ГИС не было, но они его сделали по нашему запросу, за что им отдельное спасибо.
Ставим на карту
После релиза КИП ТК встал вопрос что делать с нашей системой дальше. Основная задача — собрать ГИС данных — выполнена. Но дело в том, что наши коллеги из департамента информационных технологий Правительства Москвы к моменту запуска КИП ТК начал активно развивать Цифровой двойник города — по сути, единой ГИС со всей сводной информаций с множеством слоев для всех городских организаций. В том числе, для транспортного комплекса. И та информация, которая есть сейчас в нашем КИП ТК, постепенно мигрирует в Цифровой двойник, который станет в будущем важным инструментов для общегородских решений, верхнеуровневой системой над всеми ГИСами для у всех департаментов правительства Москвы.
На скриншоте: возможность фильтрации по разным признакам (районам, округам, организациям, срокам постройки и ввода в эксплуатацию)
Но процесс создания и наполнения двойника не быстрый, поэтому сегодня мы продолжаем КИП ТК поддерживать и развивать. Тем более, что у транспортного комплекса для служебных нужд должен быть свой картографический сервис. КИП ТК также может выступать в роли «младшего брата» Цифрового двойника, на котором можно обкатывать данные перед тем, как передать их в двойник.
Ключевая ценность заключается в том, что мы оцифровали все наши объекты и привели их к единым стандартам ГИС. Теперь эти данные можно загружать в любые системы и развивать их. Мы сами или наши коллеги стали ими пользоваться чаще, потому что это стало удобнее. Кроме того, сложные ГИС часто требуют значительных затрат и времени на создание. Нам же удалось в короткие сроки и с ограниченными ресурсами создать рабочую систему, позволяющую быстро увидеть объекты на карте и принять необходимые решения.
Важны также опыт и знания, которые мы получили при создании собственной ГИС. Тем более, что в условиях активного развития территорий по всей стране у городских администраций и муниципалитетов, очевидно, есть запрос на подобный софт. Многим нужен рабочий инструмент-визуалиатор, в котором собираются и выводятся в нормальном виде все данные.
В перспективе мы хотим сделать из КИП ТК хранилку информации с набором удобных настроек «под себя». Важна и возможность выгружать с карты отдельные слои в машиночитаемом виде — это нужно транспортным аналитикам для работы. Думаем и над облачным решением, чтобы КИП ТК можно было пользоваться на наших серверах без загрузки мощностей на стороне клиента. Заказчику надо будет предоставить только набор датасетов, например, табличку с остановками и знаками, маршрутами городского транспорта и координатами.
Самое интересное о том, как будет развиваться и применяться наша ГИС, обязательно расскажем в будущих статьях. А как у вас, кстати, обстоят дела с картографией?
Над проектом КИП ТК работали Габдрахманов Руслан, Швецова Анастасия, Пахомов Антон, Баксаков Павел Кириллова Анастасия, Жидкова Юлия, Голубкова Екатерина, Федотова Наталья, Александр Голиков, Чехов Семен, Орлов Илья, Поправко Валерия, Болбас Никита, Шепелев Илья, Алена Кочеткова, Архипова Дарья, Гаврилин Георгий, Лукин Максим, Юрий Бутенко, Мария Майорова, Дарья Соловьева, Татьяна Анисимова.