Typy danych przestrzennych
Punkty, linie i poligony w SQL
Typy danych przestrzennych to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Czym są dane przestrzenne?
Dane przestrzenne opisują rzeczywiste lokalizacje, kształty i obszary. W przeciwieństwie do zwykłej liczby lub ciągu znaków wartość przestrzenna ma znaczenie geometryczne — może przedstawiać punkt na mapie, odcinek drogi lub granicę państwa.
PostGIS to rozszerzenie PostgreSQL, które dodaje zaawansowane typy danych przestrzennych i funkcje, przekształcając bazę danych w pełnoprawny system informacji geograficznej (GIS).
-- Enable the PostGIS extension
CREATE EXTENSION IF NOT EXISTS postgis;Typ GEOMETRY
Podstawowym typem przestrzennym w PostGIS jest geometry. Przechowuje on kształty w płaskiej, euklidesowej przestrzeni współrzędnych. Podczas tworzenia kolumny można określić podtyp, taki jak POINT, LINESTRING lub POLYGON, jako ograniczenie.
Podanie SRID (Spatial Reference ID) wraz z podtypem informuje PostGIS, którego układu współrzędnych używają dane.
CREATE TABLE locations (
id SERIAL PRIMARY KEY,
name TEXT,
geom geometry(POINT, 4326)
);Wstawianie typu POINT
POINT reprezentuje pojedynczą lokalizację za pomocą współrzędnych X (długość geograficzna) i Y (szerokość geograficzna). Funkcja ST_GeomFromText konwertuje ciąg Well-Known Text (WKT) na wartość geometryczną.
SRID 4326 oznacza układ współrzędnych WGS 84 używany przez urządzenia GPS na całym świecie.
INSERT INTO locations (name, geom)
VALUES
('Eiffel Tower', ST_GeomFromText('POINT(2.2945 48.8584)', 4326)),
('Big Ben', ST_GeomFromText('POINT(-0.1246 51.5007)', 4326)),
('Colosseum', ST_GeomFromText('POINT(12.4922 41.8902)', 4326));
SELECT name, ST_AsText(geom) AS wkt FROM locations;Typ LINESTRING
LINESTRING to uporządkowana sekwencja co najmniej dwóch punktów połączonych prostymi odcinkami. Doskonale nadaje się do reprezentowania dróg, rzek i innych obiektów liniowych.
Każda para liczb w WKT oznacza jeden wierzchołek (długość i szerokość geograficzną). PostGIS przechowuje całą ścieżkę jako pojedynczą wartość geometryczną.
CREATE TABLE roads (
id SERIAL PRIMARY KEY,
name TEXT,
path geometry(LINESTRING, 4326)
);
INSERT INTO roads (name, path)
VALUES (
'High Street',
ST_GeomFromText(
'LINESTRING(-0.125 51.500, -0.120 51.502, -0.115 51.505)',
4326
)
);
SELECT name, ST_Length(path) AS length_degrees FROM roads;Typ POLYGON
POLYGON definiuje zamknięty obszar. Jego zewnętrzna granica jest pierścieniem — zamkniętym typem LINESTRING, w którym pierwszy i ostatni punkt są identyczne. Wielokąt może również zawierać wewnętrzne pierścienie (otwory) reprezentujące obszary takie jak jezioro w obrębie parku.
Wszystkie pierścienie muszą być zamknięte: należy powtórzyć początkową współrzędną na końcu.
CREATE TABLE zones (
id SERIAL PRIMARY KEY,
name TEXT,
area geometry(POLYGON, 4326)
);
INSERT INTO zones (name, area)
VALUES (
'Central Park Approx',
ST_GeomFromText(
'POLYGON((-73.9817 40.7681, -73.9580 40.7681,
-73.9580 40.7964, -73.9817 40.7964,
-73.9817 40.7681))',
4326
)
);
SELECT name, ST_Area(area) AS area_sq_deg FROM zones;GEOGRAPHY a GEOMETRY
PostGIS udostępnia dwie rodziny typów przestrzennych: geometry korzysta z płaskiej płaszczyzny kartezjańskiej, natomiast geography odwzorowuje Ziemię jako zakrzywioną elipsoidę.
Należy używać typu geography, gdy potrzebne są dokładne odległości w metrach dla dużych obszarów. Typ geometry należy stosować podczas pracy w lokalnym odwzorowanym układzie współrzędnych lub gdy najważniejsza jest maksymalna wydajność.
CREATE TABLE cities (
id SERIAL PRIMARY KEY,
name TEXT,
geog geography(POINT, 4326)
);
INSERT INTO cities (name, geog) VALUES
('New York', ST_GeogFromText('POINT(-74.0060 40.7128)')),
('London', ST_GeogFromText('POINT(-0.1278 51.5074)'));
-- Distance in metres using geography
SELECT
a.name AS from_city,
b.name AS to_city,
ROUND(ST_Distance(a.geog, b.geog)::NUMERIC) AS distance_m
FROM cities a, cities b
WHERE a.name = 'New York' AND b.name = 'London';Well-Known Text (WKT) i WKB
Dane przestrzenne można serializować w dwóch standardowych formatach. Well-Known Text (WKT) jest czytelny dla człowieka: POINT(2.29 48.86). Well-Known Binary (WKB) to kompaktowa reprezentacja binarna używana wewnętrznie oraz podczas przesyłania danych.
PostGIS udostępnia funkcje ST_AsText i ST_AsBinary do konwersji między wewnętrznym formatem przechowywania a tymi formatami.
SELECT
name,
ST_AsText(geom) AS wkt,
ST_AsEWKT(geom) AS ewkt,
encode(ST_AsBinary(geom), 'hex') AS wkb_hex
FROM locations
LIMIT 2;MULTIPOINT, MULTILINESTRING, MULTIPOLYGON
PostGIS obsługuje również typy multi-geometry, które grupują kilka kształtów tego samego rodzaju w jednej wartości. Jest to przydatne, gdy pojedynczy obiekt rzeczywisty składa się z rozłącznych części — na przykład archipelag może być modelowany jako MULTIPOLYGON.
Wszystkie standardowe funkcje przestrzenne działają w ten sam sposób dla typów multi-geometry.
SELECT ST_AsText(
ST_GeomFromText(
'MULTIPOLYGON(
((0 0, 4 0, 4 4, 0 4, 0 0)),
((10 10, 14 10, 14 14, 10 14, 10 10))
)'
)
) AS multi_poly;
SELECT ST_NumGeometries(
ST_GeomFromText(
'MULTIPOLYGON(
((0 0, 4 0, 4 4, 0 4, 0 0)),
((10 10, 14 10, 14 14, 10 14, 10 10))
)'
)
) AS part_count;GEOMETRYCOLLECTION
GEOMETRYCOLLECTION to najbardziej ogólny typ przestrzenny — może przechowywać w jednej wartości połączenie punktów, linii i wielokątów. Ta elastyczność jest przydatna, gdy zbiór danych może zawierać różne typy geometrii przechowywane w tej samej kolumnie.
Pojedyncze elementy można wyodrębniać za pomocą funkcji ST_GeometryN.
SELECT ST_AsText(
ST_GeomFromText(
'GEOMETRYCOLLECTION(
POINT(1 1),
LINESTRING(0 0, 1 1, 2 2),
POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))
)'
)
) AS collection;
SELECT ST_AsText(
ST_GeometryN(
ST_GeomFromText(
'GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(0 0, 1 1))'
),
1
)
) AS first_member;Indeksy przestrzenne za pomocą GIST
Zapytania przestrzenne sprawdzające zawieranie lub bliskość muszą porównać geometrię każdego wiersza — co może oznaczać skanowanie milionów kształtów. Indeks GIST znacznie przyspiesza to działanie, indeksując prostokąty ograniczające geometrii i pozwalając PostgreSQL pominąć wiersze, które z pewnością nie mogą spełnić warunku.
Zawsze należy tworzyć indeks GIST dla kolumn geometry lub geography, które są często używane w zapytaniach.
-- Create a GIST index on a geometry column
CREATE INDEX idx_locations_geom
ON locations
USING GIST (geom);
-- PostgreSQL will now use the index for spatial operators
EXPLAIN ANALYZE
SELECT name
FROM locations
WHERE ST_DWithin(
geom,
ST_GeomFromText('POINT(2.3 48.9)', 4326),
1.0
);Odczytywanie właściwości geometrii
PostGIS udostępnia funkcje dostępowe pozwalające wyodrębniać właściwości z dowolnej geometrii. ST_X i ST_Y zwracają współrzędne punktu, ST_SRID zwraca identyfikator układu odniesienia przestrzennego, a ST_GeometryType zwraca nazwę podtypu.
Funkcje te są niezbędne do sprawdzania i walidowania danych przestrzennych.
SELECT
name,
ST_X(geom) AS longitude,
ST_Y(geom) AS latitude,
ST_SRID(geom) AS srid,
ST_GeometryType(geom) AS geom_type,
ST_IsValid(geom) AS is_valid
FROM locations;Szybki test
Proszę sprawdzić swoją znajomość przestrzennych typów danych PostGIS.
Podsumowanie lekcji
W tej lekcji poznali Państwo podstawowe typy danych przestrzennych udostępniane przez PostGIS. Dowiedzieli się Państwo, że POINT, LINESTRING i POLYGON to trzy podstawowe podtypy geometrii, a ich warianty multi-geometry (MULTIPOINT, MULTILINESTRING, MULTIPOLYGON) oraz ogólny typ GEOMETRYCOLLECTION obejmują bardziej złożone kształty.
Poznali Państwo różnicę między płaskim typem geometry a elipsoidalnym typem geography oraz dowiedzieli się, jak wybrać między nimi. Well-Known Text (WKT) umożliwia odczytywanie i zapisywanie wartości przestrzennych w postaci czytelnych dla człowieka ciągów znaków, a indeksy GIST zapewniają wydajne działanie zapytań przestrzennych na dużą skalę. Funkcje dostępowe, takie jak ST_X, ST_SRID i ST_GeometryType, pozwalają bezpośrednio sprawdzać dowolną wartość geometryczną w SQL.
Często zadawane pytania
Czy lekcja „Typy danych przestrzennych” jest bezpłatna?
Tak — pełny tekst „Typy danych przestrzennych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Typy danych przestrzennych”?
Punkty, linie i poligony w SQL Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Typy danych przestrzennych”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Typy danych przestrzennych
- Odległość i najbliżsi sąsiedzi
- Złączenia przestrzenne i zawieranie
- Indeksy przestrzenne (GiST)