2. Вступ

2.1. Що таке просторова база даних?

PostGIS — це просторова база даних. Oracle Spatial і SQL Server (2008 і пізніші версії) також є просторовими базами даних. Але що це означає? Що саме робить звичайну базу даних просторовою?

Коротка відповідь така…

Просторові бази даних зберігають і обробляють просторові об’єкти так само, як і будь-які інші об’єкти в базі даних.

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

  1. Типи просторових даних відносяться до фігур, таких як точка, лінія та багатокутник;

  2. Для ефективної обробки просторових операцій використовується багатовимірне просторове індексування;

  3. Просторові функції, задані в SQL, призначені для запиту просторових властивостей і взаємозв’язків.

У поєднанні типи просторових даних, індекси та функції забезпечують гнучку структуру для оптимізації продуктивності та аналізу.

2.1.1. На початку

У застарілих реалізаціях GIS першого покоління всі просторові дані зберігаються у плоских файлах, а для їх інтерпретації та обробки потрібне спеціальне програмне забезпечення GIS. Ці системи управління першого покоління розроблені для задоволення потреб користувачів, у яких усі необхідні дані знаходяться в межах організаційної домену користувача. Вони є пропрієтарними, автономними системами, спеціально створеними для обробки просторових даних.

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

Справжні просторові бази даних з’явилися, коли люди почали розглядати просторові об’єкти як об’єкти першокласних баз даних.

Просторові бази даних повністю інтегрують просторові дані з реляційною базою даних. Орієнтація системи змінюється з орієнтованої на ГІС на орієнтовану на базу даних.

_images/beginning.png

Примітка

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

2.1.2. Типи просторових даних

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

_images/hierarchy.png

Типи просторових даних організовані в ієрархію типів. Кожен підтип успадковує структуру (атрибути) та поведінку (методи або функції) свого супертипу.

2.1.3. Просторові індекси та обмежувальні прямокутники

Звичайна база даних надає індекси, що забезпечують швидкий і довільний доступ до підмножин даних. Індексування стандартних типів (числа, рядки, дати) зазвичай виконується за допомогою `B-tree <http://en.wikipedia.org/wiki/B-tree>`_індексів.

B-дерево розділяє дані, використовуючи природний порядок сортування, щоб розмістити дані в ієрархічному дереві. Природний порядок сортування чисел, рядків і дат визначити просто — кожне значення менше, більше або дорівнює кожному іншому значенню.

Але оскільки полігони можуть перекриватися, міститися один в одному і розташовуватися у двовимірному (або більш вимірному) просторі, B-дерево не може бути використане для їх ефективного індексування. Реальні просторові бази даних надають «просторовий індекс», який замість цього відповідає на питання «які об’єкти знаходяться в межах цієї конкретної обмежувальної рамки?».

Обмежувальна рамка — це найменший прямокутник, паралельний осям координат, який може вмістити задану фігуру.

_images/boundingbox.png

Обмежувальні рамки використовуються тому, що відповідь на питання «чи знаходиться A всередині B?» є дуже обчислювально інтенсивною для багатокутників, але дуже швидкою у випадку прямокутників. Навіть найскладніші багатокутники та лінійні ланцюжки можуть бути представлені простим обмежувальним рамкою.

Індекси повинні працювати швидко, щоб бути корисними. Тому замість того, щоб надавати точні результати, як це роблять B-дерева, просторові індекси надають приблизні результати. Питання «які лінії знаходяться всередині цього багатокутника?» буде інтерпретуватися просторовим індексом як «які лінії мають обмежувальні рамки, що містяться всередині обмежувальної рамки цього багатокутника?»

Фактичні просторові індекси, що реалізуються різними базами даних, сильно відрізняються між собою. Найпоширенішими реалізаціями є R-Tree та Quadtree (використовується в PostGIS), але є також індекси на основі сітки та індекси GeoHash, реалізовані в інших просторових базах даних.

2.1.4. Просторові функції

Для обробки даних під час запиту звичайна база даних надає функції, такі як об’єднання рядків, виконання хеш-операцій над рядками, математичні операції над числами та вилучення інформації з дат.

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

Більшість усіх просторових функцій можна об’єднати в одну з п’яти наступних категорій:

  1. Перетворення: Функції, що перетворюють геометрії та зовнішні формати даних.

  2. Управління: Функції, що управляють інформацією про просторові таблиці та адміністрування PostGIS.

  3. Отримання: Функції, які отримують властивості та виміри геометрії.

  4. Порівняння: Функції, які порівнюють дві геометрії щодо їх просторового відношення.

  5. Генерація: Функції, які генерують нові геометрії на основі інших.

Список можливих функцій дуже великий, але загальний набір функцій визначається OGC SFSQL і реалізується (разом з додатковими корисними функціями) PostGIS.

