PostGis: un esempio di query spaziale con la funzione ST_DWithin.
Giugno 7, 2023Immaginiamo di utilizzare un database spaziale PostGreSQL con l’estensione PostGIS, e quindi di avere la possibilità di usufruire la funzione ST_DWithin.
In questo esercizio, sarà creata una tabella chiamata “ristoranti” che memorizza la posizione dei vari ristoranti in una città. Ogni ristorante è rappresentato come un punto nel sistema di coordinate con latitudine e longitudine.
La struttura della tabella “Ristoranti” potrebbe essere la seguente:
Campo | Descrizione |
Id | Codice identificativo univoco del ristorante (chiave primaria) |
Nome | Nome ristorante |
Indirizzo | Indirizzo ristorante |
Latitudine | Latitudine posizione ristorante |
Longitudine | Longitudine posizione ristorante |
Posizione | Campo di tipo geometry (POINT) che rappresenta la posizione geografica del ristorante nel sistema di riferimento spaziale (SRID) WGS84 |
(Descrizione dei campi della tabella “Ristoranti”)
Le descrizioni dei campi presenti nella tabella precedente descrivono in modo esaustivo a cosa servono realmente i campi e quindi non mi dilungo in nessun tipo di spiegazione.
Ora, supponiamo di voler trovare tutti i ristoranti che si trovano a meno di 2000 metri da un certo punto, ad esempio la mia abitazione, le cui coordinate sono (40.748817, -73.985428) (un punto a caso a Manhattan, New York).
Prima di tutto, avremmo bisogno di creare un punto geografico che rappresenta la mia abitazione. Possiamo farlo con la funzione ST_SetSRID e con la funzione ST_MakePoint offerta da PostGis come descritto nella SELECT seguente.
SELECT ST_SetSRID(ST_MakePoint(-73.985428, 40.748817), 4326);
Questa funzione crea un punto geografico con le coordinate della mia abitazione. Il numero 4326 è l’identificatore del sistema di riferimento spaziale (SRID) per le coordinate WGS 84, che è il sistema di coordinate standard utilizzato nella cartografia mondiale e nei sistemi di posizionamento come il GPS.
Ora, possiamo utilizzare la funzione ST_DWithin per trovare i ristoranti entro 2000 metri dalla mia abitazione. Di fatto, ST_DWithin restituisce tutti i punti che sono entro una certa distanza da un altro punto.
SELECT Nome, Indirizzo
FROM ristoranti
WHERE ST_DWithin(
Posizione::geography,
ST_SetSRID(ST_MakePoint(-73.985428, 40.748817), 4326)::geography,
2000
);
La query sopra descritta restituirà i nomi e gli indirizzi di tutti i ristoranti entro 2000 metri dalla mia abitazione. Nota, che ho convertito i campi di tipo geometry a geography usando `::geography` perché ST_DWithin, quando usato con tipi di dati geography, misura la distanza in metri (mentre con i tipi geometry, la distanza è misurata in unità del sistema di riferimento spaziale, che di solito non sono metri).
Questo è solo un esempio di un interrogazione spaziale SQL con l’utilizzo della funzione ST_DWithin.