Створення кешу карти у Geoserver з використанням сторонніх сервісів

Все почалося з того, що при розробці геопорталів з використанням ArcGis, замовники все частіше стали говорити щось на кшталт: "Нам все подобається, а ось можна все те саме зробити, але з використанням відкритого ПЗ", маючи на увазі заміну зв'язки MSSQL+ ArcGis Server + ArcGis Javascript (Silverlight) Toolkit на Postgres (PostGis) + Geoserver + Openlayers.

Ну, загалом їх зрозуміти можна, т.к. змінюється 1-2-3 млн руб. на 0 руб. Особливої ​​проблеми здебільшого це не уявляло, векторні дані перекладаються через SHP файли, або через конвертери з MSSQL в PostGis (або просто через запити SQL). Залишилось питання з растровими даними. Наприклад, є добре промальований, налаштований і багаторівневий кеш карти України. В ArcGis він зберігається або в компактному вигляді (у вигляді бандлів зрозумілого тільки ArcGis формату) або некомпактний, тобто тайли карти просто лежать у директоріях. Тут я зрадів і подумав, що у другому випадку точно буде все просто. А ні — тайли звичайно розбиті за рівнями, однак мають дивні імена і можуть лежати в дивних підпапках, а з геоприв'язкою цього кеша взагалі біда.

Але потім прийшло дуже просте і швидке рішення - просканувати свій сервіс (оскільки сервіс віддає тайли по зрозумілому URL виду ". MapServer/tile/Z/Y/X" де Z - номер рівня, а X і Y номери тайлів по горизонталі і вертикалі відповідно). Тепер залишилося інше питання - як ці прив'язані тайли покласти на Geoserver? У Geoserver для таких цілей використовується Image Pyramid Plugin, точніше не зовсім для таких - його в основному використовують для спрощення роботи з гігантськими TIFF файлами, скрипт gdal_retile з пакета gdal проходить по TIFF файлу і створює безліч дрібних геоприв'язаних тайлів на різних рівнях, розбитих по папках з номерами рівнів.

Ось, власне, і всі вихідні дані. По них я спочатку написав додаток на рідному C#, але вирішив слідувати шляхом справжнього OSS і переписав Java, природно виклавши код на GitHub. Основна форма вийшла такою:

Тут все просто: - Tile url pattern - шаблон url для тайла, де - положення номера рівня, положення номера тайла по горизонталі (Х), - по вертикалі (У). - Max layer bounds - геоприв'язка всього шару, тобто. там де починається і закінчується відлік тайлів - Region layer bounds - геоприв'язка потрібного регіону - Levels: Start - початковий «нижній» рівень, наприклад 4, End кінцевий «верхній», наприклад 0 (вся карта в одному тайлі) -Tile size - розмір тайлу, який віддає сервіс - Jpeg compression - якщо хочете щоб вихідні tiff використовували стиск - Reference system WKT - текст описує систему координат, приклади до систем координат можна знайти тут - Path папка для вихідних файлів

Ось і все - після прописування цих параметрів натискаєте run і качаєте тайли.

Завантажити програму можна тут (потрібна Java) Інфа є тут Код лежить тут

А тепер невеликий туторіал для тих, хто нічого не зрозумів, але стало цікаво

1. Качаємо та встановлюємо Geoserver; 2. Качаємо та встановлюємо ImagePyramid plugin; 3. Завантажуємо, розпаковуємо та запускаємо додаток; 4. Натискаємо кнопку OSM Example – поля автоматично заповнюються для тайлів OpenStreetMap, перші 5 шарів; 5. Вибираємо папку, куди створювати тайли; 6. Після завершення відкриваємо геосервер та створюємо пірамідальне сховище та шар; 7. Відкриваємо layer preview та радіємо; 8. Все те саме, але з картинками тут.

P.S. Є глюк із не квадратними пірамідами, тобто тими, у яких основа не квадрат, а прямокутник (дуже часто в СКepsg:4326). Для всіх прямокутних (EPSG:3857 (90013), EPSG: 3395) початківців з 0 як працює вірно (OSM, Google, Yandex). І пам'ятайте про ліцензійні угоди сервісів під час користування контентом. Не порушуйте їх.

Хардкорна конфа за С++. Ми запрошуємо лише профі.