PostGis: un esempio di query spaziale con la funzione ST_DWithin.

Giugno 7, 2023 0 Di Ruggero Grando

Immaginiamo 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:

CampoDescrizione
IdCodice identificativo univoco del ristorante (chiave primaria)
NomeNome ristorante
IndirizzoIndirizzo ristorante
LatitudineLatitudine posizione ristorante
LongitudineLongitudine posizione ristorante
PosizioneCampo di tipo geometry (POINT) che rappresenta la posizione geografica del ristorante nel sistema di riferimento spaziale (SRID) WGS84
Tabella 1
(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.

No votes yet.
Please wait...