Tipi di dati spaziali
Punti, linee e poligoni in SQL.
Tipi di dati spaziali è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.
Cosa sono i dati spaziali?
I dati spaziali descrivono luoghi, forme e aree del mondo reale. A differenza di un semplice numero o di una stringa, un valore spaziale contiene un significato geometrico: un punto su una mappa, un segmento stradale o il confine di un Paese.
PostGIS è un'estensione di PostgreSQL che aggiunge potenti tipi di dati e funzioni spaziali, trasformando il database in un vero sistema informativo geografico (GIS).
-- Enable the PostGIS extension
CREATE EXTENSION IF NOT EXISTS postgis;Il tipo GEOMETRY
Il tipo spaziale fondamentale di PostGIS è geometry. Memorizza le forme in uno spazio di coordinate piano (euclideo). Quando crea una colonna, può specificare un sottotipo come POINT, LINESTRING o POLYGON come vincolo.
Specificare l'SRID (ID del riferimento spaziale) insieme al sottotipo indica a PostGIS quale sistema di coordinate utilizzano i dati.
CREATE TABLE locations (
id SERIAL PRIMARY KEY,
name TEXT,
geom geometry(POINT, 4326)
);Inserimento di un POINT
Un POINT rappresenta una singola posizione con coordinate X (longitudine) e Y (latitudine). La funzione ST_GeomFromText converte una stringa Well-Known Text (WKT) in un valore geometry.
L'SRID 4326 è il sistema di coordinate WGS 84 utilizzato dai dispositivi GPS in tutto il mondo.
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;Il tipo LINESTRING
Una LINESTRING è una sequenza ordinata di due o più punti collegati da segmenti rettilinei. È ideale per rappresentare strade, fiumi o qualsiasi elemento lineare.
Ogni coppia di numeri nel WKT rappresenta un vertice (longitudine e latitudine). PostGIS memorizza l'intero percorso come un unico valore geometry.
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;Il tipo POLYGON
Un POLYGON definisce un'area delimitata. Il suo confine esterno è un anello: una LINESTRING chiusa in cui il primo e l'ultimo punto sono identici. Un poligono può anche avere anelli interni (buchi) per rappresentare aree come un lago all'interno di un parco.
Tutti gli anelli devono essere chiusi: ripeta la coordinata iniziale alla fine.
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 e GEOMETRY a confronto
PostGIS fornisce due famiglie di tipi spaziali: geometry utilizza un piano cartesiano piano, mentre geography modella la Terra come uno sferoide curvo.
Utilizzi geography quando ha bisogno di distanze reali accurate in metri su aree estese. Utilizzi geometry quando lavora in un sistema di coordinate proiettato locale o ha bisogno delle massime prestazioni.
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) e WKB
I dati spaziali possono essere serializzati in due formati standard. Well-Known Text (WKT) è leggibile dalle persone: POINT(2.29 48.86). Well-Known Binary (WKB) è una rappresentazione binaria compatta utilizzata internamente e per il trasferimento dei dati.
PostGIS fornisce ST_AsText e ST_AsBinary per convertire i dati tra la memorizzazione interna e questi formati.
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 supporta anche i tipi multi-geometry, che raggruppano più forme dello stesso tipo in un unico valore. È utile quando un singolo elemento del mondo reale è costituito da parti disgiunte, ad esempio un arcipelago modellato come MULTIPOLYGON.
Tutte le funzioni spaziali standard funzionano allo stesso modo sulle multi-geometrie.
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
Una GEOMETRYCOLLECTION è il tipo spaziale più generale: può contenere una combinazione di punti, linee e poligoni in un unico valore. Questa flessibilità è utile quando un dataset può contenere tipi di geometria eterogenei memorizzati nella stessa colonna.
Può estrarre i singoli elementi con 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;Indici spaziali con GIST
Le query spaziali che verificano l'inclusione o la prossimità devono confrontare la geometria di ogni riga, eseguendo potenzialmente la scansione di milioni di forme. Un indice GIST accelera notevolmente l'operazione indicizzando i riquadri di delimitazione delle geometrie, così PostgreSQL può ignorare le righe che non possono corrispondere in alcun caso.
Crei sempre un indice GIST sulle colonne geometry o geography che interroga frequentemente.
-- 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
);Lettura delle proprietà delle geometrie
PostGIS fornisce funzioni accessor per estrarre le proprietà di qualsiasi geometria. ST_X e ST_Y restituiscono le coordinate di un punto, ST_SRID restituisce l'ID del riferimento spaziale e ST_GeometryType restituisce il nome del sottotipo.
Queste funzioni sono essenziali per esaminare e convalidare i dati spaziali.
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;Verifica rapida
Verifichi la Sua comprensione dei tipi di dati spaziali di PostGIS.
Riepilogo della lezione
In questa lezione ha esplorato i principali tipi di dati spaziali forniti da PostGIS. Ha appreso che POINT, LINESTRING e POLYGON sono i tre sottotipi fondamentali di geometry e che le varianti multi-geometria (MULTIPOINT, MULTILINESTRING, MULTIPOLYGON) e il tipo generico GEOMETRYCOLLECTION coprono forme più complesse.
Ha visto la differenza tra il tipo piano geometry e il tipo sferoidale geography, nonché come scegliere tra i due. Well-Known Text (WKT) consente di leggere e scrivere valori spaziali come stringhe leggibili dalle persone, mentre gli indici GIST mantengono veloci le query spaziali anche su larga scala. Funzioni accessor come ST_X, ST_SRID e ST_GeometryType consentono di esaminare direttamente in SQL qualsiasi valore geometry.
Domande Frequenti
La lezione «Tipi di dati spaziali» è gratuita?
Sì — il testo completo di «Tipi di dati spaziali» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.
Cosa imparerò in «Tipi di dati spaziali»?
Punti, linee e poligoni in SQL. Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Academy?
Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Tipi di dati spaziali»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Academy?
Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Tipi di dati spaziali
- Distanze e vicini più prossimi
- Join spaziali e contenimento
- Indici spaziali (GiST)