GIS-Lab Створення автономної картографічної програми на базі зображень без прив’язки
Географічні інформаційні системи та дистанційне зондування
Зміст
[ред.] Вступ

Ще один незвичайний приклад - інтерактивний тур містом на базі його вигаданої карти:

Таких прикладів можна навести багато, їх поєднує те, що вони побудовані з урахуванням зображень, які мають ніякої географічної прив'язки. Використання картографічних движків для таких зображень додає можливість навігації (pan), а після невеликої попередньої обробки – можливість їх масштабування (zoom).
Якщо перед вами стоїть схоже завдання, але ви не хочете вникати в технічні моменти, просто скористайтеся одним з онлайн-сервісів (наприклад HUGEpic). Принцип роботи з такими сервісами полягає в тому, що ви завантажуєте своє зображення, а на виході отримуєте готову карту, приклад.
[ред.] Обробка вихідного зображення
[ред.] Постановка задачі
Вихідне зображення в принципі можна підключити "як є", в OpenLayers для цього є клас OpenLayers.Layer.Image, а в Leaflet - L.ImageOverlay, однак у загальному випадку це погана ідея, оскільки зображення може бути великим і користувачеві доведеться дуже довго чекати, поки воно завантажиться, тому перше, що потрібно зробити із зображенням – це розбити його на тайли. Оскільки ми хочемо мати можливість не тільки рухати наше зображення, а й змінювати масштаб, то тайли мають бути побудовані для кількох масштабних рівнів.
[ред.] Робоче зображення

[ред.] Розбивка на тайли
Переходимо до написання скрипта, який розбиватиме на тайли наше зображення. Ми будемо використовуватиінструменти стандартної бібліотеки Python, а також одну сторонню бібліотеку – бібліотеку для роботи із зображеннями – PIL, тому перш ніж продовжити роботу, переконайтеся, що у вас встановлений PIL.
Використовувана надалі схема розбивки на тайли - як і OpenStreetMap (тобто нумерація рядків і стовпців тайлів починається з лівого верхнього кута). Алгоритм розбивки зображення на тайли є досить простим, але має деяку особливість. Уявіть, що ми взяли наше зображення розміру 3410 x 2058 і намагаємося розбити його на тайли 256 x 256. Очевидно, що 3410 і 2058 не діляться на 256, а це означає, що тайли останнього стовпця і останнього рядка2 вийдуть x 256 та 256 x 10 відповідно). Тому, перш ніж переходити до нарізки тайлів, зображення має бути приведене до такого вигляду, що його ширина і висота будуть кратні розміру тайла. Розміри поправок обчислюються так (src_width, src_height - ширина і висота вихідного зображення, tile_size - розмір тайла, % - операція отримання залишку від розподілу). У Python це записується так:
Області розширення за рахунок поправок слід зробити прозорими, у нашому коді за цю операцію відповідатиме функціяadjustBounds.
Одним із важливих параметрів процедури розбивки на тайли – це максимальний масштабний рівень. Розраховується він як логарифм на основі 2 числа max(w,h), округлений до найближчого більшого цілого, де w - ширина зображення, h - висота. У Python це записується так:
Якщо порахувати, то ми отримаємо:
У результаті алгоритм розбивки на тайли зводиться до циклу від детального масштабного рівня (у разі від 4) до 0. У циклі виконуються такі операції: на 4-му рівні береться вихідне зображення, щодо нього застосовуєтьсяфункціяadjustBounds, нарізаються тайли і розкладаються за відповідними каталогами, після чого розмір вихідного зображення (не того, до якого застосована функціяadjustBounds) зменшується вдвічі і так далі.
Повна версія скрипту:
Помістимо файл зі скриптом (tiling.py) у ту ж папку, де лежить вихідне зображення (earthquakes.jpg) і запускаємо обробку:
Після виконання цього скрипта в цій же папці буде створено каталогtiles, до якого будуть розміщені тайли.
[ред.] Підключення тайлів до Leaflet
У цій же директорії, де знаходиться файлtiling.pyі каталогtilesстворимо файлdisplay.htmlі помістимо до нього наступний код:
[ред.] Висновок
У ході цієї статті було описано процедуру розбивки зображення без прив'язки на тайли, а також підключення їх до Leaflet. Зазначимо, що операцію з тайлювання зображення можна було виконати, використовуючи утиліту gdal2tiles, яка входить до складу бібліотеки GDAL:
Описаний у статті варіант розв'язання задачі не вимагає використання GDAL, плюс (що, напевно, важливе) код досить простий і наочно дає розуміння того, як обчислюються масштабні рівні і як виконується саме розбивка на тайли. За кодом gdal2tiles розбиратися в цих питаннях набагато складніше, оскільки це універсальний інструмент. І ще, gdal2tiles крім генерування тайлів також створює html-файли з включеними в них движками OpenLayers і Google (але не Leaflet) і підключає на карту набір створених тайлів, тобто по суті робить все те саме про що йдеться в цій статті Але як би за кадром, ми ж спробували представити цей процес більш наочно.
[ред.] Корисні посилання
Останнєоновлення: 2015-07-11 08:03