2.2. Що таке PostGIS?

PostGIS перетворює систему управління базами даних PostgreSQL на просторову базу даних, додаючи підтримку трьох функцій: просторових типів, просторових індексів та просторових функцій. Оскільки PostGIS побудований на базі PostgreSQL, він автоматично успадковує важливі «корпоративні» функції, а також відкриті стандарти реалізації.

2.2.1. Але що таке PostgreSQL?

PostgreSQL — це потужна система управління реляційними базами даних (СУБД). Вона випускається під ліцензією типу BSD і, отже, є безкоштовним програмним забезпеченням з відкритим кодом. Як і багато інших програм з відкритим кодом, PostgreSQL не контролюється жодною окремою компанією, а має «глобальну спільноту розробників <https://www.postgresql.org/community/contributors/>»_ та компаній, які займаються її розробкою.

PostgreSQL з самого початку розроблявся з урахуванням розширення типів — можливості додавати нові типи даних, функції та індекси під час виконання. Завдяки цьому розширення PostGIS може розроблятися окремою командою розробників, але при цьому дуже тісно інтегруватися в основну базу даних PostgreSQL.

2.2.1.1. Чому варто вибрати PostgreSQL?

Часто зустрічається питання від людей, які знайомі з базами даних з відкритим кодом: «Чому PostGIS не було побудовано на MySQL?».

PostgreSQL має:

  • Доведена надійність і цілісність транзакцій за замовчуванням (ACID)

  • Ретельна підтримка стандартів SQL (повний SQL92)

  • Розширюваність типу підключення та розширюваність функцій

  • Модель розвитку, орієнтована на спільноту

  • Немає обмежень на розмір стовпців (tuples, що підтримують TOAST) для підтримки великих об’єктів GIS

  • Generic index structure (GiST) для забезпечення індексу R-Tree

  • Легко додавати власні функції

У поєднанні PostgreSQL забезпечує дуже простий шлях розробки для додавання нових просторових типів. У світі пропрієтарного програмного забезпечення тільки Illustra (зараз Informix Universal Server) дозволяв таке просте розширення. Це не випадково; Illustra є пропрієтарною переробкою оригінальної кодової бази PostgreSQL 1980-х років.

Оскільки шлях розвитку для додавання типів до PostgreSQL був настільки простим, було логічно почати саме звідти. Коли MySQL випустив базові просторові типи у версії 4.1, команда PostGIS ознайомилася з їхнім кодом, і це підкріпило початкове рішення використовувати PostgreSQL.

Оскільки просторові об’єкти MySQL довелося хакнути поверх типу string як особливий випадок, код MySQL був розповсюджений по всій кодовій базі. Розробка PostGIS 0.1 зайняла менше місяця. Створення «MyGIS» 0.1 зайняло б набагато більше часу і, як наслідок, могло б ніколи не побачити світ.

2.2.2. Чому не файли?

Формат Shapefile <http://en.wikipedia.org/wiki/Shapefile>_ (та інші формати, такі як Esri File Geodatabase та GeoPackage <https://www.geopackage.org/>_) є стандартним способом зберігання та взаємодії з просторовими даними з моменту створення першого програмного забезпечення GIS. Однак ці «плоскі» файли мають такі недоліки:

  • Для читання та запису файлів потрібне спеціальне програмне забезпечення. SQL — це абстракція для довільного доступу до даних та їх аналізу. Без цієї абстракції вам доведеться самостійно писати весь код для доступу та аналізу.

  • Одночасні користувачі можуть спричинити пошкодження та уповільнення роботи. Хоча можна написати додатковий код, щоб гарантувати, що багаторазове записування в один і той самий файл не пошкодить дані, до того часу, як ви вирішите цю проблему, а також пов’язану з нею проблему продуктивності, ви вже напишете більшу частину системи бази даних. Чому б просто не використовувати стандартну базу даних?

  • Складні питання вимагають складного програмного забезпечення для відповіді. Складні та цікаві питання (просторові з’єднання, агрегації тощо), які можна виразити в одному рядку SQL у базі даних, вимагають сотень рядків спеціалізованого коду для відповіді при програмуванні з файлами.

Більшість користувачів PostGIS налаштовують системи, в яких очікується доступ до даних з боку декількох додатків, тому наявність стандартного методу доступу SQL спрощує розгортання та розробку. Деякі користувачі працюють з великими наборами даних; у файлах вони можуть бути розділені на кілька файлів, але в базі даних їх можна зберігати як одну велику таблицю.

Підсумовуючи, поєднання підтримки кількох користувачів, складних ad hoc-запитів та високої продуктивності на великих обсягах даних — ось що відрізняє просторові бази даних від файлових систем.

2.2.3. Коротка історія PostGIS

