Con PostGIS, è possibile memorizzare, gestire e interrogare dati spaziali complessi direttamente all’interno del database, consentendo di sfruttare appieno le potenzialità dell’analisi spaziale e della visualizzazione geografica. L’integrazione di funzioni geospaziali avanzate all’interno del potente e affidabile motore di PostgreSQL offre un’ampia gamma di possibilità per lo sviluppo di applicazioni che richiedono la gestione e l’elaborazione di dati spaziali.
PostGIS fornisce un’ampia gamma di funzioni spaziali e geografiche per eseguire operazioni di interrogazione, analisi e manipolazione sui dati. Ciò include il calcolo delle distanze e delle aree, l’intersezione e l’unione di oggetti spaziali, l’estrazione di dati spaziali da immagini raster e molto altro ancora. Queste funzioni consentono di effettuare query complesse e ottenere risultati accurati.
In questo articolo utilizzerò la funzione ST_DISTANCE. Quest’ultima restituisce la distanza geometrica tra i punti di riferimento degli oggetti spaziali. Se si desidera calcolare la distanza considerando un sistema di riferimento geografico, è necessario proiettare le geometrie utilizzando la funzione
ST_Transform
in combinazione con la specifica di un SRID (Spatial Reference System Identifier).
Ma che cosa significa SRID? A cosa fa riferimento tale acronimo?
Lo SRID è indispensabile per garantire che tutte le operazioni di dati spaziali siano eseguite in un contesto coerente. Ad esempio, senza conoscere il corretto SRID per un set di dati, potresti avere problemi con la sovrapposizione, la misurazione e altre funzioni che richiedono un accurato riferimento spaziale.
Gli SRID sono definiti da vari enti standard, come l’European Petroleum Survey Group (EPSG), l’International Association of Oil & Gas Producers (IOGP), e altri. Ogni SRID rappresenta un particolare sistema di coordinate, un’ellissoide, un datum e una proiezione, insieme ad altre informazioni relative al riferimento spaziale. Ad esempio, lo SRID 4326 è comunemente utilizzato per rappresentare le coordinate GPS standard (WGS84).
Tornando alla funzione ST_DISTANCE, questa, può essere utilizzata in combinazione con altre funzioni spaziali di PostGIS per effettuare analisi e interrogazioni più complesse.
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