Мы верим в то, что наша планета имеет сферическую форму, поэтому логичным развитием иммерсивной карты стало появление глобуса. Позволили себе отойти от привычной проекции Меркатора и теперь на дальних зумах показываем вместо «плоской» карты земной шар. Объясняем, как и зачем мы старались нарисовать честный глобус.
Геодезическая проекция
Традиционно геоданные для отображения в вебе или на мобильном устройстве проецируются на плоскость при помощи какой-либо картографической проекции. По популярности лидирует проекция Меркатора*.
На таких картах формы объектов искажаются, а расстояния точны только на экваторе — чем ближе к полюсам, тем больше отклонения. Сами полюсы изобразить на таких картах вообще невозможно (об этом ниже).
Сейчас проекция Меркатора в изменённом виде лежит в основе стандарта для веба EPSG:3857. Но и этот стандарт подходит, скорее, для карт крупного масштаба, изображающих территории при большом приближении.
Проекцию Меркатора во всей красе можно было до последнего времени увидеть на картах 2ГИС на самом дальнем зуме.
Герард Меркатор
В XVI веке издал несколько «Атласов», в которых использовал проекцию, позже названную его именем. Он был не только учёным, но и бизнесменом — зарабатывал на продаже карт
EPSG:3857 не подходит для глобуса, так как он не является плоским объектом. Лучше подходит ECEF-проекция (от англ. Earth-centered, Earth-fixed) — декартово пространство с нулём в центре Земли.
Просмотр такой карты, как в 2ГИС, требует ресурсов. Проецирование и отрисовка видимой части карты — достаточно затратная во времени операция. Обычно она выполняется на сервере, а на клиент, на устройство пользователя, данные приходят в нужной проекции.
Карта — плоская, а глобус — круглый. Делать и хранить две разные версии карты для них нецелесообразно, поэтому мы пришли к следующей схеме:
Площадные и линейные объекты отрисовываем в текстуру, которая в нашем случае играет роль плоскости
Полученную текстуру отрисовываем на фрагменте сферы
Из полученных фрагментов сферы формируем глобус
Из этой схемы выбились точечные объекты, такие как надписи и иконки. Эти объекты рисуются не в плоскости карты, а в плоскости камеры. На сфере глобуса их не нарисуешь. Поэтому для них мы использовали перепроецирование по схеме:
Карты в вебе обычно загружаются не сразу и не целиком. Они делятся на квадраты — тайлы, каждый из которых рисуется отдельно.
Тайлирование, то есть разделение данных на эти квадраты, подразумевает, что рисоваться они будут в проекции Меркатора, тогда тайлы равномерно заполняют экранное пространство.
Тайловая сетка на плоской карте
Для глобуса обычное тайлирование данных неоптимально — у полюсов тайлы начинают «мельчить».
Обычная тайловая сетка на глобусе — на полюсах толчея из мелких тайлов
Если тайлов много, это негативно влияет на производительность. Во-первых, все эти мелкие элементы надо загрузить по сети. Во-вторых, они создают повышенную нагрузку на отрисовщик (в нашем случае WebGL), который быстрее обрабатывает более сгруппированные данные, нежели небольшие и единичные.
Неплохим решением могло бы стать альтернативное тайлирование, оптимальное для глобуса, но надо помнить, что тайлы мы трогать не хотели, поэтому обошлись более лёгким решением. Им стал апскейл — использование тайлов более крупного зума там, где тайлы нужного зума были слишком мелкими. Этот метод позволяет рисовать один тайл вместо четырёх или даже 16 более мелких тайлов.
Решение о том, какие тайлы нужно апскейлить, а какие рисовать как есть, принимается эвристически. В общих чертах это тайлы, приближающиеся к полюсам, и тайлы, находящиеся на «периферии глобуса», то есть наиболее далёкие от камеры, заходящие за горизонт.
Тайловая сетка с апскейлом: тайлов гораздо меньше, при том же визуале глобуса
Полюса
Особенность проекции Меркатора и её вариации для веба EPSG:3857 состоит в том, что она не покрывает всего возможного диапазона широты. Эта проекция простирается от -85 градусов южной широты до 85 градусов северной. А полюса остаются неотрисованными.
Честно отпроецированные данные из этой проекции на сферу выглядят вот так.
Идеальным решением было бы подтянуть данные о ледниках, добавить в карту ещё одну проекцию — на этот раз азимутальную — и совместить её на сфере с проекцией Меркатора. Но мы решили, что за один раз будем добавлять в карту лишь какую-нибудь одну проекцию, чтобы не увлечься и не затянуть задачу.
Решением, которое мы в итоге применили, стала «затяжка» полюсов. У фрагмента сферы — меша, на котором рисуются тайлы, прилегающие к границе полюса — мы берём самые ближние к нему вершины и силком притягиваем их к полюсу.
На Южном полюсе получилось идеально
На Северном — чуть похуже
Плавный переход
Глобус хорошо смотрится на большом отдалении. При дальнейшем приближении он начинает больше мешать — самой планеты не видно, однако сферический характер геометрии сохраняется. Это влияет на механику перемещений и отображение объектов на близких зумах. Мы решили, что на близких зумах карта останется плоской, а по мере отдаления станет плавно превращаться в глобус — так делают и наши конкуренты.
Чтобы плавно перейти от сферы к плоскости, потребовалось доработать шейдеры — в них передаются координаты в обеих проекциях — в Меркаторе и в ECEF, после чего происходит их интерполяция.
Звёздное небо
После отрисовки глобуса было важно позаботиться и об окружающем его пространстве. Добавили звёздное небо, вокруг планеты нарисовали гало — свечение, которое создаётся атмосферой при прохождении через неё солнечных лучей. Всё это добавило глубины пространству и сделало образ планеты завершённым.
Зачем это
Мы стремимся к тому, чтобы наши карты выглядели реалистично и создавали ощущение настоящего мира. И сейчас, если отдалиться на масштаб страны, вы увидите нашу карту в форме сферы. Пусть это решение и не несёт прямой практической пользы, но оно делает взаимодействие с картой приятнее и органичнее.
Как посмотреть
Сейчас глобус работает в десктопной версии веб-версии.
Нажимая кнопку «Комментировать», вы принимаете условия Лицензионного соглашения и даёте ООО «ДубльГИС» согласие на обработку персональных данных на условиях и в целях, определённых «Политикой конфиденциальности».