SQL Academy · Lektion

Rumlige datatyper

Punkter, linjer og polygoner i SQL

Lektion 1 af 413 trin

Rumlige datatyper er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad er geospatiale data

Geospatiale data beskriver placeringer, former og områder i den virkelige verden. I modsætning til et almindeligt tal eller en tekststreng indeholder en spatial værdi geometrisk betydning — et punkt på et kort, et vejsegment eller et lands grænse.

PostGIS er en PostgreSQL-udvidelse, der tilføjer effektive spatiale datatyper og funktioner og dermed forvandler din database til et komplet geografisk informationssystem (GIS).

-- Enable the PostGIS extension
CREATE EXTENSION IF NOT EXISTS postgis;

GEOMETRY-typen

Den centrale spatiale type i PostGIS er geometry. Den gemmer former i et fladt euklidisk koordinatrum. Du kan angive en undertype som POINT, LINESTRING eller POLYGON som en begrænsning, når du opretter en kolonne.

Hvis du angiver SRID (rumligt reference-id) sammen med undertypen, fortæller du PostGIS, hvilket koordinatsystem dine data bruger.

CREATE TABLE locations (
  id      SERIAL PRIMARY KEY,
  name    TEXT,
  geom    geometry(POINT, 4326)
);

Indsættelse af en POINT

En POINT repræsenterer en enkelt placering med X- (længdegrad) og Y-koordinater (breddegrad). Funktionen ST_GeomFromText konverterer en tekststreng i WKT-format til en geometry-værdi.

SRID 4326 er koordinatsystemet WGS 84, som GPS-enheder bruger over hele verden.

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;

LINESTRING-typen

En LINESTRING er en ordnet sekvens af to eller flere punkter, der er forbundet af rette segmenter. Den er velegnet til at repræsentere veje, floder eller andre lineære objekter.

Hvert talpar i WKT'en er ét toppunkt (længdegrad breddegrad). PostGIS gemmer hele ruten som en enkelt geometry-værdi.

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;

POLYGON-typen

En POLYGON definerer et afgrænset område. Den ydre grænse er en ring — en lukket LINESTRING, hvor det første og sidste punkt er identiske. En polygon kan også have indre ringe (huller), der repræsenterer områder som en sø i en park.

Alle ringe skal være lukkede: Gentag startkoordinaten til sidst.

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 kontra GEOMETRY

PostGIS har to familier af spatiale typer: geometry bruger en flad kartesisk plan, mens geography modellerer Jorden som en krummet sfæroide.

Brug geography, når du har brug for nøjagtige afstande i meter i den virkelige verden over store områder. Brug geometry, når du arbejder i et lokalt projiceret koordinatsystem eller har brug for maksimal ydeevne.

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';

Velkendt tekst (WKT) og velkendt binærformat (WKB)

Spatiale data kan serialiseres i to standardformater. Velkendt tekst (WKT) kan læses af mennesker: POINT(2.29 48.86). Velkendt binærformat (WKB) er en kompakt binær repræsentation, der bruges internt og til dataoverførsel.

PostGIS har funktionerne ST_AsText og ST_AsBinary til at konvertere mellem intern lagring og disse formater.

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 understøtter også multi-geometri-typer, der samler flere former af samme slags i én værdi. Det er nyttigt, når ét objekt i den virkelige verden består af adskilte dele — for eksempel et øhav, der modelleres som en MULTIPOLYGON.

Alle standardfunktioner til spatiale data fungerer på samme måde med multi-geometrier.

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

En GEOMETRYCOLLECTION er den mest generelle spatiale type — den kan indeholde en blanding af punkter, linjer og polygoner i én værdi. Denne fleksibilitet er nyttig, når et datasæt kan indeholde heterogene geometrityper, der er gemt i samme kolonne.

Du kan udtrække individuelle medlemmer med 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;

Spatiale indekser med GIST

Spatiale forespørgsler, der undersøger indeslutning eller nærhed, skal sammenligne hver rækkes geometri — hvilket potentielt kan betyde scanning af millioner af former. Et GIST-indeks gør dette markant hurtigere ved at indeksere geometriernes afgrænsningsbokse, så PostgreSQL kan springe rækker over, der umuligt kan matche.

Opret altid et GIST-indeks på geometry- eller geography-kolonner, som du forespørger ofte.

-- 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
);

Læsning af geometri-egenskaber

PostGIS har adgangsfunktioner, der udtrækker egenskaber fra enhver geometri. ST_X og ST_Y returnerer koordinaterne for et punkt, ST_SRID returnerer det rumlige reference-id, og ST_GeometryType returnerer navnet på undertypen.

De er afgørende, når du skal undersøge og validere spatiale data.

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;

Hurtigt tjek

Test din forståelse af PostGIS' spatiale datatyper.

Opsummering af lektionen

I denne lektion har du udforsket de centrale spatiale datatyper, som PostGIS leverer. Du har lært, at POINT, LINESTRING og POLYGON er de tre grundlæggende geometriundertyper, og at multi-geometri-varianterne (MULTIPOINT, MULTILINESTRING, MULTIPOLYGON) samt den generelle GEOMETRYCOLLECTION dækker mere komplekse former.

Du har set forskellen mellem den flade type geometry og den sfæroide type geography samt lært, hvordan du vælger mellem dem. Velkendt tekst (WKT) giver dig mulighed for at læse og skrive spatiale værdier som menneskeligt læsbare tekststrenge, mens GIST-indekser holder spatiale forespørgsler hurtige i stor skala. Adgangsfunktioner som ST_X, ST_SRID og ST_GeometryType lader dig undersøge enhver geometry-værdi direkte i SQL.

Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “Rumlige datatyper” gratis?

Ja — hele teksten til “Rumlige datatyper” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Rumlige datatyper”?

Punkter, linjer og polygoner i SQL Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Rumlige datatyper”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Rumlige datatyper
  2. Afstand og nærmeste naboer
  3. Rumlige joins og indeholdelse
  4. Rumlige indeks (GiST)
← Tilbage til SQL Academy