SQL Academy · leksjon

Romlige datatyper

Punkter, linjer og polygoner i SQL.

Leksjon 1 av 413 trinn

Romlige datatyper er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva er romlige data?

Romlige data beskriver virkelige posisjoner, former og områder. I motsetning til et vanlig tall eller en vanlig streng har en romlig verdi en geometrisk betydning – for eksempel et punkt på et kart, et veistykke eller grensen til et land.

PostGIS er en PostgreSQL-utvidelse som legger til kraftige romlige datatyper og funksjoner, slik at databasen blir et komplett geografisk informasjonssystem (GIS).

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

GEOMETRY-typen

Den sentrale romlige typen i PostGIS er geometry. Den lagrer former i et flatt, euklidisk koordinatrom. De kan angi en undertype, for eksempel POINT, LINESTRING eller POLYGON, som en begrensning når De oppretter en kolonne.

Når De angir SRID (Spatial Reference ID) sammen med undertypen, forteller De PostGIS hvilket koordinatsystem dataene bruker.

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

Sette inn et POINT

Et POINT representerer én enkelt posisjon med X-koordinat (lengdegrad) og Y-koordinat (breddegrad). Funksjonen ST_GeomFromText konverterer en Well-Known Text-streng (WKT) til en geometry-verdi.

SRID 4326 er koordinatsystemet WGS 84, som brukes av GPS-enheter 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 med to eller flere punkter som er forbundet med rette linjestykker. Den egner seg godt til å representere veier, elver eller andre lineære objekter.

Hvert tallpar i WKT-en er ett toppunkt (lengdegrad breddegrad). PostGIS lagrer hele banen som én enkelt geometry-verdi.

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 avgrenset område. Den ytre grensen er en ring – en lukket LINESTRING der det første og siste punktet er identiske. En polygon kan også ha indre ringer (hull) for å representere områder som en innsjø inne i en park.

Alle ringer må være lukkede: gjenta startkoordinaten på slutten.

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 tilbyr to familier av romlige typer: geometry bruker et flatt kartesisk plan, mens geography modellerer jorden som en krum sfæroide.

Bruk geography når De trenger nøyaktige avstander i meter i den virkelige verden over store områder. Bruk geometry når De arbeider i et lokalt projisert koordinatsystem eller trenger høyest mulig ytelse.

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) og WKB

Romlige data kan serialiseres i to standardformater. Well-Known Text (WKT) er lesbart for mennesker: POINT(2.29 48.86). Well-Known Binary (WKB) er en kompakt binær representasjon som brukes internt og ved dataoverføring.

PostGIS tilbyr ST_AsText og ST_AsBinary for å konvertere mellom intern lagring og disse formatene.

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 støtter også multigeometri-typer som samler flere former av samme slag i én verdi. Dette er nyttig når ett virkelig objekt består av adskilte deler – for eksempel en øygruppe som modelleres som en MULTIPOLYGON.

Alle standardfunksjoner for romlige data fungerer på samme måte for multigeometrier.

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 romlige typen – den kan inneholde en blanding av punkter, linjer og polygoner i én enkelt verdi. Denne fleksibiliteten er nyttig når et datasett kan inneholde heterogene geometrityper som er lagret i samme kolonne.

De kan hente ut 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;

Romlige indekser med GIST

Romlige spørringer som kontrollerer innhold eller nærhet, må sammenligne geometrien i hver rad – noe som potensielt innebærer skanning av millioner av former. En GIST-indeks gjør dette mye raskere ved å indeksere de avgrensende boksene til geometriene, slik at PostgreSQL kan hoppe over rader som umulig kan gi treff.

Opprett alltid en GIST-indeks på geometry- eller geography-kolonner som De ofte kjører spørringer mot.

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

Lese egenskaper for geometri

PostGIS tilbyr tilgangsfunksjoner for å hente ut egenskaper fra enhver geometri. ST_X og ST_Y returnerer koordinatene til et punkt, ST_SRID returnerer den romlige referanse-ID-en, og ST_GeometryType returnerer navnet på undertypen.

Disse funksjonene er avgjørende for å undersøke og validere romlige 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;

Hurtigsjekk

Test Deres forståelse av PostGIS-datatypene for romlige data.

Oppsummering av leksjonen

I denne leksjonen utforsket De de sentrale romlige datatypene som PostGIS tilbyr. De lærte at POINT, LINESTRING og POLYGON er de tre grunnleggende geometriundertypene, og at multigeometrivariantene (MULTIPOINT, MULTILINESTRING, MULTIPOLYGON) samt den generelle GEOMETRYCOLLECTION dekker mer komplekse former.

De så forskjellen mellom den flate geometry-typen og den sfæroide geography-typen, og hvordan De velger mellom dem. Well-Known Text (WKT) lar Dem lese og skrive romlige verdier som lesbare strenger, mens GIST-indekser holder romlige spørringer raske i stor skala. Tilgangsfunksjoner som ST_X, ST_SRID og ST_GeometryType lar Dem undersøke enhver geometry-verdi direkte i SQL.

Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
46
Leksjoner
183

Ofte stilte spørsmål

Er leksjonen «Romlige datatyper» gratis?

Ja – hele teksten i «Romlige datatyper» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Romlige datatyper»?

Punkter, linjer og polygoner i SQL. Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med SQL Academy?

Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Romlige datatyper»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?

Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Romlige datatyper
  2. Avstand og nærmeste naboer
  3. Romlige koblinger og innebygdhet
  4. Romlige indekser (GiST)
← Tilbake til SQL Academy