Недавно мы были рады объявить о выпуске нашего нового редактора карт. Обновленная версия этого инструмента дает пользователям представление о настоящей доске для рисования, что делает процесс создания карт более плавным и интуитивно понятным. Мы также внимательно ознакомились с наиболее популярными графическими программами и проследили их шаги в отношении компоновки рабочего пространства и навигации. Но мы сделали больше, чтобы помочь пользователям легко составлять собственные планы размещения. Новый Map Creator позволяет рисовать в наиболее удобном месте, но при этом учитывает географические координаты. Узнайте, почему эта новая функция так важна и что нам пришлось делать со всеми существующими картами.
** Спойлер: эта статья содержит массу полезных советов **
Как это работало раньше?
В предыдущей версии Indoorway Map Creator для создания плана пространства нашему пользователю приходилось:
- выбрать местоположение здания с помощью Google Maps API,
- загрузить файл с планом помещения,
- разместите его в правильном месте на карте.
В этой конфигурации мы показали план пространства в Map Creator, где наш пользователь мог продолжить рисовать карту: рисовать комнаты, устанавливать пути и POI и т.д. который часто переворачивался или сдвигался - могли возникнуть проблемы.
Теперь это стало еще проще и приятнее!
Выглядит здорово, не правда ли? Этот пост научит вас, как добиться такого эффекта.
Возможности PostGIS
Поскольку в Indoorway мы работаем с геопространственными данными, PostGIS очень помогает в наших повседневных задачах. И снова нас это нисколько не разочаровало. Напомню, что PostGIS - отличное геопространственное расширение PostgreSQL. Это позволяет сохранять геометрические и географические объекты в базе данных и выполнять над ними операции.
С помощью PostGIS вы можете создавать различные формы (многоугольники, линии линий и т. Д.), Вычислять площадь формы или расстояние между заданными объектами, определять, находится ли объект в радиусе от другого объекта, и многое другое. Мы впечатлены возможностями PostGIS и тем, насколько легко управлять и анализировать данные с помощью этой библиотеки.
Системы пространственной привязки
Вращать пространственные объекты не так просто, как может показаться, особенно когда мы хотим показать результаты без каких-либо искажений в Map Creator. Ключом к решению этой проблемы является использование правильной системы пространственной привязки (SRS), которая определяет местоположение географических объектов. Есть два распространенных типа систем координат:
- Географическая система координат, которая является хорошо известной системой широты и долготы.
- Система координат проекции, которая определяет конкретную проекцию карты. Все доступные картографические проекции преобразуют сферическую форму Земли в плоскую поверхность.
Эти системы можно идентифицировать по идентификатору пространственной справочной системы (SRID), включая набор данных EPSG.
PostGIS включает специальную таблицу под названием space_ref_sys, в которой мы можем найти определения всех доступных систем координат для базы данных.
Правильное определение SRS оказывается очень важным для нашего процесса трансформации. Но как узнать, какой SRID нам следует использовать?
Прежде чем вы получите ответ на этот вопрос, посмотрите, какие инструменты мы используем для визуализации данных в нашем проекте.
Инструменты, которые любит Indoorway
Все разработчики внешнего интерфейса Indoorway согласны с тем, что Leaflet.js и Google Maps API являются очень полезными инструментами. Важно знать, какие системы координат они используют.
По умолчанию Карты Google и Leaflet.js используют систему координат проекции Сферический Меркатор. Сферический Меркатор официально описан EPSG: 3857. Кроме того, данные, которые мы отправляем в Leaflet.js, имеют формат GeoJSON, который использует координаты в географической системе координат (EPSG: 4326).
Имея в виду эту основную информацию, приступим к реальной работе.
Процесс преобразования
Нашим примером будет следующий план помещения:
Мы храним данные, описывающие схему космического плана и его фон в GeoJSON. Как упоминалось выше, в черновике плана помещения вы также можете добавить комнаты и дорожки. Преобразование этих объектов основано на тех же правилах, что и преобразование контура, поэтому в этой статье мы их пропустили.
Что нам нужно для начала ротации?
PostGIS поддерживает нас с помощью функции ST_Rotate (geometry geom, float radians, geometry pointOrigin), которая вращает геометрию на заданные радианы относительно опорной точки против часовой стрелки.
Начнем с определения угла. ST_Azimuth - здесь может помочь одна из функций PostGIS. Как говорится в документации:
”ST_Azimuth возвращает азимут на север в виде угла в радианах, измеренного по часовой стрелке от вертикали в точке A до точки B. Азимут - это угол отсчета от севера и положительный по часовой стрелке: север = 0; Восток = π / 2; Юг = π; Запад = 3π / 2 ».
Углы загруженного плана пространства мы берем как точку А и точку Б. На рисунке ниже показано, как выбрать углы и установить правильный угол:
Как мы реализуем это действие? Именно так:
Поскольку мы показываем объекты в EPSG: 3857, все операции должны выполняться в одной системе координат.
Мы используем ST_Transform (geometry geom, integer SRID) для перепроецирования данных. Эту функцию иногда можно спутать с функцией управления SRS, которая имеет следующий вид: ST_SetSRID (geometry, SRID). Помните, что только ST_Transform изменяет координаты из текущей системы в новую.
Более того, в представленном выше примере мы видим использование ST_GeomFromText с определенным SRID. Этот шаг очень важен перед преобразованием геометрии в SRID = 3857. Что бы произошло, если бы мы применили геометрию без определения SRID?
Ой! Что-то пошло не так ¯ \ _ (ツ) _ / ¯
Когда мы создаем объект без определенного SRID, мы не можем использовать его во многих видах пространственной обработки. Один из них - преобразование геометрии в другую систему координат. Поскольку мы работаем с GeoJSON, мы можем применять систему географических координат.
Первый шаг позади. Нам нужно повернуть контур космического плана относительно определенной контрольной точки, которая в данном случае является центром нашего фона. PostGIS предлагает такую функцию:
Здесь появляется кое-что новое - функция ST_GeomFromGeoJSON, которая анализирует геодезическое представление геометрии и возвращает геометрию.
Приближаемся к окончательному результату. Пришло время для главного: ротации!
Нам просто нужно вставить данные в функцию вращения:
Мы почти закончили. Есть еще одна важная вещь - передать результат в Leaflet.js, который принимает GeoJSON. Чтобы правильно завершить процесс, мы должны сначала преобразовать координаты геометрии в географическую систему координат, а затем вернуть геометрию как элемент GeoJSON:
С помощью ST_AsGeojson мы получаем только геометрию, а не завершенный GeoJSON.
Окончательный эффект в Map Creator представлен на рисунке ниже:
Мы сделали это! Выглядит великолепно и не вызывает искажений.
Что бы произошло, если бы мы не применили правильную систему координат?
Что ж, результат, представленный выше, точно не соответствует форме нашего плана пространства. Проект деформирован.
Резюме
Как вы видите, PostGIS отлично справляется с работой в Indoorway Map Creator и плавно выполняет все преобразования, необходимые для создания плана пространства. Его библиотека разрабатывалась годами, поэтому API является стабильным и зрелым. Возможности PostGIS четко и должным образом задокументированы, поэтому стоит рассмотреть его для любых ГИС-приложений.
Прямо сейчас в нашем обновленном Map Creator пользователь может почувствовать себя настоящим дизайнером. Он может сосредоточиться на деталях проекта и создать более точный план помещения. Черновик адаптируется к карте мира в конце всего процесса. Конечно, мы сохраняем необработанные данные, если пользователь хочет вернуться к ним.
Какой у вас опыт работы с вращающимися фигурами? Поделитесь своим мнением и идеями под этим постом!