User Tools

Site Tools


tecnica:gps_cartografia_gis:postgis

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tecnica:gps_cartografia_gis:postgis [2015/11/26 09:48] – [Creazione di un template_gis] niccolotecnica:gps_cartografia_gis:postgis [2017/11/15 16:02] (current) – [Migrazione da PostgreSQL 9.4/PostGIS 2.1] niccolo
Line 1: Line 1:
-====== PostGIS ======+====== PostGIS su Debian ====== 
 + 
 +===== PostGIS 2.3 ===== 
 + 
 +Distribuzione di riferimento: **Debian GNU/Linux** Stretch con **PostgreSQL 9.6** e **PostGIS 2.3.1**. 
 + 
 +Pacchetti installati: 
 + 
 +  * **postgresql-9.6** 
 +  * **postgresql-9.6-postgis-2.3** 
 +  * **postgresql-9.6-postgis-2.3-scripts** 
 +  * **postgresql-contrib-9.6** 
 +  * **postgresql-client-9.6** 
 + 
 +==== Creazione di un database geografico ==== 
 + 
 +È necessario collegarsi al database con i privilegi di database administrator: 
 + 
 +<code> 
 +# su - postgres 
 +> psql 
 +postgres=# 
 +</code> 
 + 
 +quindi si crea un **utente** e un **database** su cui l'utente ha pieni poteri. Dopo essersi connessi al database si crea al suo interno le estensioni **PostGIS**: 
 + 
 +<code> 
 +CREATE USER "strade" PASSWORD 'MySecret'; 
 +CREATE DATABASE strade OWNER strade 
 +    TEMPLATE template0 LC_COLLATE = 'it_IT.UTF-8' LC_CTYPE = 'it_IT.UTF-8' 
 +    ENCODING 'UTF8'; 
 +\connect strade 
 +CREATE EXTENSION postgis; 
 +</code> 
 + 
 +A differenza delle vecchie versioni di PostGIS (es. la 1.3), non c'è da impazzire con i permessi da assegnare alle tabelle speciali. La **''spatial_ref_sys''** (che contiene le definizioni dei sistemi di riferimento) va bene che sia in sola lettura, la **''geometry_columns''** e la **''geography_columns''** sono adesso delle semplici VIEW. 
 +==== Migrazione da PostgreSQL 9.4/PostGIS 2.1 ==== 
 + 
 +La **migrazione** di un database dalla vecchia versione **postgresql-9.4-postgis-2.1** alla nuova **postgresql-9.6-postgis-2.3** è relativamente semplice, il tutto si risolve nell'esecuzione di **pg_dump** sulla vecchia versione e **pg_restore** sulla nuova. 
 + 
 +Nelle versioni precedenti di PostGIS (es. la 1.3) c'era da impazzire con gli **oggetti creati dall'estensione PostGIS**; in pratica le funzioni, gli operatori, i tipi dati, ecc. venivano regolarmente salvati nel dump, ma al momento del restore **bisognava escluderli** perché altrimenti andavano in conflitto con gli analoghi già presenti nel nuovo database, in cui era stata creata l'estensione del nuovo PostGIS. 
 + 
 +Con la versione 2.x di PostGIS il dump conterrà solo i dati utente e il restore è molto semplificato. Sulla vecchia installazione si esegue il **dump** del database: 
 + 
 +<code> 
 +su - postgres 
 +pg_dump -Fc strade > strade.dump 
 +</code> 
 + 
 +Sulla nuova installazione si esegue il **restore** a nome dell'utente proprietario del nuovo database (utente non privilegiato). Nel nostro esempio il vecchio database e il nuovo coesistono sullo stesso host, la nuova istanza quindi gira sulla porta **5433/TCP**: 
 + 
 +<code> 
 +pg_restore --port 5433 -U strade -W -h 127.0.0.1 -d strade strade.dump 
 +</code> 
 + 
 +Poiché l'estensione PostGIS è stata attivata dal database administrator, il restore effettuato come utente non privilegiato genera degli errori: 
 + 
 +<code> 
 +pg_restore: [archiver (db)] Error from TOC entry 3407; 0 0 COMMENT EXTENSION plpgsql  
 +pg_restore: [archiver (db)] Error from TOC entry 3408; 0 0 COMMENT EXTENSION postgis  
 +pg_restore: [archiver (db)] Error from TOC entry 3199; 0 88843 TABLE DATA spatial_ref_sys postgres 
 +</code> 
 + 
 +sono errori che possono essere ignorati, poiché le estensioni 'plpgsql' e 'postgis' e la tabella ''spatial_ref_sys'' non devono essere in realtà recuperati dal vecchio dump. 
 +===== PostGIS 1.3 =====
  
 Distribuzione di riferimento: **Debian GNU/Linux** Lenny con **PostgreSQL 8.3** e **PostGIS 1.3.3**. Distribuzione di riferimento: **Debian GNU/Linux** Lenny con **PostgreSQL 8.3** e **PostGIS 1.3.3**.
