PostGis: un esempio di query “spaziale” con la funzione ST_Distance

PostGis: un esempio di query “spaziale” con la funzione ST_Distance

Aprile 10, 2024 0 Di Ruggero Grando

Ecco un esempio di una query spaziale che calcola la distanza tra due punti nel database utilizzando PostGIS.

import psycopg2
from shapely.geometry import Point

# Parametri di connessione al database
db_host = 'localhost'
db_name = 'your_database_name'
db_user = 'your_username'
db_password = 'your_password'

# Connessione al database
conn = psycopg2.connect(host=db_host, dbname=db_name, user=db_user, password=db_password)
cur = conn.cursor()

# Esempio di query spaziale
point1 = Point(12.4964, 41.9028)  # Primo punto (latitudine, longitudine)
point2 = Point(12.4939, 41.8986)  # Secondo punto (latitudine, longitudine)

query = """
    SELECT ST_Distance(
        ST_Transform(ST_SetSRID(ST_GeomFromText(%s), 4326), 3857),
        ST_Transform(ST_SetSRID(ST_GeomFromText(%s), 4326), 3857)
    )
"""

params = (point1.wkt, point2.wkt)

cur.execute(query, params)
distance = cur.fetchone()[0]

# Chiusura della connessione al database
cur.close()
conn.close()

# Stampa della distanza calcolata
print("Distanza tra i due punti:", distance, "metri")

Nell’esempio sopra, ho creato due oggetti `Point` della libreria `shapely` rappresentanti i punti di interesse. Le coordinate dei due punti, sono la latitudine e la longitudine espresse secondo il sistema di riferimento WGS84 (SRID 4326).

Successivamente, ho eseguito una query spaziale utilizzando la funzione `ST_Distance` di PostGIS per calcolare la distanza tra i due punti. La query, fa uso delle funzioni `ST_GeomFromText` per creare oggetti geometrici dal testo WKT (Well-Known Text) dei punti, e `ST_Transform` per convertire i punti dal sistema di riferimento di latitudine e longitudine (SRID 4326) al sistema di riferimento proiettato (SRID 3857) utilizzato da PostGIS per le operazioni di distanza.

Da notare come lo SRID 3857 rappresenta il sistema di coordinate proiettate chiamato “Pseudo-Mercator” o “Web Mercator“. Questo sistema di riferimento è comunemente utilizzato in molte applicazioni di mappatura online, tra cui Google Maps, Bing Maps e OpenStreetMap.

Il sistema di riferimento Web Mercator è diventato popolare per la mappatura su Internet perché mantiene le forme delle piccole aree (è conforme localmente) e permette una facile sovrapposizione di immagini bitmap.

Tuttavia, il sistema Web Mercator, pur essendo comodo per la visualizzazione di mappe su schermi piatti, introduce una distorsione significativa in termini di area e distanza, specialmente a latitudini più elevate. Questa distorsione è dovuta al fatto che proietta un modello 3D del mondo (un ellissoide) su una superficie 2D.

Continuando con il codice, la distanza calcolata viene recuperata dalla query e stampata a schermo.

Ovviamente, il tutto funziona se i parametri di connessione al database (`db_host`, `db_name`, `db_user`, `db_password`) sono popolati secondo la configurazione del tuo ambiente. La parte di connessione al database è possibile trasportarla in una classe ad ‘hoc’, ma per semplicità ho pensato di metterla nello stesso file.

Conclusioni

Spero di aver trattato l’argomento in modo esaustivo, ma se qualcuno volesse esporre una qualche perplessità o domanda non esitate a “postare” dei commenti o ad inviarmi un e-mail a webmaster@megalinux.cloud.

Sostenete The Megalinux: In un mare di siti web sovraccarichi di pubblicità invadente, The Megalinux si distingue come l’unico rifugio libero da annunci. Abbiamo scelto di offrirvi un’esperienza di navigazione pulita e ininterrotta, ma per fare ciò, abbiamo bisogno del vostro supporto. Considerate l’idea di contribuire alla nostra missione inviando Bitcoin al nostro indirizzo. Anche una piccola donazione può fare la differenza e ci aiuterà a mantenere il sito libero da pubblicità.

È davvero difficile immaginare che esista qualcuno che, indipendentemente dalle donazioni ricevute (che non ci sono), continui a scrivere in totale libertà, tutto ciò o quasi che trova interessante?

3LpoukFpvDHTZPn5qGbLwUzve3rX9zsSq6

Pagina Precedente

No votes yet.
Please wait...

Pagine: 1 2