Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Gestione dei dati spaziali con estensione PostGIS
PostGIS è un'estensione di PostgreSQL per l'archiviazione e la gestione delle informazioni spaziali. Per ulteriori informazioni su PostGIS, consulta PostGIS.net
A partire dalla versione 10.5, PostgreSQL supporta la libreria libprotobuf 1.3.0 utilizzata da PostGIS per lavorare con i dati delle tile vettoriali delle mappe.
La configurazione dell'estensione PostGIS richiede i privilegi rds_superuser
. Ti consigliamo di creare un utente (ruolo) per gestire l'estensione PostGIS e i dati spaziali. L'estensione PostGIS e i relativi componenti aggiungono migliaia di funzioni a PostgreSQL. Considera la possibilità di creare l'estensione PostGIS nel proprio schema se ciò ha senso per il tuo caso d'uso. Nell'esempio seguente viene illustrato come installare l'estensione nel proprio database, ma questa operazione non è necessaria.
Argomenti
- Passaggio 1: Creazione di un utente (ruolo) per gestire l'estensione PostGIS
- Passaggio 2: Caricamento delle estensioni di PostGIS
- Passaggio 3: Trasferimento della proprietà delle estensioni
- Fase 4: Trasferimento della proprietà degli oggetti PostGIS
- Passaggio 5: Verificare le estensioni
- Passaggio 6: Aggiornamento dell'estensione PostGIS
- Versioni dell’estensione PostGIS
- Aggiornamento di PostGIS 2 a PostGIS 3
Passaggio 1: Creazione di un utente (ruolo) per gestire l'estensione PostGIS
Per prima cosa, esegui la connessione a un'istanza database RDS per PostgreSQL come utente con i privilegi rds_superuser
. Se hai mantenuto il nome di default durante la configurazione dell'istanza, esegui la connessione come postgres
.
psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres --password
Crea un ruolo separato (utente) per amministrare l'estensione PostGIS.
postgres=>
CREATE ROLE
gis_admin
LOGIN PASSWORD 'change_me
';CREATE ROLE
Concedi a questo ruolo i privilegi rds_superuser
per consentire l'installazione dell'estensione.
postgres=>
GRANT rds_superuser TO
gis_admin
;GRANT
Crea un database da utilizzare per gli artefatti PostGIS. Questa fase è facoltativa. In alternativa, puoi creare uno schema nel database utente per le estensioni PostGIS, ma anche questa operazione non è necessaria.
postgres=>
CREATE DATABASE
lab_gis
;CREATE DATABASE
Concedi a gis_admin
tutti i privilegi per il database lab_gis
.
postgres=>
GRANT ALL PRIVILEGES ON DATABASE lab_gis TO gis_admin;
GRANT
Esci dalla sessione ed esegui nuovamente la connessione all'istanza database RDS per PostgreSQL come gis_admin
.
postgres=>
psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=gis_admin
--password --dbname=lab_gis
Password for user gis_admin:...
lab_gis=>
Continua a configurare l'estensione come descritto nei passaggi successivi.
Passaggio 2: Caricamento delle estensioni di PostGIS
L'estensione PostGIS include diverse estensioni correlate che interagiscono per fornire funzionalità geospaziali. A seconda del caso d'uso, è possibile che le estensioni create in questo passaggio non siano tutte necessarie.
Utilizzare CREATE EXTENSION
le istruzioni per caricare le estensioni PostGIS.
CREATE EXTENSION postgis;
CREATE EXTENSION
CREATE EXTENSION postgis_raster;
CREATE EXTENSION
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION
CREATE EXTENSION postgis_topology;
CREATE EXTENSION
CREATE EXTENSION address_standardizer_data_us;
CREATE EXTENSION
È possibile verificare i risultati eseguendo la query SQL mostrata nel seguente esempio, che elenca le estensioni e i relativi proprietari.
SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ORDER BY 1;
List of schemas Name | Owner --------------+----------- public | postgres tiger | rdsadmin tiger_data | rdsadmin topology | rdsadmin (4 rows)
Passaggio 3: Trasferimento della proprietà delle estensioni
Usare le istruzioni ALTER SCHEMA per trasferire la proprietà degli schemi al ruolo gis_admin
.
ALTER SCHEMA tiger OWNER TO gis_admin;
ALTER SCHEMA
ALTER SCHEMA tiger_data OWNER TO gis_admin;
ALTER SCHEMA
ALTER SCHEMA topology OWNER TO gis_admin;
ALTER SCHEMA
È possibile confermare la modifica della proprietà eseguendo la seguente query SQL. Oppure è possibile utilizzare il meta-comando \dn
dalla riga di comando psql.
SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ORDER BY 1;
List of schemas Name | Owner --------------+--------------- public | postgres tiger | gis_admin tiger_data | gis_admin topology | gis_admin (4 rows)
Fase 4: Trasferimento della proprietà degli oggetti PostGIS
Usare la funzione seguente per trasferire la proprietà degli oggetti PostGIS al ruolo gis_admin
. Eseguire la seguente istruzione dal prompt di psql per creare la funzione.
CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;
CREATE FUNCTION
Successivamente, eseguire la seguente query per eseguire la funzione exec
che a sua volta esegue le istruzioni e altera le autorizzazioni.
SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO gis_admin;') FROM ( SELECT nspname, relname FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid) WHERE nspname in ('tiger','topology') AND relkind IN ('r','S','v') ORDER BY relkind = 'S') s;
Passaggio 5: Verificare le estensioni
Per evitare di dover specificare il nome dello schema, aggiungi lo schema tiger
al percorso di ricerca usando il seguente comando.
SET search_path=public,tiger;
SET
Verifica lo schema tiger
usando la seguente istruzione SELECT.
SELECT address, streetname, streettypeabbrev, zip FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;
address | streetname | streettypeabbrev | zip ---------+------------+------------------+------- 1 | Devonshire | Pl | 02109 (1 row)
Per ulteriori informazioni su questa estensione, consulta Tiger Geocoder
Verifica lo schema topology
usando la seguente istruzione SELECT
. Questa richiama la funzione createtopology
per registrare un nuovo oggetto topologia (my_new_topo) con l'identificatore di riferimento spaziale specificato (26986) e la tolleranza predefinita (0,5). Per saperne di più, consulta la CreateTopology
SELECT topology.createtopology('my_new_topo',26986,0.5);
createtopology ---------------- 1 (1 row)
Passaggio 6: Aggiornamento dell'estensione PostGIS
Ogni nuova versione di PostgreSQL supporta una o più versioni dell'estensione PostGIS compatibili con tale versione. L'aggiornamento del motore PostgreSQL a una nuova versione non aggiorna automaticamente l'estensione PostGIS. Prima di aggiornare il motore PostgreSQL, in genere si aggiorna PostGIS alla versione più recente disponibile per la versione di PostgreSQL corrente. Per informazioni dettagliate, vedi Versioni dell’estensione PostGIS.
Dopo l'aggiornamento del motore PostgreSQL, si aggiorna nuovamente l'estensione PostGIS alla versione supportata per la versione del motore PostgreSQL aggiornata. Per ulteriori informazioni sull'aggiornamento del motore PostgreSQL, consulta Test di un aggiornamento del cluster database di produzione a una nuova versione principale.
Puoi verificare la disponibilità di aggiornamenti della versione dell'estensione PostGIS sul cluster database Aurora PostgreSQL in qualsiasi momento. Per farlo, esegui il comando seguente. Questa funzione è disponibile con PostGIS 2.5.0 e versioni successive.
SELECT postGIS_extensions_upgrade();
Se l'applicazione non supporta la versione più recente di PostGIS, puoi installare una versione precedente di PostGIS disponibile nella versione principale, come indicato di seguito.
CREATE EXTENSION postgis VERSION "2.5.5";
Se desideri eseguire l'aggiornamento a una versione PostGIS specifica da una versione precedente, puoi anche utilizzare il seguente comando.
ALTER EXTENSION postgis UPDATE TO "2.5.5";
A seconda della versione da cui si esegue l'aggiornamento, potrebbe essere necessario utilizzare nuovamente questa funzione. Il risultato della prima esecuzione della funzione determina se è necessaria una funzione di aggiornamento aggiuntiva. Ad esempio, questo si verifica per l'aggiornamento da PostGIS 2 a PostGIS 3. Per ulteriori informazioni, consulta Aggiornamento di PostGIS 2 a PostGIS 3.
Se l'estensione è stata aggiornata in preparazione a un aggiornamento della versione principale del motore PostgreSQL, puoi continuare con altre attività preliminari. Per ulteriori informazioni, consulta Test di un aggiornamento del cluster database di produzione a una nuova versione principale.
Versioni dell’estensione PostGIS
Ti consigliamo di installare le versioni di tutte le estensioni, ad esempio PostGIS, come elencato in Versioni delle estensioni per Aurora edizione compatibile con PostgreSQL nelle Note di rilascio di Aurora PostgreSQL. Per ottenere un elenco delle versioni disponibili nella versione, utilizza il comando seguente.
SELECT * FROM pg_available_extension_versions WHERE name='postgis';
Puoi trovare le informazioni sulle versioni nelle sezioni seguenti delle Note di rilascio di Aurora PostgreSQL:
-
Versioni delle estensioni per Aurora edizione compatibile con PostgreSQL 13
-
Versioni delle estensioni per Aurora edizione compatibile con PostgreSQL 12
-
Versioni delle estensioni per Aurora edizione compatibile con PostgreSQL 11
-
Versioni delle estensioni per Aurora edizione compatibile con PostgreSQL 10
-
Versioni delle estensioni per Aurora edizione compatibile con PostgreSQL 9.6
Aggiornamento di PostGIS 2 a PostGIS 3
A partire dalla versione 3.0, la funzionalità raster di PostGIS è ora un'estensione separata, postgis_raster
. Questa estensione dispone di un proprio percorso di installazione e aggiornamento. Ciò rimuove dall'estensione postgis
core dozzine di funzioni, tipi di dati e altri artefatti necessari per l'elaborazione di immagini raster. Ciò significa che se il caso d'uso non richiede l'elaborazione raster, non è necessario installare l'estensione postgis_raster
.
Nel seguente esempio di aggiornamento, il primo comando di aggiornamento estrae la funzionalità raster nell'estensione postgis_raster
. È quindi necessario un secondo comando di aggiornamento per eseguire l'aggiornamento di postgres_raster
alla nuova versione.
Per eseguire l'aggiornamento da PostGIS 2 a PostGIS 3
Identifica la versione predefinita di PostGIS disponibile per la versione PostgreSQL sul cluster database Aurora PostgreSQL. A questo scopo, esegui la query seguente.
SELECT * FROM pg_available_extensions WHERE default_version > installed_version;
name | default_version | installed_version | comment ---------+-----------------+-------------------+------------------------------------------------------------ postgis | 3.1.4 | 2.3.7 | PostGIS geometry and geography spatial types and functions (1 row)
Identifica le versioni di PostGIS installate in ogni database sull'istanza di scrittura del cluster database Aurora PostgreSQL. In altre parole, esegui la query su ogni database utente come riportato di seguito.
SELECT e.extname AS "Name", e.extversion AS "Version", n.nspname AS "Schema", c.description AS "Description" FROM pg_catalog.pg_extension e LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass WHERE e.extname LIKE '%postgis%' ORDER BY 1;
Name | Version | Schema | Description ---------+---------+--------+--------------------------------------------------------------------- postgis | 2.3.7 | public | PostGIS geometry, geography, and raster spatial types and functions (1 row)
Questa discrepanza tra la versione predefinita (PostGIS 3.1.4) e la versione installata (PostGIS 2.3.7) indica che è necessario aggiornare l'estensione PostGIS.
ALTER EXTENSION postgis UPDATE;
ALTER EXTENSION WARNING: unpackaging raster WARNING: PostGIS Raster functionality has been unpackaged
Esegui la seguente query per verificare che la funzionalità raster sia ora contenuta nel proprio pacchetto.
SELECT probin, count(*) FROM pg_proc WHERE probin LIKE '%postgis%' GROUP BY probin;
probin | count --------------------------+------- $libdir/rtpostgis-2.3 | 107 $libdir/postgis-3 | 487 (2 rows)
L'output mostra che c'è ancora una differenza tra le versioni. Le funzioni PostGIS sono versione 3 (postgis-3), mentre le funzioni raster (rtpostgis) sono versione 2 (rtpostgis-2.3). Per completare l'aggiornamento, esegui nuovamente il comando di aggiornamento, come riportato di seguito.
postgres=>
SELECT postgis_extensions_upgrade();Puoi ignorare i messaggi di avviso in sicurezza. Esegui nuovamente la seguente query per verificare che l'aggiornamento sia stato completato. L'aggiornamento è completato quando PostGIS e tutte le estensioni correlate non sono contrassegnate come necessarie di aggiornamento.
SELECT postgis_full_version();
Utilizza la seguente query per visualizzare il processo di aggiornamento completato e le estensioni impacchettate separatamente e verifica che le relative versioni corrispondano.
SELECT e.extname AS "Name", e.extversion AS "Version", n.nspname AS "Schema", c.description AS "Description" FROM pg_catalog.pg_extension e LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass WHERE e.extname LIKE '%postgis%' ORDER BY 1;
Name | Version | Schema | Description ----------------+---------+--------+--------------------------------------------------------------------- postgis | 3.1.5 | public | PostGIS geometry, geography, and raster spatial types and functions postgis_raster | 3.1.5 | public | PostGIS raster types and functions (2 rows)
L'output mostra che l'estensione PostGIS 2 è stata aggiornata a PostGIS 3 e che
postgis
e l'estensionepostgis_raster
ora separata sono entrambe versione 3.1.5.
Al termine dell'aggiornamento, se non prevedi di utilizzare la funzionalità raster, puoi rimuovere l'estensione come segue.
DROP EXTENSION postgis_raster;