Line 27: Line 91:
   * [[http://www.postgresql.org/docs/current/static/index.html|Manuale PostgreSQL]]   * [[http://www.postgresql.org/docs/current/static/index.html|Manuale PostgreSQL]]
  
-===== Creazione di un template_gis =====+===== Creazione di un database geografico e di un template_gis =====
  
-Queste le istruzioni per **PostgreSQL 8.4 e PostGIS 1.5** su una Debian Squeeze. Dal prompt dei comandi SQL, come utente //postgres// (amministratore del database):+Queste le istruzioni per **PostgreSQL 8.4** **PostGIS 1.5** su una Debian Squeeze. Dal prompt dei comandi SQL, come utente //postgres// (amministratore del database):
  
 <code> <code>
Line 65: Line 129:
 UPDATE pg_database SET datistemplate='t' WHERE datname = 'template_gis'; UPDATE pg_database SET datistemplate='t' WHERE datname = 'template_gis';
 </code> </code>
 +
 +Con **PostgreSQL 9.4** e **PostGIS 2.1** (Debian Jessie) diventa tutto più semplice, al punto che creare un template_gis è sostanzialmente inutile perchè per abilitare spazialmente un database è sufficiente il comando ''CREATE EXTENSION'':
 +
 +<code sql>
 +CREATE DATABASE strade OWNER strade TEMPLATE template0 
 +    LC_COLLATE = 'it_IT.UTF-8' LC_CTYPE = 'it_IT.UTF-8';
 +\connect strade
 +CREATE EXTENSION postgis;
 +</code>
 +
 +La tabella **''spatial_ref_sys''** viene creata come in precedenza, mentre la **''geometry_columns''** e la **''geography_columns''** sono adesso delle semplici VIEW.
 +
 +Se si intende effettuare il restore di vecchi dump, potrebbe essere necessario creare i nomi di alcune funzioni ormai obsolete. Ad esempio il restore di questa tabella fallisce
 +
 +<code sql>
 +CREATE TABLE luoghi (
 +    id integer NOT NULL,
 +    wpt geometry,
 +    CONSTRAINT enforce_dims_wpt CHECK ((ndims(wpt) = 2))
 +);
 +</code>
 +
 +perché la funzione **''ndims()''** non esiste più, essendo stata sostituita **''ST_ndims()''**. In questo caso si può definire le funzioni //legacy// eseguendo l'apposito script:
 +
 +<code>
 +\connect strade
 +\i /usr/share/postgresql/9.4/contrib/postgis-2.1/legacy.sql
 +</code>
 +
 +Esiste anche lo script **''uninstall_legacy.sql''**, ma per poterlo eseguire con successo si deve ovviamente aggiornare tutte le occorrenze degli oggetti legacy.
 ==== Creazione del linguaggio ==== ==== Creazione del linguaggio ====
  
tecnica/gps_cartografia_gis/postgis.1448531284.txt.gz · Last modified: 2015/11/26 09:48 by niccolo