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
Last revisionBoth sides next revision
tecnica:gps_cartografia_gis:postgis [2012/11/15 21:25] – [Creazione di un template_gis] niccolotecnica:gps_cartografia_gis:postgis [2017/11/15 15:48] – [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> 
 +===== 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 81:
   * [[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 40: Line 94:
 </code> </code>
  
-Con PostgreSQL 9.1 di su Debian Wheezy c'è qualche differenza:+Con **PostgreSQL 9.1** di su Debian Wheezy c'è qualche differenza:
  
 <code> <code>
 CREATE DATABASE template_gis TEMPLATE template0 LC_COLLATE = 'it_IT.UTF-8' LC_CTYPE = 'it_IT.UTF-8'; CREATE DATABASE template_gis TEMPLATE template0 LC_COLLATE = 'it_IT.UTF-8' LC_CTYPE = 'it_IT.UTF-8';
 \connect template_gis \connect template_gis
-\i /usr/share/postgresql/9.1/contrib/postgis-1.5/postgis.sql%%+\i /usr/share/postgresql/9.1/contrib/postgis-1.5/postgis.sql
 \i /usr/share/postgresql/9.1/contrib/postgis-1.5/spatial_ref_sys.sql \i /usr/share/postgresql/9.1/contrib/postgis-1.5/spatial_ref_sys.sql
 UPDATE pg_database SET datistemplate='t' WHERE datname = 'template_gis'; UPDATE pg_database SET datistemplate='t' WHERE datname = 'template_gis';
Line 65: Line 119:
 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.txt · Last modified: 2017/11/15 16:02 by niccolo