Базові карти в QGIS

Під час візуалізації просторової інформацією бажано мати «контекст» — додаткові дані, які допоможуть зорієнтуватися та зроблять інформацію більш наочною. Це можуть бути межі адміністративно-територіальних одиниць, об’єкти гідрографії, дороги тощо. Все це можна назвати одним словосполученням — «базова карта» (basemap).

Останнім часом, особливо в російськомовному середовищі, під базовими картами розуміють виключно такі сервіси як Google Maps, BING Maps, OpenStreetMap та подібні, що насправді не дуже правильно.

Що ж таке базова карта? Це фоновий шар (наприклад, цифрова модель рельєфу або топографічна карта), на який накладаються тематичні шари. Базова карта часто використовується для географічної прив’язки і може включати елементи геодезичної мережі. Дуже часто в якості базової карти використовуються дані аеро- або космічної фотозйомки.
Використання різних картографічних сервісів в якості базових карт пояснюється їх доступністю: достатньо мати підключення до інтернету та мінімальні навички роботи в ГІС.

Подвимось як це робиться в QGIS.

Disclaimer. Перш ніж використовувати наведену інформацію обов’язково ознайомтесь з ліцензією та умовами використання даних відповідних сервісів. Неправомірне використання даних може мати негативні наслідки, включаючи судове переслідування.

Сервіси можуть працювати за різними протоколами, найчастіше це WM(T)S та/або TMS. QGIS дозволяє завантажувати базові карти з використанням обох протоколів. І робити це різними способами.

Плаґін OpenLayers

Мабуть найбільш популярний та відомий варіант.

OpenLayers розміщено в офіційному репозиторії плаґінів QGIS. Плаґін дозволяє додавати до карти шари Google, OpenStreetMap, MapQuest, Bing та деякі інші. Використовувати OpenLayers дуже просто: після активації плаґіна в меню «Internet» з’явиться новий пункт «OpenLayers», з якого можна вибрати і додати на карту необхідний шар.

На жаль, присутні і недоліки (більшість пояснюється механізмом роботи плаґіна), хоча деякі з них впливають лише на певні варіанти використання:

  • карту з використанням шарів OpenLayers не можна роздрукувати чи експортувати у високій якості;
  • іноді в редакторі макетів та під час друку або експорту спостерігається зсув базового шару відносно інших шарів, хоча на карті все показується правильно;
  • неможливо змінити настройки візуалізації шарів OpenLayers (прозорість, режим змішування та інші);
  • якщо плаґін не встановлено або не активовано, то проект з шарами OpenLayers відкриється без них, причому без жодних повідомлень чи попереджень.

QGIS як клієнт WM(T)S

QGIS може виступати в ролі клієнта WMS який підтримує специфікації WMS версій 1.1, 1.1.1 та 1.3. Також реалізовано підтримку протоколу WMTS (старий WMS-C теж підтримується). Про особливості роботи з сервісами WM(T)S докладно написано у посібнику користувача, тому не  бачу сенсу все це повторювати.

Єдиною «проблемою» використання WMS є відносно мала кількість публічних сервісів з глобальними базовими картами. Хоча в країнах з високою культурою відкритих даних дуже часто можна знайти локальні сервіси WMS (підтримуються урядом або місцевими органами влади) як з базовими картами на певну територію, так і іншими шарами (густота населення, землекористування та інші).

Драйвер WMS GDAL

Бібліотека GDAL підтримує більше 130 форматів растрових даних, в тому числі й сервіси OGC та подібні до них. За це відповідає драйвер WMS та його так звані «міні-драйвери», які дозволяють працювати з різними веб-сервісами. Оскільки QGIS для роботи з растровими даними використовує GDAL, то ми можемо використовувати всі можливості цього драйвера в QGIS.

Особисто я не бачу необхідності у використанні GDAL для роботи зі звичайними сервісами WMS для повсякденної роботи. Але крім WMS існують й інші типи сервісів: TMS, WorldWind, VirtualEarth та деякі інші. Найбільш популярним та розповсюдженим є Tile Map Service (TMS), саме він використовується проектом OpenStreetMap та багатьма іншими популярними сервісами. Далі будемо розбиратися саме з TMS, використання інших сервісів відрізняється лише деталями.

Для роботи з сервісом потрібно створити спеціальний XML файл з інформацією про нього. Кореневим елементом файлу є GDAL_WMS. Необхідно слідкувати щоб перед цим елементом не було пробілів або якогось іншого тексту.