У травні 2001 року компанія Refractions Research випустила першу версію PostGIS. PostGIS 0.1 мала об’єкти, індекси та кілька функцій. Результатом стала база даних, придатна для зберігання та пошуку, але не для аналізу.

Зі збільшенням кількості функцій стала очевидною необхідність в організації принципу. Специфікація «Прості функції для SQL» (SFSQL) від Open Geospatial Consortium надала таку структуру з рекомендаціями щодо найменування функцій та вимог.

Завдяки підтримці PostGIS для простого аналізу та просторових з’єднань, Mapserver став першим зовнішнім додатком, що забезпечує візуалізацію даних у базі даних.

Протягом наступних кількох років кількість функцій PostGIS зростала, але його можливості залишалися обмеженими. Багато найцікавіших функцій (наприклад, ST_Intersects(), ST_Buffer(), ST_Union()) було дуже складно запрограмувати. Написання їх з нуля обіцяло роки роботи.

На щастя, з’явився другий проект, «Geometry Engine, Open Source» або GEOS. Бібліотека GEOS надає необхідні алгоритми для реалізації специфікації SFSQL. Завдяки зв’язку з GEOS, PostGIS забезпечив повну підтримку SFSQL у версії 0.8.

Зі збільшенням обсягу даних PostGIS виникла ще одна проблема: представлення, яке використовувалося для зберігання геометрії, виявилося відносно неефективним. Для невеликих об’єктів, таких як точки та короткі лінії, метадані в представленні мали на 300% більше накладних витрат. З міркувань продуктивності було необхідно скоротити представлення. Завдяки зменшенню розміру заголовка метаданих та необхідних розмірів накладні витрати значно зменшилися. У PostGIS 1.0 це нове, швидше та легше представлення стало стандартним.

Останні версії PostGIS продовжують додавати нові функції та покращення продуктивності, а також підтримку нових функцій в основній системі PostgreSQL.

2.2.4. Хто використовує PostGIS?

Повний перелік прикладів використання див. на сторінці «Приклади використання PostGIS <https://postgis.net/category/casestudy/>»_.

2.2.4.1. Institut Geographique National, Франція

IGN — це національне картографічне агентство Франції, яке використовує PostGIS для зберігання топографічної карти країни з високою роздільною здатністю «BDUni». BDUni містить понад 100 мільйонів об’єктів і підтримується штатом із понад 100 польових співробітників, які щодня перевіряють спостереження та додають нові карти до бази даних. Встановлення IGN використовує транзакційну систему бази даних для забезпечення узгодженості під час процесів оновлення, а також «систему теплого резервування <https://www.postgresql.org/docs/devel/warm-standby.html>»_ для підтримання безперебійної роботи в разі збою системи.

2.2.4.2. RedFin

RedFin — це агентство нерухомості, яке надає веб-сервіс для пошуку об’єктів нерухомості та оцінки їх вартості. Спочатку їхня система була побудована на MySQL, але вони виявили, що перехід на PostgreSQL і PostGIS дав величезні переваги в продуктивності та надійності.

2.2.5. Які програми підтримують PostGIS?

PostGIS став широко використовуваною просторовою базою даних, і кількість сторонніх програм, що підтримують зберігання та вилучення даних за допомогою нього, також зросла. Програми, що підтримують PostGIS <http://trac.osgeo.org/postgis/wiki/UsersWikiToolsSupportPostgis>_, включають як відкрите, так і пропрієтарне програмне забезпечення як на серверних, так і на настільних системах.

У наступній таблиці наведено перелік деяких програм, що використовують PostGIS:

Відкритий/Безкоштовний

Закриті/власні/платні послуги

  • Завантаження/вивантаження

    • Shp2Pgsql

    • ogr2ogr

    • Dxf2PostGIS

    • GeoKettle

  • Web-Based

    • Mapserver

    • GeoServer /geoNode

    • pg_tileserv

    • pg_featureserv

    • Deegree

    • Carto

    • QGIS Server

    • MapGuide Open Source (використовуючи FDO)

  • Desktop

    • QGIS

    • OpenJUMP

    • GRASS

    • pgAdmin

    • DBeaver

    • GvSIG

    • SAGA

    • uDig

  • Завантаження/вивантаження

    • Safe FME Desktop Translator/Converter

    • Dbt

  • Web-Based

    • Cadcorp GeognoSIS

    • ESRI ArcGIS Server / Online

  • Сервіси / DbaaS

    • Aiven for PostgreSQL

    • Amazon RDS / Aurora для PostgreSQL

    • Carto

    • Crunchy Bridge

    • Microsoft Azure для PostgreSQL

    • Google Cloud SQL для PostgreSQL

  • Desktop

    • Cadcorp SIS

    • ESRI Desktop/Pro

    • GeoConcept

    • Global Mapper

    • Manifold

    • MapInfo

    • Microimages TNTmips GIS