[Ред] Введення
[Ред] Параметри тайловой сітки
[Ред] Проекція
Перш за все важливо визначитися з проекцією, яка буде використовуватися при відображенні даних. Для цього необхідно відповісти на питання з якою метою будуть призначені ваші тайли. Якщо ви хочете просто відображати свою карту поверх підкладок, що надаються такими сервісами як OpenStreetMap або Google Maps. то ви повинні використовувати таку ж проекцію, що і зазначені сервіси, а саме EPSG: 3857. Якщо ж ви переслідуєте якісь інші цілі, наприклад, бажаєте обчислювати відстані, вимірювати площі об'єктів на карті або плануєте створити карту Антарктиди, то в цьому випадку вам необхідно вибрати найбільш підходящу для цих завдань проекцію.
Як приклад в даній статті ми будемо конфігурувати тайловую сітку на територію Алтайського краю, тому для відтворення даних будемо використовувати проекцію UTM зона 44 EPSG: 32644. що в подальшому дозволить нам здійснювати коректне вимірювання відстаней на отриманої карті.
[Ред] Охоплення
Наступний важливий етап - це вибрати охоплення (обмежує прямокутник), тобто ту область на яку будуть генеруватися тайли, поза її тайли не створюються. Параметри охоплення Алтайського краю отримаємо на основі даних шару адміністративних кордонів набору Geosample. Для цього скористаємося утилітою ogrinfo.
В результаті чого ми отримаємо охоплення цікавить нас території в одиницях виміру системи координат проекції EPSG: 32644 (minx, miny, maxx, maxy):
[Ред] Масштабні рівні (дозволу)
Після того, як ми визначилися з проекцією і охопленням, необхідно розібратися з масштабними рівнями. Кожен масштабний рівень визначає дозвіл з яким буде отрендеріть карта на даному рівні, при цьому кількість таких рівнів може бути довільним. Величина дозволу, використовуваного на тому чи іншому рівні також нічим не лімітована. Дозвіл показує скільки одиниць вимірювання координат вихідних даних вкладається в одному пікселі відрендерене карти. Таким чином в нашому випадку (проекція UTM) одиниці вимірювання роздільної здатності - м / піксель, в разі ж роботи з географічними системами координат це будуть градус / піксель.
Припустимо, ми хочемо надати доступ до нашими даними, відрендерене з дозволами R, рівними 3000 і 1500 метрів на піксель. Порахуємо для цих дозволів розміри результуючої карти (w - ширина, h - висота):
3000 метрів на піксель
Як можна помітити на даному тайлі представлена нижня ліва частина карти світу, але номер тайла при цьому не (0,0), а (0,1).
[Ред] Кількість тайлів на різних масштабних рівнях
На основі вищесказаного можна легко оцінити кількість тайлів (x * y) на z-м масштабному рівні. Кількість стовпців тайлів (x) визначається співвідношенням:
Кількість рядків (y):
Обчислимо кількість тайлів, наприклад, на 7 масштабному рівні з урахуванням, що залежність дозволу від номера рівня задана функцією, отриманої в розділі # Масштабні рівні (дозволу).
Отримані значення x і y були округлені в більшу сторону до цілого.
Для автоматизації підрахунку кількості тайлів на кожному масштабному рівні скористаємося консольної утилітою, що йде в складі кешуючого проксі-сервера MapProxy. Для цього спочатку складемо опис тайловой сітки в спеціальному файлі конфігурації MapProxy mapproxy.yaml. Після прочитання вищевикладеного матеріалу даної статті у вас повинно з'явитися чітке розуміння описуваних в наступній конфігурації параметрів:
Як можна помітити, вже на 11 масштабному рівні кількість тайлів перевищило позначку в 1 мільйон, а на 16 в 1 мільярд.
Проведемо оцінку кількості тайлів на різних масштабних рівнях сервісу OpenStreetMap. Для цього знову скористаємося утилітою зі складу MapProxy і вказавши в якості імені сітки спеціальне службове значення GLOBAL_MERCATOR:
Так як в OpenStreetMap тайли Рендер тільки до 18 рівня, то отримуємо, що на останньому рівні кількість тайлів досягає позначки 68 мільярдів.
Строго кажучи вираз "карта на такому-то масштабному рівні отрендеріть з таким-то дозволом" в загальному випадку має слабкий зв'язок з реальними розмірами елементів зображення на місцевості через мінливість розмірів внесеного проекційними спотвореннями. Покажемо це на прикладі гри на базі даних Google Maps, що використовують проекцію Меркатора. Серед розкиданих полігонів знайдіть відповідний Австралії та оцініть як змінюється його форма в області полюсів і на своєму законному місці (полігони можна рухати, мета гри - розмістити контури країн по своїх місцях):
Зміна форми обумовлено обраної проекцією - так в проекції Меркатора розміри елемента зображення карти не є постійними на місцевості. Лінійні розміри збільшуються від екватора до полюсів як зворотний косинус широти (Проекція Меркатора). Таким чином, ми отримуємо, що пікселі навіть в рамках одного тайла можуть мати різний розмір:
Тайл сервісу OpenStreetMap на 0-му масштабному рівні. Як можна помітити розміри елементів в області полюсів значно відрізняються від їх розмірів на екваторі (Гренландія здається в 2-3 рази більше Австралії, хоча в реальності Гренландія втричі менше)
Загалом випадком лінійні розміри пікселя - це функція від його географічних координат (lat. Lon) і масштабного рівня:
У разі проекції Меркатора f (lat, lon) = cos (lat). З урахуванням цього вираз для обчислення дозволу приймає вид:
Виходить, що в сервісах, що використовують проекцію Меркатора дозвіл в області 60 широти в 2 рази вище дозволу на екваторі (в одному пікселі відрендерене карти вкладається менше одиниць вимірювання координат вихідних даних) і відповідає дійсності якраз на екваторі.
Тоді що-ж ми мали на увазі в попередніх розділах даної статті, кажучи "дозвіл z-го масштабного рівня"? Це ні що інше як деяка абстрактна величина, що має розмірність дозволу, яку зручно використовувати для розрахунку загальної кількості і координат тайлів. Якщо ж ми хочемо здійснювати вимірювання по нашій карті, то ми повинні обов'язково враховувати залежність дозволу від географічних координат. Вибравши на самому початку статті проекцію UTM для рендеринга і заявивши, що це "дозволить нам здійснювати коректне вимірювання відстаней на отриманої карті", ми забезпечили сталість дозволу карти в межах масштабного рівня, тобто незалежність від географічних координат: f (lat, lon) = 1.
[Ред] Поняття екранного масштабу карти
Екранний масштаб карти (S) показує скільки одиниць вимірювання на місцевості укладається в одиницю виміру карти на екрані монітора і дорівнює добутку дозволу карти на дозвіл екрана (dots per inch, DPI) і на кількість одиниць карти в одній одиниці вимірювання роздільної здатності екрану (inches per map unit, IPMU):
Як було показано вище - різні області карти можуть мати різний дозвіл, а, отже, і масштаб.