Далі в блоці Service вказуються параметри сервісу, який нас цікавить. Крім цього блоку в файлі можуть бути присутні й інші елементи. Детальну інформацію можна знайти на сторінці драйвера WMS GDAL, а тут ми розглянемо лише ті, які знадобляться для завантаження шарів у QGIS.

  • Service name="TMS" — обов’язковий блок. Атрибут name визначає міні-драйвер, який слід використовувати. Підтримуються WMS, WorldWind, TileService, TMS, TiledWMS та VirtualEarth. Необхідно також заповнити наступні вкладені елементи:
    • ServerUrl — адреса сервісу
    • DataWindow — обов’язковий блок, тут задаються розмір та покриття даних. За допомогою цього блоку можна обмежити область інтересу і таким чином мінімізувати трафік. Складається з наступних елементів:
      • UpperLeftX — координата X (довгота) лівого верхнього кутка. Необов’язковий параметр, за замовчанням -180.0. Значення задається у одиницях виміру, які відповідають проекції даних (див. нижче). Наприклад, для WGS84 це градуси, а для WGS84/Pseudo-Mercator — метри.
      • UpperLeftY — координата Y (широта) лівого верхнього кутка. Необов’язковий параметр, за замовчанням 90.0
      • LowerRightX — координата X (довгота) правого нижнього кутка. Необов’язковий параметр, за замовчанням 180.0
      • LowerRightY — координата Y (широта) правого нижнього кутка. Необов’язковий параметр, за замовчанням -90.0
      • TileLevel — максимальний масштабний рівень
      • TileCountX, TileCountY — використовується для розрахунку розмірів зображення по осям X та Y
      • YOrigin — визначає положення осі Y відносно тайлової сітки. Можливі значення top, bottom та default, значення default залежить від конкретного міні-драйвера
    • Projection — проекція
    • BandsCount — кількість каналів. Зображення у відтінках сірого мають лише один канал, RGB — 3, якщо підтримується прозорість, то додається четвертий канал
    • BlockSizeX, BlockSizeY — розмір блоку в пікселях

Інші корисні елементи:

  • Cache — блок опису локального кешу. Може бути корисним для оффлайнової роботи
    • Path — шлях до каталогу кешу
  • MaxConnections — максимальна кількість одночасних підключень до сервера
  • Timeout — таймаут з’єднання
  • OfflineMode — оффлайновий режим. Якщо елемент має значення true, то нові тайли не завантажуються, використовується лише кеш.
  • VerifyAdviseRead — перевірка завантажених тайлів на правильність. Якщо елемент має значення true, то кожний тайл після завантаження відкривається та виконуються деякі базові перевірки (правильність заголовку, розмір тощо). Якщо сервер надійний, то можна відключити і таким чином дещо знизити навантаження на процессор та підвищити швидкість скачування.
  • UserPwd — логін та пароль для аутентифікації засобами HTTP у форматі user:password

Розглянемо роботу з TMS детальніше.

Підтримка TMS з’явилась у GDAL 1.7, крім TMS цей драйвер також підтримує й інші тайлові сервіси зі схожим принципом роботи. Зі специфікацією TileMapService можна ознайомитися тут.

Типова адреса тайла має вигляд

http://server.com/${version}/${layer}/${z}/${x}/${y}.${format}

