Олександр Мацібора. Оптимізація великих geoJSON файлів засобами gzip, brotli, geobuf компресії, візуалізація за допомогою MapLibre GL JS і розгортання на хмарній інфраструктурі Storj
У випадку операцій із великими наборами векторних просторових даних (наприклад geoJSON файлів розміром >100MB) найчастіше доводиться розв’язувати дві найголовніші проблеми:
рендеринг великої кількості геометричних об’єктів одночасно
трансфер файлів значного розміру від сховища до “клієнта”
Обидві проблеми можуть спричинити негативний досвід користувача та “зависання” веб-браузера. Для пошуку шляхів вирішення цих питань і порівняння різних підходів до маніпуляцій великими наборами векторних даних було використано просторовий шар Local Administrative Units (LAU), який офіційно надається Eurostat і опублікований у вільному доступі. Для побудови тематичної карти методом кількісного фону використовувався показник щільності населення у місцевих громадах ЄС. Просторовий шар LAU представлений geoJSON файлом розміром 77MB і складається із більше ніж 98000 невеликих векторних полігонів.
1. Рендеринг просторового шару. geoJSON файл такого розміру може спричинити не лише низьку швидкодію на рівні веб-браузера, а також велика кількість геометричних об’єктів здатна заблокувати деяку базову функціональність клієнтських картографічних бібліотек, як наприклад елемент “popup” у Leaflet.js (відома помилка: “InternalError: too much recursion”). З огляду на зазначене, було віддано перевагу картографічній бібліотеці з GPU-прискоренням рендерингу векторних тайлів, а саме MapLibre GL JS.
2. Трансфер файлу розміром 77MB. Подібна операція вимагає швидкого і надійного підключення до мережі, щоб доставити великий geoJSON файл на сторону “клієнта” із сховища даних. Але навіть в такому випадку користувач буде змушений очікувати якийсь час на отримання векторних даних. Одним з кращих способів уникнути спрощення геометрії або видалення частини атрибутивної інформації — це використання компресії (стиснення) векторних даних, які передаються. Тому було проведено порівняння файлу geoJSON оригінального розміру і декількох популярних алгоритмів і форматів стиснення даних в межах одного веб-ГІС застосунку:
базовий (lau.geojson, 77.0 MB)
geobuf (lau.pbf, 15.6 MB)
gzip (lau.gzip, 18.1 MB)
brotli (lau.br, 11.2 MB)
Оригінальний geoJSON та geobuf файли було збережено на звичайному розподіленому веб-хостингу. Geobuf файл зазнавав декомпресії на стороні клієнта засобами JavaScript (npm пакети “geobuf” та “pbf”). Але gzip та brotli було завантажено у хмарне сховище Storj. Оскільки даний сервіс дозволяє явно вказати параметру заголовку відповіді “Content-Encoding” значення “gzip” та “br” відповідно і скористатись всіма перевагами нативної декомпресії даних у веб-браузері.
Після серії тестів на різних веб-браузерах (Firefox, Chromium) і порівняно повільному з’єднанні із мережею найкращий рівень користувацького досвіду було відзначено у варіанті з Brotli компресією. Найбільш вагомою перевагою даного алгоритму є найменший розмір стиснених даних (11.2 MB) і висока швидкість декомпресії на клієнті без додаткових бібліотек чи пакетів.
Онлайн версія веб-ГІС:
https://webgis.geohub.org.ua/eu-lau

