Jak korzystać z PostGIS w ServBay: Dodaj obsługę danych geolokalizacyjnych do PostgreSQL
PostGIS
to zaawansowane rozszerzenie do bazy PostgreSQL, które wprowadza obsługę typów danych geoprzestrzennych, funkcji i indeksów dla tej bazy. Oznacza to, że możesz przechowywać w swojej bazie punkty, linie, poligony i wykonywać na nich złożone zapytania przestrzenne oraz analizy. Dla deweloperów aplikacji internetowych, którzy pracują z mapami, usługami lokalizacyjnymi lub jakimikolwiek projektami powiązanymi z danymi geograficznymi, PostGIS to narzędzie niezbędne.
ServBay — lokalne środowisko programistyczne stworzone dla macOS — został wyposażony w pakiet PostgreSQL, z domyślnie dodanym rozszerzeniem PostGIS. Dzięki temu cały proces korzystania z PostGIS na lokalnej maszynie jest znacząco uproszczony — nie musisz ręcznie kompilować ani instalować żadnych dodatkowych zależności.
W tym artykule krok po kroku dowiesz się, jak włączyć i zacząć korzystać z PostGIS w ServBay, by szybko dodać funkcje geoprzestrzenne do swoich projektów.
Wymagania wstępne
Przed rozpoczęciem przygody z PostGIS upewnij się, że spełniasz poniższe wymagania:
- Instalacja i uruchomienie ServBay: Upewnij się, że ServBay został poprawnie zainstalowany na Twoim macOS.
- Aktywacja i uruchomienie pakietu PostgreSQL: Sprawdź w panelu sterowania ServBay, czy pakiet PostgreSQL jest włączony i działa. Jeśli jeszcze nie jest aktywowany, znajdź PostgreSQL, zaznacz „Enable” i uruchom.
- Dostęp do bazy PostgreSQL: Wiedz, jak połączyć się z bazą danych PostgreSQL uruchomioną w ServBay, używając narzędzi takich jak
psql
(wiersz poleceń) lub klientów graficznych (np. TablePlus, pgAdmin). Domyślnie możesz połączyć się poleceniempsql -U postgres
.
Instalacja i aktywacja rozszerzenia PostGIS
Pliki rozszerzenia PostGIS są fabrycznie zainstalowane w ServBay — nie trzeba niczego pobierać. Wystarczy "włączyć" to rozszerzenie w wybranej bazie danych, w której chcesz korzystać z PostGIS.
Oto kroki prowadzące do uruchomienia funkcji PostGIS:
Połącz się z wybraną bazą danych PostgreSQL: Otwórz Terminal, użyj polecenia
psql
by połączyć się ze swoją bazą. Zamieńyour_username
na nazwę użytkownika bazy (np.postgres
), ayour_database
na wybraną bazę.bashpsql -U your_username -d your_database
1Jeśli chcesz aktywować PostGIS w domyślnej bazie i użytkowniku (
postgres
), możesz po prostu użyć:bashpsql -U postgres
1Utwórz rozszerzenie PostGIS w bazie: Po połączeniu, w konsoli
psql
wykonaj poniższe polecenie SQL:sqlCREATE EXTENSION postgis;
1Komenda ta doda wszystkie potrzebne obiekty (nowe typy danych, funkcje, operatory) do obecnej bazy.
Sprawdź, czy PostGIS działa: W konsoli
psql
możesz zobaczyć listę zainstalowanych rozszerzeń poleceniem\dx
:sql\dx
1Jeśli wszystko poszło prawidłowo, na liście pojawi się
postgis
z informacją o wersji.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(Uwaga: numer wersji PostGIS może różnić się w zależności od wersji ServBay.)
Gratulacje — rozszerzenie PostGIS zostało aktywowane i możesz korzystać ze wszystkich jego możliwości w wybranej bazie!
Konfiguracja danych PostGIS
Po aktywacji PostGIS możesz tworzyć nowe tabele z kolumnami geoprzestrzennymi lub dodawać takie kolumny do już istniejących tabel. PostGIS obsługuje dwa główne typy przestrzenne: geometry
i geography
. Typ geometry
wykorzystywany jest do obliczeń w układzie płaskim (np. miasta lub regiony), a geography
— na powierzchni kuli (np. dokładne odległości po powierzchni Ziemi), idealny do przechowywania współrzędnych geograficznych.
Tworzenie tabeli z kolumną geoprzestrzenną
Poniższy przykład pokazuje, jak utworzyć tabelę locations
z kolumną dla punktów:
Utwórz tabelę: W konsoli
psql
albo poprzez klienta graficznego wykonaj:sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
: Kolumnageom
przyjmuje typ przestrzennyGEOMETRY
, gdziePoint
określa rodzaj geometrii, a4326
to SRID (Spatial Reference Identifier) opisujący układ odniesienia WGS84 — najpopularniejszy system współrzędnych GPS, używany np. w OpenStreetMap czy Google Maps.- W zależności od potrzeb możesz użyć innych form (np.
LineString
,Polygon
,MultiPoint
) oraz odpowiadających im SRID.
Wstaw przykładowe dane: Skorzystaj z funkcji PostGIS do wstawienia obiektów geometrycznych.
ST_GeomFromText()
konwertuje dane WKT (Well-Known Text) na geometrię.sqlINSERT INTO locations (name, geom) VALUES ('ServBay Headquarters', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- przykład współrzędnych dla Pekinu ('ServBay Shanghai Office', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- przykład współrzędnych dla Szanghaju
1
2
3Pamiętaj, że w WKT kolejność współrzędnych to „długość geograficzna szerokość”.
Tworzenie indeksu geoprzestrzennego
Dla tabel przechowujących dużo danych przestrzennych niezbędne są indeksy, by zapewnić szybkie i wydajne wyszukiwanie. Najpopularniejszy indeks w PostGIS to GiST (Generalized Search Tree).
Załóż indeks GiST: W konsoli
psql
albo w narzędziu klienckim:sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1Indeks utworzy się na kolumnie
geom
w tabelilocations
, optymalizując każde zapytanie przestrzenne dla tej tabeli.
Przykłady zapytań geoprzestrzennych w PostGIS
PostGIS udostępnia setki funkcji do przetwarzania danych przestrzennych. Oto kilka najbardziej przydatnych w typowych zastosowaniach webowych:
Obliczanie odległości między dwoma punktami
Oblicz prostą odległość między dwoma lokalizacjami:
sql
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- punkt A
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- punkt B
);
1
2
3
4
2
3
4
ST_Distance()
: Wylicza odległość między dwoma geometriami. Przy użyciu SRID 4326 i typugeometry
jednostką jest stopień (w przybliżeniu). Aby uzyskać dokładniejszy wynik w metrach, użyj typugeography
lub funkcjiST_Distance(geography_a, geography_b, use_spheroid)
.
Sprawdzanie relacji zawierania
Czy jeden obiekt geometryczny zawiera drugi? Na przykład, czy dany punkt znajduje się w określonym obszarze?
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), -- przykładowy obszar prostokątny
geom
);
1
2
3
4
5
2
3
4
5
ST_Contains(geometry A, geometry B)
: Zwraca true, jeśli geometria A całkowicie zawiera geometrię B.
Szukanie najbliższych punktów
Znajdź lokalizacje najbliższe danemu punktowi — dzięki indeksowi GiST takie zapytania są bardzo szybkie.
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) -- operator <-> używa indeksu GiST do sortowania po odległości
LIMIT 5;
1
2
3
4
2
3
4
- Operator
<->
to specjalny operator odległości, który w połączeniu z indeksem GiST sprawnie wyszukuje najbliższe obiekty.
Analizy geoprzestrzenne z użyciem PostGIS
Poza podstawowymi zapytaniami, PostGIS oferuje liczne narzędzia analityczne, np. tworzenie buforów, analizę przecięć czy łączenie geometrii.
Tworzenie bufora (buffer analysis)
Wyznacz wielokąt dookoła obiektu odległy od niego o określony dystans:
sql
SELECT ST_Buffer(geom, 0.01) -- bufor w stopniach (0.01° ≈ 1.1 km)
FROM locations
WHERE name = 'ServBay Headquarters';
1
2
3
2
3
ST_Buffer(geometry, distance)
: Tworzy bufor dookoła wskazanej geometrii na zadaną odległość (jednostka to taka, jak przyjęta w SRID; tu: stopnie).
Analiza przecięć (intersection)
Wylicz wspólny obszar dla dwóch (lub więcej) geometrii, zwracając nowy obiekt geometryczny:
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)
: Zwraca część wspólną A i B jako nową geometrię.
Łączenie geometrii (union)
Scal wiele obiektów w jeden (tzw. zbiór wieloczęściowy):
sql
SELECT ST_Union(geom)
FROM locations;
1
2
2
ST_Union(geometry set)
: Scala wszystkie geometrie z wejściowego zbioru w jeden obiekt.
Wizualizacja danych geoprzestrzennych
Wizualizacja danych z PostGIS to częsty przypadek w aplikacjach webowych. Możesz to zrobić używając zewnętrznych narzędzi GIS lub bibliotek webowych.
Używanie narzędzi GIS (np. QGIS)
QGIS to otwartoźródłowe oprogramowanie GIS, które bezpośrednio łączy się z bazą PostGIS i umożliwia graficzną prezentację danych.
Połącz się z PostgreSQL w ServBay:
- Otwórz QGIS.
- W menu wybierz
Layer
(Warstwa) ->Add Layer
(Dodaj warstwę) ->Add PostGIS Layers...
(Dodaj warstwy PostGIS). - W nowym oknie kliknij
New
(Nowe połączenie). - Wprowadź dane połączenia:
- Name: Nazwa połączenia, np.
ServBay PostGIS
. - Host:
localhost
lub127.0.0.1
. - Port: domyślnie
5432
. - Database: nazwa bazy z aktywnym PostGIS.
- Username: np.
postgres
. - Password: Twoje hasło (jeśli ustawione).
- Name: Nazwa połączenia, np.
- Kliknij
Test Connection
(Sprawdź połączenie). - Kliknij
OK
, a następnie w głównym oknieConnect
(Połącz).
Załaduj dane geoprzestrzenne:
- Po połączeniu wyświetlą się wszystkie tabele.
- Znajdź tę z kolumną geometrii (np.
locations
). QGIS sam wykryje kolumny przestrzenne. - Zaznacz odpowiednią tabelę, kliknij
Add
(Dodaj), a następnieClose
(Zamknij). Dane pojawią się na mapie QGIS.
Użycie bibliotek webowych (np. Leaflet)
Możesz też wizualizować dane geoprzestrzenne na stronie internetowej z użyciem JavaScriptowych bibliotek takich jak Leaflet, OpenLayers czy Mapbox GL JS. Przykład z Leaflet poniżej pokazuje podstawową konfigurację mapy w pliku HTML. Dane z bazy PostGIS możesz pobierać przez backend (np. w PHP, Node.js, Python — wszystkie dostępne w ServBay) i zwracać je jako GeoJSON.
Zapisz poniższy plik HTML w katalogu strony w ServBay (np. /Applications/ServBay/www/postgis-map/index.html
). Odwiedź potem stronę lokalnie np. pod adresem 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%; } /* Ustaw rozmiar kontenera mapy */
</style>
</head>
<body>
<h1>Przykład wizualizacji danych PostGIS (Leaflet)</h1>
<div id="map"></div>
<script>
// Inicjalizuj mapę i ustaw centrum oraz powiększenie
// Przykładowy środek: Pekin
var map = L.map('map').setView([39.9042, 116.4074], 10);
// Dodaj warstwę OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// Przykład: ręczne dodanie znacznika (w praktyce dane będą generowane dynamicznie z PostGIS)
// Lokalizacja zgodna z 'ServBay Headquarters'
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>ServBay Headquarters</b><br>Przykładowa lokalizacja')
.openPopup();
// W realnym projekcie uzyskasz dane przez żądanie Ajax do backendu zwracającego GeoJSON z PostGIS
/*
fetch('/api/locations') // Endpoint backendu zwracający 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
43
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
43
Ten przykład prezentuje jedynie podstawowe możliwości Leaflet. Łączenie się z PostGIS po stronie backendowej, konwersja danych na GeoJSON i ich publikacja przez API — to standardowa droga w profesjonalnych rozwiązaniach (wszystko to zrealizujesz w ServBay).
Najczęściej zadawane pytania (FAQ)
Q: Otrzymuję błąd przy
CREATE EXTENSION postgis;
. Co robić?- A: Najpierw upewnij się, że połączyłeś się z bazą PostgreSQL użytkownikiem mającym uprawnienia do tworzenia rozszerzeń (z reguły
postgres
). Upewnij się też, że pakiet PostgreSQL w ServBay jest uruchomiony. Jeśli nadal pojawiają się problemy, sprawdź logi ServBay i PostgreSQL.
- A: Najpierw upewnij się, że połączyłeś się z bazą PostgreSQL użytkownikiem mającym uprawnienia do tworzenia rozszerzeń (z reguły
Q: Czym jest SRID 4326? Czy mogę używać innego SRID?
- A: SRID (Spatial Reference Identifier) to numeryczny kod określający układ odniesienia współrzędnych. 4326 odpowiada WGS84 (najczęściej używany w mapach webowych). Możesz użyć innych SRID, np. Web Mercator (3857). Wybór zależy od typu danych i zastosowania — dla większości przypadków webowych SRID 4326 lub 3857 sprawdzi się najlepiej.
Q: Jaka jest różnica między typem
geometry
ageography
?- A:
geometry
zakłada płaski układ współrzędnych — szybkie operacje, ale odległości/obszary liczone są bez uwzględniania krzywizny Ziemi. Typgeography
bazuje na kulistej powierzchni globu i zapewnia dokładniejsze obliczenia (długości, powierzchnie) na dużą skalę, zwłaszcza dla globalnych danych geograficznych. Do lokalnych, mniej precyzyjnych obliczeń zwykle wystarczageometry
(jest też szybszy). Do precyzyjnych analiz globalnych — wybierzgeography
.
- A:
Podsumowanie
PostGIS wprowadza do PostgreSQL zaawansowane możliwości obsługi danych geoprzestrzennych i stanowi fundament dla aplikacji opartych o lokalizację. Dzięki ServBay możesz łatwo i szybko korzystać z PostGIS w lokalnym środowisku macOS, bez skomplikowanej instalacji i konfiguracji.
W tym przewodniku pokazano, jak aktywować rozszerzenie PostGIS w ServBay, tworzyć oraz zarządzać danymi przestrzennymi, wykonywać zapytania i analizy, a także wstępnie wizualizować dane. Z tą wiedzą możesz śmiało rozpocząć prace nad webowymi aplikacjami geoprzestrzennymi korzystającymi z bazy PostGIS w ServBay. Eksploruj oficjalną dokumentację PostGIS — czeka tam na Ciebie mnóstwo dodatkowych, potężnych funkcji!