Як використовувати PostGIS у ServBay: додавання геопросторової підтримки до PostgreSQL
PostGIS
— це потужне розширення для бази даних PostgreSQL, яке додає підтримку геопросторових типів даних, функцій і індексів. Завдяки цьому ви можете зберігати у базі даних координати, лінії, полігони та інші геоінформаційні об'єкти і виконувати складні просторові запити та аналіз. Для розробників веб-додатків, що працюють із картами, сервісами позиціонування чи будь-якими додатками, пов'язаними з географією, PostGIS є незамінним інструментом.
ServBay — це локальне середовище розробки для macOS, у якому вже інтегровано пакет PostgreSQL, а розширення PostGIS входить до складу за замовчуванням. Це значно спрощує використання PostGIS на локальному комп'ютері — не потрібно вручну компілювати чи встановлювати залежності.
У цьому матеріалі ви дізнаєтеся, як увімкнути та почати роботу з PostGIS у середовищі ServBay, щоб швидко додати геопросторові можливості у ваші проекти.
Передумови
Перед використанням PostGIS переконайтеся, що ви виконали такі підготовчі кроки:
- Встановіть і запустіть ServBay: Переконайтеся, що ServBay успішно інстальовано на вашому macOS.
- Активуйте і запустіть пакет PostgreSQL: У панелі керування ServBay переконайтеся, що пакет PostgreSQL увімкнено та запущено. Якщо ще не увімкнено, знайдіть PostgreSQL у панелі керування, поставте галочку та запустіть цей пакет.
- Підключіться до бази даних PostgreSQL: Дізнайтеся, як підключатися до PostgreSQL в ServBay за допомогою командного рядка (
psql
) або графічних клієнтів (наприклад, TablePlus, pgAdmin). За замовчуванням ви можете підключатися локально через командуpsql -U postgres
.
Встановлення та активація розширення PostGIS
PostGIS уже попередньо встановлено у складі ServBay, додатково завантажувати нічого не потрібно. Вам необхідно лише "активувати" це розширення в конкретній базі даних, де ви хочете використовувати PostGIS.
Ось кроки для активації розширення PostGIS:
Підключіться до потрібної бази даних PostgreSQL: Відкрийте програму терміналу й підключіться до потрібної бази даних через
psql
. Замінітьyour_username
на ваше ім'я користувача (наприклад,postgres
), аyour_database
— на назву бази даних, для якої потрібно активувати PostGIS.bashpsql -U your_username -d your_database
1Щоб активувати у стандартній базі та користувачу
postgres
, можна скористатися:bashpsql -U postgres
1Створіть розширення PostGIS у базі: Після успішного підключення виконайте в інтерфейсі
psql
таку команду SQL:sqlCREATE EXTENSION postgis;
1Ця команда встановить і налаштує всі об'єкти, необхідні для роботи PostGIS (нові типи даних, функції, оператори тощо), у поточній базі.
Перевірте, чи успішно встановлено PostGIS: У консолі
psql
виконайте команду\dx
, щоб побачити список встановлених у базі розширень.sql\dx
1Якщо PostGIS активовано належним чином, ви побачите запис
postgis
із версією.List of installed extensions Name | Version | Schema | Description -----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions (2 rows)
1
2
3
4
5
6(Зверніть увагу: версія PostGIS залежить від версії ServBay)
Тепер ви успішно активували розширення PostGIS у вибраній базі даних PostgreSQL і можете використовувати всі її геопросторові можливості.
Налаштування геопросторових даних у PostGIS
Після активації PostGIS ви можете створювати нові таблиці з геопросторовими даними або додавати такі стовпці до вже існуючих. PostGIS пропонує два основних типи просторових даних: geometry
і geography
. Тип geometry
використовується для обчислень у площинній системі координат (картезіанській), а geography
— для сферичної системи (наприклад, поверхня Землі), і найкраще підходить для роботи з координатами широти/довготи.
Створення таблиці з геопросторовим стовпцем
Ось приклад створення таблиці locations
зі стовпцем для зберігання точки розташування:
Створіть таблицю: У командному рядку
psql
або через графічний клієнт виконайте:sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
: визначає стовпецьgeom
типуGEOMETRY
, задаючи типPoint
(точка).4326
— це SRID (Spatial Reference Identifier), що відповідає системі координат WGS84, яка широко використовується в GPS, OpenStreetMap, Google Maps тощо.- Ви можете використовувати й інші геометричні типи (наприклад,
LineString
,Polygon
,MultiPoint
) та SRID, які відповідають вашим завданням.
Додайте приклади даних: Для вставки геооб'єктів використовуйте стандартні функції PostGIS. Наприклад, функція
ST_GeomFromText()
перетворює WKT (Well-Known Text) на об'єкт геометрії.sqlINSERT INTO locations (name, geom) VALUES ('ServBay Headquarters', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- приклад координат для Пекіна ('ServBay Shanghai Office', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- приклад координат для Шанхаю
1
2
3Зверніть увагу, що у WKT координати точок вказуються у форматі
POINT(довгота широта)
.
Створення геопросторового індексу
Якщо у таблиці багато просторових даних, індексація суттєво покращує продуктивність запитів, особливо за умов просторового пошуку, перевірки входження чи пошуку найближчих об'єктів. Найчастіше для цього застосовується індекс GiST (Generalized Search Tree).
Створіть GiST-індекс: Введіть команду в
psql
або відповідному клієнті:sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1Ця команда створює GiST-індекс за стовпцем
geom
. PostgreSQL автоматично використовуватиме індекс при виконанні відповідних запитів.
Геопросторові запити з PostGIS
PostGIS надає сотні функцій для виконання різних операцій з просторовими даними. Ось кілька базових прикладів запитів, популярних у веб-розробці:
Обчислення відстані між двома точками
Обчисліть прямолінійну відстань між двома геокоординатами.
sql
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- точка А
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- точка Б
);
1
2
3
4
2
3
4
ST_Distance()
: Розраховує відстань між двома геометріями. Якщо ви використовуєте типgeometry
з SRID 4326 (географічна система), результат буде у градусах. Для точного визначення відстані у метрах використовуйте типgeography
або функції, що працюють зі сферичним представленням.
Перевірка входження
Визначте, чи потрапляє точка у певну область (наприклад, у полігон).
sql
SELECT name FROM locations
WHERE ST_Contains(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326), -- приклад прямокутного полігона
geom
);
1
2
3
4
5
2
3
4
5
ST_Contains(geometry A, geometry B)
: Повертає true, якщо геометрія A повністю містить геометрію B.
Пошук найближчих об'єктів
Знайдіть найближчі місця відносно заданої точки. Запит з GiST-індексом буде значно швидшим.
sql
SELECT name, ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) AS distance
FROM locations
ORDER BY geom <-> ST_GeomFromText('POINT(116.4074 39.9042)', 4326) -- оператор <-> використовує GiST-індекс для сортування за відстанню
LIMIT 5;
1
2
3
4
2
3
4
- Оператор
<->
— це спеціальний оператор PostGIS для пошуку найближчих об'єктів, оптимізований для GiST-індексу.
Геопросторовий аналіз у PostGIS
Крім стандартних запитів, PostGIS дозволяє виконувати аналітичні операції, наприклад, створення буферів, знаходження перетинів, об'єднання геометрій тощо.
Аналіз буфера
Створіть полігон (буфер) навколо геооб'єкта на задану відстань.
sql
SELECT ST_Buffer(geom, 0.01) -- створює буфер радіусом 0.01 градуса (~1,1 км)
FROM locations
WHERE name = 'ServBay Headquarters';
1
2
3
2
3
ST_Buffer(geometry, distance)
: Створює буфер навколо геометрії. Для SRID 4326 відстань задається у градусах.
Аналіз перетинів
Знаходить спільну частину двох або більше геометрій і повертає новий геооб'єкт.
sql
SELECT ST_Intersection(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
geom
)
FROM locations
WHERE name = 'ServBay Headquarters';
1
2
3
4
5
6
2
3
4
5
6
ST_Intersection(geometry A, geometry B)
: Повертає перетин двох геометрій як нову геометрію.
Об'єднання геооб'єктів
Об'єднайте декілька геометрій в один складний об'єкт.
sql
SELECT ST_Union(geom)
FROM locations;
1
2
2
ST_Union(geometry set)
: Об'єднує усі передані геометрії в одну.
Візуалізація геопросторових даних
Відображення просторових даних із PostGIS у вигляді карти є типовою задачею для веб-розробки. Це можна зробити як у десктопному ГІС-застосунку, так і з використанням інтерактивних карт у браузері.
З використанням десктопного ГІС-інструменту (наприклад, QGIS)
QGIS — популярна безкоштовна програма для роботи з ГІС, яка підтримує пряме підключення до PostGIS.
Підключіться до PostgreSQL-PostGIS у ServBay:
- Відкрийте QGIS.
- У меню виберіть
Layer
(Шар) ->Add Layer
(Додати шар) ->Add PostGIS Layers...
(Додати шари PostGIS...). - У вікні натисніть
New
(Новий) для створення нового з'єднання. - Вкажіть такі дані:
- Name (Назва): наприклад,
ServBay PostGIS
. - Host (Хост):
localhost
або127.0.0.1
. - Port (Порт): стандартний PostgreSQL —
5432
. - Database (База даних): назва вашої бази з активованим PostGIS.
- Username (Ім'я користувача): ваш логін для бази (наприклад,
postgres
). - Password (Пароль): ваш пароль, якщо встановлено.
- Name (Назва): наприклад,
- Натисніть
Test Connection
(Перевірити підключення). - Натисніть
OK
для збереження. У головному вікні натиснітьConnect
(Підключитись).
Завантажте просторові дані:
- Успішно підключившись, перегляньте список таблиць.
- Знайдіть таблиці із просторовими стовпцями (
locations
тощо). - Виберіть потрібну таблицю, натисніть
Add
(Додати), потімClose
(Закрити). Дані відобразяться на карті у вікні QGIS.
З використанням веб-карт (наприклад, Leaflet)
Ви можете використовувати JS-бібліотеки для карт (Leaflet, OpenLayers, Mapbox GL JS) для візуалізації геоданих, отриманих із PostGIS через бекенд-сервіси. Нижче — базовий приклад для Leaflet. Щоб отримати дані, бекенд повинен (наприклад, на PHP, Node.js, Python — все це підтримується ServBay) зчитувати просторові дані в PostGIS і повертати у форматі GeoJSON.
Збережіть наведений HTML у кореневій папці сайту ServBay (за замовчуванням /Applications/ServBay/www
), наприклад, /Applications/ServBay/www/postgis-map/index.html
, і перегляньте у браузері за адресою типу postgis-map.servbay.demo
.
html
<!DOCTYPE html>
<html>
<head>
<title>ServBay PostGIS Leaflet Example</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 400px; width: 100%; } /* встановити розміри контейнера карти */
</style>
</head>
<body>
<h1>Візуалізація даних PostGIS (Leaflet)</h1>
<div id="map"></div>
<script>
// Ініціалізуємо карту — центр поблизу Пекіна
var map = L.map('map').setView([39.9042, 116.4074], 10);
// Додаємо шар із OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// Демонстрація: вручну додаємо мітку (у реальному проекті дані зчитуються з PostGIS)
// Координати відповідають прикладу 'ServBay Headquarters'
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>ServBay Headquarters</b><br>Приклад розташування')
.openPopup();
// На практиці, дані підвантажуються через Ajax із бекенду, який повертає GeoJSON
/*
fetch('/api/locations') // Якщо ваш API повертає GeoJSON за цим шляхом
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
*/
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Цей приклад показує лише базові можливості Leaflet. Щоб автоматично підвантажувати дані з PostGIS, напишіть бекенд, який підключається до бази даних, виконує просторовий запит, формує GeoJSON та віддає його на фронтенд через HTTP.
Відповіді на поширені питання (FAQ)
Q: Я отримую помилку при виконанні
CREATE EXTENSION postgis;
. Що робити?- A: Спочатку переконайтеся, що ви справді підключені до PostgreSQL і користувач має права на створення розширень (
postgres
зазвичай підходить). Далі перевірте, що пакет PostgreSQL працює в ServBay. Якщо все одно виникають проблеми, подивіться журнали (логи) ServBay та PostgreSQL — вони можуть містити потрібну інформацію для діагностики.
- A: Спочатку переконайтеся, що ви справді підключені до PostgreSQL і користувач має права на створення розширень (
Q: Що таке SRID 4326? Чи можу я використати інший SRID?
- A: SRID (Spatial Reference Identifier) — це числовий код, що визначає систему координат. 4326 відповідає WGS84 (широта/довгота), яка найбільш популярна у веб-картографії. Інші системи — наприклад, Web Mercator (SRID 3857) — також підтримуються. Вибір SRID залежить від вашого джерела даних та цілей програми. Для відображення на веб-картах зазвичай використовують 4326 або 3857.
Q: Чим розрізняються типи
geometry
таgeography
?- A:
geometry
оперує площинними координатами та використовує евклідові формули для обчислень (зручно для невеликих ділянок або унікальних проекцій).geography
працює із глобальними координатами (широта-довгота) поверхні Землі, враховуючи її сферичність — результати (відстань, площа) будуть точнішими для великих відстаней чи глобальних даних. Для локальних обчислень, де висока точність радіуса Землі не потрібна, зручніше використовуватиgeometry
. Якщо працюєте зі світовими координатами та бажаєте точних результатів, використовуйтеgeography
.
- A:
Висновок
PostGIS надає потужні можливості для роботи з геопросторовими даними у PostgreSQL і є основою для створення сучасних додатків із локаційною логікою. З ServBay активувати й використовувати PostGIS у локальному середовищі на macOS дуже просто — вам не потрібне додаткове встановлення чи складне налаштування.
У цьому матеріалі ми розглянули процес активації PostGIS у ServBay, створення і управління геопросторовими даними, виконання типових запитів та аналізу, а також способи візуалізації отриманих даних. Опановуйте ці базові інструменти — і ви зможете будувати нові функціональні геопросторові веб-додатки в ServBay. Досліджуйте офіційну документацію PostGIS — там ви знайдете ще більше потужних функцій і можливостей!