Найважливішими параметрами є

  • ${x} — координата X тайла
  • ${y} — координата Y тайла. Відлік починається згори (OpenStreetMap та інші популярні сервіси) або знизу (специфікація TMS) тайлової сітки
  • ${z — координата Z тайла, тобто його масштабний рівень

також іноді можуть знадобитися

  • ${version} — версія
  • ${format} — формат зображення
  • ${layer} — назва шару

Ось так виглядає повний файл з описом OSM (глобальне покриття).

<GDAL_WMS>
  <Service name="TMS">
    <ServerUrl>http://tile.openstreetmap.org/${z}/${x}/${y}.png</ServerUrl>
  </Service>
  <DataWindow>
    <UpperLeftX>-20037508.34</UpperLeftX>
    <UpperLeftY>20037508.34</UpperLeftY>
    <LowerRightX>20037508.34</LowerRightX>
    <LowerRightY>-20037508.34</LowerRightY>
    <TileLevel>18</TileLevel>
    <TileCountX>1</TileCountX>
    <TileCountY>1</TileCountY>
    <YOrigin>top</YOrigin>
  </DataWindow>
  <Projection>EPSG:3857</Projection>
  <BlockSizeX>256</BlockSizeX>
  <BlockSizeY>256</BlockSizeY>
  <BandsCount>3</BandsCount>
</GDAL_WMS>

Аналогічно описуються й інші тайлові сервіси.

Для завантаження таких шарів в QGIS необхідно створити відповідний XML файл та відкрити його як звичайний растр. Якщо в файл додати блок з описом локального кешу, то шар буде завантажуватися і за відсутності підключення до інтернету.

Про ArcGIS Server

Розробники власницького програмного забезпечення дуже часто замість використання відкритих загальноприйнятих стандартів вигадують власні. Широко відома ArcGIS не виключення:  ArcGIS Server, хоча й підтримує стандарти OGC, в особливо запущених випадках налаштовується на роботу в режимі REST- та SOAP сервісів. На щастя, GDAL приходить на допомогу і в цьому випадку.

Власне, цей сервіси ArcGIS Server не мають відношення до TMS. Але інформації про їх використання в QGIS не так вже й багато, тому зайвою ця інформація не буде.

Спочатку необхідно знайти адресу каталогу сервісів (шукаємо на сайті за словами «ArcGIS services directory»), зазвичай він має адресу виду site.domain/ArcGIS/rest/services. Для прикладу розглянемо каталог сервісу «Maps for Personal Use». У списку Services знаходимо необхідний сервіс (растрові дані мають тип MapService, але будьте уважні — векторні шари також можуть мати такий тип), копіюємо його адресу та додаємо в кінець ?f=json&pretty=true. Останній параметр не обов’язковий, він вказує на необхідність видавати інформацію в відформатованому вигляді. Для даних World_Terrain_Base адреса буде мати вигляд

http://server.arcgisonline.com/arcgis/rest/services/World_Terrain_Base/MapServer?f=json&amp;pretty=true

Тепер можна відкрити шар в QGIS. Як і більшість інший операцій, це можна зробити різними способами.

Консоль Python

Варіант для маніяків. Завантажити шар в QGIS можна за допомогою консолі Python. Для цього відкриваємо консоль та вводимо наступний код

iface.addRasterLayer(serviceUrl,'raster')

Замість serviceUrl слід підставити адресу сервіса.

Незважаючи на очевидні недоліки цього способу, чомусь саме він поширюється як єдиний варіант. Хтось написав дурницю, всі повторюють і навіть не намагаються розібратися.

GDAL

Так як для завантаження даних ArcGIS Server використовується GDAL та її драйвер WMS, ми можемо створити XML файл з описом сервісу та відкривати його як звичайний растр. Для цього достатньо виконати наступну команду:

gdal_translate "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer?f=json&pretty=true" WorldTerrain.xml -of WMS

Адресу, звісно ж, вказуєте свою.

Про пошук URL

Часто доводиться чути питання «Чи можна підключити “назва-карти-або-сервіса” як WMS/TMS в QGIS? Яку адресу вказувати?». Спробую розказати як самостійно знайти відповідь на це питання. Я використовую Firefox, але принцип справедливий і для інших браузерів.

Візьмемо одну з публічних карт з сервісу QGISCloud, наприклад, цю https://qgiscloud.com/patologo/pruebo. Відкриємо браузер та активуємо Network monitor (Ctrl + Shift + Q). Переходимо на сайт карти та збільшуємо масштаб. У моніторі відображаються запити, які браузер надсилає серверу.

Шукаємо серед них запити зображень (наприклад, за типом файлів) та аналізуємо адресу. Як правило, WMS сервіси містять в адресі ідентифікатор wms. Ось один з таких

https://qgiscloud.com/patologo/pruebo/wms?LAYERS=PADRONES_Layer&OPACITIES=255&FORMAT=image/png&mode=8bit&DPI=96&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG:3857&BBOX=-6267477.0837493,-4100368.9549593,-6262207.7061127,-4098945.3153077&WIDTH=1103&HEIGHT=298

Нам потрібна лише базова адреса сервісу, так як QGIS самостійно запитує список шарів та дозволяє вибрати необхідні у зручному діалозі. Тобто це частина до першого знаку питання

https://qgiscloud.com/patologo/pruebo/wms

Саме цю адресу слід вказувати під час створення нового підключення в QGIS. Як бачите, нічого складного.

Аналогічно виконується аналіз запитів до тайлових (TMS) сервісів. Розглянемо на прикладі OpenStreetMap. Взагалі-то інформація про адреси тайлових сервісів OSM загальнодоступна і опублікована на wiki проекту, але навички аналізу можуть знадобитися під час роботи з іншими сервісами.

Відкриваємо браузер так активуємо Network monitor. Переходимо на сторінку OSM та шукаємо запити тайлів

Адреса виглядає приблизно так

http://a.tile.openstreetmap.org/13/4199/2692.png

Можна помітити, що крім a.tile.openstreetmap.org, також виконуються запити до b і c. Ці сервери ідентичні та використовуються для балансування навантаження. Нам потрібен лише один сервер, хай це буде a.tile.openstreetmap.org. Тепер не звертаємо уваги на першу частину, а дивимось на цифрову частину запитів, яка має вигляд

/13/4199/2692.png

Зі специфікації TMS ми знаємо, що кожний тайл описується трьома координатами: X та Y визначають його розміщення у сітці, а Z задає масштабний рівень (чим більше — тим детальніше). Нам треба визначити яка частина адреси за яку складову відповідає.

Краще починати з координати Z, оскільки у більшості випадків ця величина змінюється в діапазоні від 0 до 20±2. У нашому випадку ця координата записана першою. Для впевненості можна змінити масштаб карти та подивитися на запити.

Тепер спробуємо зсунути карту вліво або вправо, намагаючись уникнути зсуву вгору чи вниз, і знову дивимось на запити. Бачимо, що тепер більше змінюється друге число, отже це координата X, тоді останнє — координата Y.

Таким чином повністю адреса для завантаження шару OSM за допомогою TMS буде мати вигляд http://a.tile.openstreetmap.org/${z}/${x}/${y}.png. Цю адресу і вказуємо у файлі XML.

Мітки:
Один коментар в “Базові карти в QGIS
  1. Daria Svidzinska сказав:

    Не стаття, а скарб – нарешті все необхідне розкладено по поличках в одному місці. Дякую 🙂

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

*