Come usare PostGIS in ServBay: aggiungi funzionalità geospaziali a PostgreSQL
PostGIS
è una potente estensione per il database PostgreSQL che aggiunge il supporto a tipi di dati, funzioni e indici geospaziali. Ciò significa che puoi memorizzare nel database informazioni geografiche come punti, linee, poligoni e altro ancora, ed eseguire query e analisi spaziali avanzate. Per chi sviluppa applicazioni web con funzionalità di mappe, servizi di localizzazione o qualsiasi attività legata alla posizione geografica, PostGIS è uno strumento essenziale.
ServBay, ambiente di sviluppo locale progettato per macOS, integra già il pacchetto PostgreSQL e include l'estensione PostGIS di default. Questo semplifica notevolmente l'utilizzo di PostGIS in locale, evitando la necessità di compilare manualmente o installare dipendenze aggiuntive.
In questa guida ti mostreremo come abilitare e iniziare a utilizzare PostGIS nell'ambiente ServBay, così potrai aggiungere rapidamente funzionalità geospaziali ai tuoi progetti.
Prerequisiti
Prima di usare PostGIS, assicurati di aver completato questi passaggi:
- Installa e avvia ServBay: Verifica di aver installato correttamente ServBay su macOS.
- Abilita e avvia il pacchetto PostgreSQL: Nel pannello di controllo di ServBay, controlla che il pacchetto PostgreSQL sia attivato e in esecuzione. Se non lo è, seleziona PostgreSQL, spunta "Abilita" e avvialo.
- Accedi al database PostgreSQL: Sii in grado di collegarti al database PostgreSQL presente su ServBay tramite strumenti a riga di comando (
psql
) o interfacce grafiche (come TablePlus, pgAdmin). Di default puoi connetterti localmente conpsql -U postgres
.
Installazione e abilitazione dell'estensione PostGIS
ServBay include già i file dell’estensione PostGIS, quindi non è necessario alcun download aggiuntivo. Dovrai solo "abilitare" l’estensione nel database in cui vuoi usare le funzionalità PostGIS.
Ecco come fare:
Collegati al database PostgreSQL di destinazione: Apri il terminale e usa il comando
psql
per collegarti al database. Sostituisciyour_username
con il nome utente (ad esempiopostgres
) eyour_database
con il nome del database dove abilitare PostGIS.bashpsql -U your_username -d your_database
1Se vuoi abilitare PostGIS sull’utente e il database di default
postgres
, puoi semplicemente eseguire:bashpsql -U postgres
1Crea l’estensione PostGIS nel database: Dopo esserti connesso con successo, esegui nel prompt di
psql
il seguente comando SQL:sqlCREATE EXTENSION postgis;
1Questo installerà e configurerà tutti gli oggetti necessari dell’estensione PostGIS nel database corrente (nuovi tipi di dati, funzioni, operatori, ecc.).
Verifica che PostGIS sia stato installato correttamente: Nel prompt di
psql
, usa il comando\dx
per elencare le estensioni installate nel database.sql\dx
1Se PostGIS è stato abilitato con successo, vedrai la voce
postgis
con la relativa versione nell’elenco.List of installed extensions Name | Version | Schema | Description -----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions (2 rows)
1
2
3
4
5
6(Nota: Il numero della versione PostGIS può variare in base alla versione di ServBay)
A questo punto hai abilitato con successo l'estensione PostGIS nel database PostgreSQL selezionato e sei pronto a sfruttarne le funzionalità geospaziali.
Configurare i dati PostGIS
Una volta abilitato PostGIS, puoi creare nuove tabelle che includano dati geospaziali o aggiungere colonne geospaziali a tabelle esistenti. PostGIS fornisce due principali tipi di dati spaziali: geometry
e geography
. Il tipo geometry
è adatto a calcoli su sistemi di coordinate planari, mentre geography
è pensato per sistemi di coordinate sferiche (come la superficie terrestre), ideale per dati e query su latitudine e longitudine.
Creare una tabella con una colonna geospaziale
Vediamo ora come creare una tabella chiamata locations
con una colonna geospaziale per memorizzare posizioni puntiformi.
Crea la tabella: Nel prompt di
psql
o tramite interfaccia grafica del database, esegui:sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
: Definisce una colonnageom
di tipoGEOMETRY
, che conterrà punti.4326
è l’SRID (Spatial Reference Identifier) che rappresenta il sistema di coordinate WGS84, lo standard usato da GPS e molte mappe online (es: OpenStreetMap, Google Maps).- Puoi usare altri tipi geometrici (
LineString
,Polygon
,MultiPoint
, ecc.) e differenti SRID in base alle necessità.
Inserisci dati di esempio: Utilizza le funzioni integrate di PostGIS per popolare la tabella con dati geometrici, di solito tramite
ST_GeomFromText()
che accetta stringhe WKT (Well-Known Text).sqlINSERT INTO locations (name, geom) VALUES ('ServBay Headquarters', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- Esempio coordinate Pechino ('ServBay Shanghai Office', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- Esempio coordinate Shanghai
1
2
3Nota: Nell’ordine WKT,
POINT(longitudine latitudine)
.
Creare un indice geospaziale
Per tabelle con grandi quantità di dati geospaziali, è fondamentale creare indici spaziali per migliorare le prestazioni delle query, specialmente per ricerche spaziali, inclusioni e vicinanza. Il tipo di indice più usato in PostGIS è il GiST (Generalized Search Tree).
Crea l’indice GiST: Nel prompt di
psql
o dall’interfaccia grafica, esegui:sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1Questo comando crea un indice GiST sulla colonna
geom
della tabellalocations
. L’ottimizzatore di PostgreSQL sfrutterà automaticamente l’indice per velocizzare le query spaziali.
Eseguire query geospaziali con PostGIS
PostGIS offre centinaia di funzioni per l’elaborazione di dati geospaziali. Ecco alcune query utili per sviluppatori web:
Calcolare la distanza tra due punti
Calcola la distanza in linea retta tra due posizioni geografiche.
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- Punto A
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- Punto B
);
2
3
4
ST_Distance()
: Calcola la distanza tra due oggetti geometrici. Con tipogeometry
su SRID 4326, il risultato è espresso in gradi circa. Se vuoi una distanza esatta in metri, usa il tipogeography
oST_Distance(geography_a, geography_b, use_spheroid)
.
Verificare relazioni di contenimento
Controlla se un oggetto geometrico contiene un altro, ad esempio se un punto è dentro un certo poligono.
SELECT name FROM locations
WHERE ST_Contains(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326), -- Esempio rettangolo
geom
);
2
3
4
5
ST_Contains(geometry A, geometry B)
: Restituisce true se A contiene B completamente.
Cercare i punti più vicini
Cerca le località più vicine a un punto dato, sfruttando l’indice GiST per un esecuzione veloce.
SELECT name, ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) AS distance
FROM locations
ORDER BY geom <-> ST_GeomFromText('POINT(116.4074 39.9042)', 4326) -- Uso di <-> con l’indice GiST per l’ordinamento
LIMIT 5;
2
3
4
- L’operatore
<->
è pensato per ordinare in modo efficiente le geometrie per distanza rispetto a un dato punto, sfruttando l’indice spaziale.
Analisi geospaziale con PostGIS
Oltre a query base, PostGIS offre potenti strumenti di analisi, come la creazione di buffer, l’intersezione e l’unione di geometrie.
Analisi dei buffer
Crea una zona a distanza specificata attorno a un oggetto geometrico (tipicamente restituisce un poligono).
SELECT ST_Buffer(geom, 0.01) -- Crea un buffer di 0,01 gradi (circa 1,1 km)
FROM locations
WHERE name = 'ServBay Headquarters';
2
3
ST_Buffer(geometry, distance)
: Genera un buffer attorno all’oggetto dato. Sui tipigeometry
in coordinate geografiche, la distanza si esprime negli stessi valori, di solito gradi.
Analisi di intersezione
Trova la parte sovrapposta fra due o più oggetti geometrici, restituendo una nuova geometria.
SELECT ST_Intersection(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
geom
)
FROM locations
WHERE name = 'ServBay Headquarters';
2
3
4
5
6
ST_Intersection(geometry A, geometry B)
: Restituisce l’intersezione fra A e B come nuova geometria.
Analisi di unione
Unisci più oggetti geometrici in un'unica geometria (potenzialmente multiparte).
SELECT ST_Union(geom)
FROM locations;
2
ST_Union(geometry set)
: Unisce tutte le geometrie dell’insieme fornito.
Visualizzare dati geospaziali
Visualizzare i dati geospaziali archiviati in PostGIS è fondamentale nello sviluppo web. Puoi usare software GIS desktop o librerie web dedicate alle mappe.
Con un software GIS desktop (come QGIS)
QGIS è un popolare software GIS open source, capace di collegarsi direttamente a un database PostGIS e visualizzare i dati.
Collega QGIS al database PostgreSQL su ServBay:
- Avvia QGIS.
- Dal menu, scegli
Layer
>Add Layer
>Add PostGIS Layers...
. - Nella finestra che si apre, clicca su
New
per creare una nuova connessione. - Inserisci i dettagli:
- Name: Dai un nome alla connessione, ad esempio
ServBay PostGIS
. - Host:
localhost
oppure127.0.0.1
. - Port: Porta di default di PostgreSQL,
5432
(anche per ServBay). - Database: Nome del database in cui hai abilitato PostGIS.
- Username: Il tuo nome utente (es:
postgres
). - Password: La password del database (se impostata).
- Name: Dai un nome alla connessione, ad esempio
- Clicca su
Test Connection
per verificare la connessione. - Premi
OK
per salvare, poi nella finestra principale clicca suConnect
.
Carica i dati geospaziali:
- Dopo la connessione vedrai tutte le tabelle del database.
- Seleziona la tabella che contiene la colonna spaziale (
locations
nell’esempio). QGIS la riconoscerà automaticamente. - Scegli la tabella che vuoi visualizzare, clicca su
Add
, poi suClose
. I dati appariranno nella vista mappa di QGIS.
Con librerie di mappe web (come Leaflet)
Nel front-end puoi usare JS libraries come Leaflet, OpenLayers o Mapbox GL JS per visualizzare dati provenienti da PostGIS via back-end. Ecco un esempio base di Leaflet: salva il file HTML sotto la directory webroot di ServBay (predefinita: /Applications/ServBay/www
), ad esempio in /Applications/ServBay/www/postgis-map/index.html
, e visita il sito locale (come postgis-map.servbay.demo
).
<!DOCTYPE html>
<html>
<head>
<title>Esempio ServBay PostGIS con Leaflet</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 400px; width: 100%; } /* Imposta dimensioni della mappa */
</style>
</head>
<body>
<h1>Esempio di visualizzazione dati PostGIS (Leaflet)</h1>
<div id="map"></div>
<script>
// Inizializza la mappa, centro e livello zoom
// Centro di esempio: Pechino
var map = L.map('map').setView([39.9042, 116.4074], 10);
// Aggiungi livello OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// Esempio: aggiungi marker manualmente (nella pratica sarà dinamico da PostGIS)
// Il punto corrisponde al dato di esempio 'ServBay Headquarters' sopra inserito
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>ServBay Headquarters</b><br>Esempio di posizione')
.openPopup();
// In un progetto reale, richiedi i dati geospaziali via Ajax dal backend (es. formato GeoJSON)
// Poi usa L.geoJSON() di Leaflet per visualizzarli.
/*
fetch('/api/locations') // Presumendo un endpoint /api/locations che restituisce GeoJSON
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
*/
</script>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Questo è solo l’utilizzo di base di Leaflet. Per caricare i dati da PostGIS, dovrai sviluppare un backend (con PHP, Node.js, Python ecc., tutti supportati in ServBay) che interroga il database, restituisce i dati in formato GeoJSON e li espone tramite un endpoint HTTP per il front-end.
Domande frequenti (FAQ)
D: Ottengo un errore eseguendo
CREATE EXTENSION postgis;
, cosa posso fare?- R: Innanzitutto verifica di esserti connesso correttamente al database e che l’utente abbia i permessi per creare estensioni (l’utente
postgres
di solito li possiede). Controlla inoltre che il pacchetto PostgreSQL sia in esecuzione su ServBay. Se persiste il problema, consultare i log di ServBay e PostgreSQL può aiutare a trovare la causa.
- R: Innanzitutto verifica di esserti connesso correttamente al database e che l’utente abbia i permessi per creare estensioni (l’utente
D: Cos’è SRID 4326? Posso usare un altro SRID?
- R: SRID (Spatial Reference Identifier) è un codice numerico che identifica un sistema di coordinate. Il 4326 si riferisce al sistema geografico WGS84, lo standard più usato per le mappe web. Sì, puoi usare altri SRID, ad esempio il sistema proiettato Web Mercator (SRID 3857). Scegli l’SRID adatto in base alla provenienza dei tuoi dati e alle esigenze dell’applicazione: per latitudine-longitudine e mappe web, 4326 o 3857 sono opzioni comuni.
D: Qual è la differenza tra i tipi
geometry
egeography
?- R: Il tipo
geometry
gestisce dati su un piano cartesiano, con distanze e aree calcolate secondo la geometria euclidea. Il tipogeography
, invece, lavora su quelle geodetiche (come la superficie terrestre), considerando la curvatura della Terra: le misure sono quindi più accurate su vaste aree. Se lavori su piccole aree o la precisione della curvatura non è cruciale,geometry
è più semplice e performante. Se invece ti servono calcoli globali precisi, usageography
.
- R: Il tipo
Conclusione
PostGIS arricchisce PostgreSQL con potenti capacità di gestione dei dati geospaziali, ed è la base per lo sviluppo di applicazioni basate sulla localizzazione. Grazie a ServBay, puoi facilmente abilitare e utilizzare PostGIS in ambiente locale su macOS, evitando complicate installazioni e configurazioni.
In questa guida abbiamo visto come attivare PostGIS in ServBay, gestire dati geospaziali, eseguire query e analisi spaziali comuni e introdotto alcuni metodi di visualizzazione. Con queste basi puoi iniziare a sviluppare web app geospaziali avanzate su ServBay. Esplorando la documentazione PostGIS, scoprirai moltissime altre funzioni potenti da integrare nei tuoi progetti.