0Pricing
SQL Academy · Lekcja

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

  1. Typy danych przestrzennych
  2. Odległość i najbliżsi sąsiedzi
  3. Złączenia przestrzenne i zawieranie
  4. Indeksy przestrzenne (GiST)
← Powrót do SQL Academy