Хабрахабр

QGIS и тайловый экспорт


Несколько лет я занимаюсь рисовкой и поддержанием в актуальном состоянии схем-хребтовок двух горных районов. Джунгарского алатау и Центрального Тянь-Шаня.
Изначально я все рисовал в программе Ocad. Это специльная программа для рисования карт спортивного ориентирования. Проект был разбит на десятки листов. Потом эти листы экспортировались в картинки, сшивались и разрезались на тайлы. Тайлы загружались на ftp.

94628/77. Вот пример того, что получается в QGis
nakarte.me/#m=13/41. 57910&l=O/Mt

89276/79. А вот как было в Ocad
nakarte.me/#m=14/44. 41021&l=O/Mt

И вот однажды я встретил QGIS.

Неплохой рендерер. Программа меня впечатлила. Возможность работать напрямую с геоданными. Не такой выразительный как в OCAD, но качество меня устроило. Возможность работать со всем проектом целиком, не разбивая его на куски.
Все это побудило перенести весь проект на QGIS.

Я их адаптировал и для QGIS 3. Но теперь я немного об этом жалею.
Рендерер QGIS не приспособлен для генерации тайлов.
Конечно, есть два плагина QTiles и QMetaTiles для QGIS 2.

Расскажу подробнее о неисправимых косяках, которые мешают генерации тайловых карт в QGIS.
Экспорт сделан с помощью плагина QTiles

Когда рендерер вычисляет какие объекты попадают в его область видимости (в QGIS Это называется canvas), то он не учитывает размер символов объектов.
Пример 1а. Косяк №1. На нижнем тайле рендерер его вывел, а на верхнем — нет. Точечный объект
image
Как видите, значок вершины оказался обрезанным. Потому что центр вершины не попал в границы тайла.

Линейный объект

Толстая линия проходит рядом с границей тайла. Пример 1б. На верхний тайл вообще не попала.
Линия не обязательно должна проходить по границе тайлов. На нижний тайл она попала частично. Еще может быть вот такой артефакт

Расстановка надписей.
Пример 2а. Косяк №2. Короткая надпись на линейном объекте

Рендерер вывел название на каждом тайле.

Длинная надпись на линейном объекте
Z15
Z16
На Z15 надпись есть, потому что она целиком влезает в границы тайла.
На Z16 надписей уже нет, потому что длинная надпись не влезает в границы тайла. Пример 2б.

Ничего не выйдет. Представьте, что вы хотите нарисовать карту мира, а на ней на весь континент большими буквами написать «ЕВРАЗИЯ». Надпись будет появляться только на тех зумах, где она помещается в тайл целиком.

Надпись на точечном объекте
Я включил опцию «Show partial labels»
Z16
Z15
На Z16 рендерер показывает только часть надписи, влезающую в тайл. Пример 2в. При рендеренге соседнего тайла, он, кончено, про нее забывает.
Если опцию «Show partial labels» выключить, то на Z16 вообще не будет надписи.

Метаталинг
2. С указанными проблемами призваны бороться два метода
1. Буфферные зоны

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

Те же самые косяки проявляются уже на на границах тайлов, а на границах метатайлов или буфферных зон. Оба метода не исправляют вышеуказанные косяки, а сдвигают их на несколько уровней зума ниже.

Точечный объект
Делаю экспорт плагином QMetaTiles. Пример 2г. Это значит, что рендерится область в 2х2 тайла, а потом нарезается на куски. Размер метатайла 2х2.

Надпись теперь не обрезается, потому что целиком влезает в область 2х2 тайла. Z16image
Действительно. То же будет и с линейным объектом.
Проблема сдвинулась на один уровень зума ниже. Но на границе метатайла обрезался сам объект.

Скачущие надписи
Пример 3а
Расстановщик каждый раз выбирает наиболее выгодную позицию для очередной надписи. Косяк №3. Сдвиньте его на пару миллиметров, и все надписи будут расположены совершенно иначе.
Это значит, что при рендеринге одного метатайла и буферной зоны вокруг него надпись может быть в одном места, а при рендеринге соседнего метатайла — совершенно в другом. Причем, расположение надписей зависит от положения canvas.

Надписи занимают один порядок.
Затем я немного сдвигаю canvas и делаю опять экспорт. Я делаю экспорт куска карты в тайлы. При этом появляются вот такие артефакты.
Надписи уже занимают совершенно другой порядок.

Что же с этим всем делать?
Метатайлинг и буфферные области не решают вышеописаныне проблемы, а отодвигают их на меньшие уровни зума.

Когда рендерер вычисляет какие объекты он должен нарисовать, то он должен учитывать не только геоданные объектов, но их их символику.
Например, для всех объектов рендерер должен хранить BBOX, который объект занимает после индивидуального рендеринга. 1. При рендеринге сцены, нужно учитывать пересечение canvas с индивидуальным BBOXами отрендеренных объектов.
При этом желательно, чтобы BBOX вмещал в себя еще и надписи, привязанные к объекту.

Расположение надписей не должно зависеть от расположения canvas. 2. Отпадет необходимость в метатайлинге и буфферных зонах. Тогда при частичном экспорте фрагменты надписей будут хорошо сшиваться.

К сожалению, на данный момент экспорт тайлов из QGIs просто ужасен, и когда он будет исправлен не ясно.
Может, есть тут кто-то, принимающий участие в разработке QGis?

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть