Use the left/right arrow keys to navigate, 's' to enable/disable scrolling.

Introduzione ai GIS Liberi


Geoprocessing vettoriale con PostGIS

Indice


Presentazione di PostGIS

Installazione e configurazione

Tool di gestione dati

PostGIS short reference

PostGIS e QuantumGIS

PostGIS


PostGIS aggiunge il supporto a oggetti geografici al database relazionale PostgreSQL, permettendo di utilizzare PostgreSQL come backend dati nei sistemi GIS che lo supportano


PostGIS segue lo standard OGC Simple Features Specifications for SQL, ed è certificato come aderente alle specifiche Types and Functions


PostGIS è stato sviluppato dalla “Refractions Research” ed è software libero, rilasciato in licenza GPL

Installazione di PostGIS (1/3)


Debian fornisce nei suoi repository il pacchetto binario di PostGIS


L’installazione base del programma si ottiene lanciando, con privilegi di amministratore, il comando:


apt-get install postgis

Installazione di PostGIS (2/3)


A questo punto è necessaria un po’ di post-configurazione:


  • Creare un utente in PostgreSQL (qualora non ne sia presente già alcuno)
  • Creare un database che rappresenterà il template per i DB Geo-enabled
  • Creare il linguaggio procedurale plpgsql (se non esiste)
  • Caricare nel template alcuni dati necessari

createdb geotemplate 
createlang plpgsql geotemplate
psql -d geotemplate -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql
psql -d geotemplate -f /usr/share/postgresql-8.3-postgis/spatial_ref_sys.sql

Installazione di PostGIS (3/3)


Per verificare che tutto funzioni:


psql -U root -W -geotemplate -c  "SELECT postgis_geos_version()"

Per creare un database geospaziale, è sufficiente digitare i seguenti comandi in psql:


CREATE DATABASE provagis TEMPLATE = geotemplate;

Presentazione di PostGIS


PostGIS implementa le estensioni spaziali attraverso una libreria (in C) che estende il linguaggio procedurale PL/pgSQL. Attualmente fornisce le seguenti funzionalità:

  • Memorizzazione di dati vettoriali in formato testo e binario
  • Supporto a geometrie e geometrycollections
  • Supporto a geometrie EWKB/EWKT (3dm,3dz,4d) e SRID embedded
  • Supporto a funzionalità di analisi vettoriale
  • Indicizzazione delle colonne geometriche
  • Riproiezione al volo nei sistemi di riferimento supportati
  • Query miste spaziali/quantitative
  • Supporto alle tabelle geografiche standard OGC

Memorizzazione dei dati (1/2)


La specifica OpenGIS definisce due modalità standard per rappresentare gli oggetti geometrici:

  • WKT (Well-known Text)
  • WKB (Well-known Binary)

Entrambe le rappresentazioni includono informazioni relative a tipo dell’oggetto e coordinate

  • POINT (0 0)
  • LINESTRING (0 0,1 1,1 2)
  • POLYGON ((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
  • MULTIPOINT (0 0,1 2)

Memorizzazione dei dati (2/2)


Lo stesso standard prevede che il formato interno di memorizzazione debba mantenere anche cognizione del sistema di riferimento in cui sono espresse le coordinate


PostGIS offre le seguenti interfacce per la manipolazione di oggetti geografici:

  • bytea WKB = ST_asBinary(geometry);
  • text WKT = ST_asText(geometry);
  • geometry = ST_GeomFromWKB(bytea WKB, SRID);
  • geometry = St_GeometryFromText(text WKT, SRID);

PostGIS e gli standard OGC


La specifica “Simple Features Specification for SQL” OGC definisce:

  • tipi di oggetti GIS standard
  • funzioni per la loro manipolazione
  • un insieme di tabelle per mantenere metadati

In riferimento all’ultimo punto, lo standard e PostGIS implementano:

  • la tabella spatial_ref_sys, che contiene i sistemi di riferimento utilizzabili
  • la tabella geometry_columns, che memorizza la lista delle tabelle e delle colonne di tipo geografico

Tabelle geospaziali


La creazione di una tabella geospaziale deve essere effettuata in due step:


# TABELLA SENZA DATI GEOMETRICI
CREATE TABLE roads(
  id serial,
  name varchar (300)
)

# AGGIUNTA DI UNA COLONNA GEOMETRICA
SELECT AddGeometryColumn('public', 'roads', 'geom', 423, 'LINESTRING', 2);

Caricare dati in PostGIS


L’inserimento di dati in una tabella geospaziale può essere effettuata in due modi differenti:


  • mediante normali query di inserimento, utilizzando la funzione PostGIS ST_GeomFromText()
    
    INSERT INTO roads (road_id, roads_geom, road_name) VALUES (
      1,GeomFromText ('LINESTRING (191232 243118,191108 243242)',-1),'Jeff'
    ); 
    

  • utilizzando utility esterne (Es. shp2pgsql, ogr2ogr, QGIS SPIT)

L’utility shp2pgsql


L’utility shp2pgsql converte automaticamente file dal formato ESRI shp in listati SQL compatibili con PostGIS/PostgreSQL.


L’uso base del programma è il seguente:


 shp2pgsql shapefile schema.tabella > listato.sql
 psql -U utente -W -d database -f listato.sql

Segue la spiegazione delle opzioni d’utilizzo più comuni:


 -d   Cancella la tabella dal database prima di ricrearla e popolarla
 -a   Aggiunge i nuovi dati ad una tabella preesistente
 -c   Crea la tabella nel DB e la popola (comportamento di default)
 -p   Crea solo la tabella, senza aggiungere i dati
 -D   Utilizza il formato binario di dump di PostgreSQL
 -s   Imposta il SRID della tabella

Esportare dati da PostGIS


Anche l’esportazione dei dati prevede la doppia modalità:

  • attraverso una query SQL, PostGIS restituisce dati in WKT format:

  SELECT AsText(road_geom) AS geom, name FROM roads; 

  • attraverso utility di dumping esterne (pgsql2shp, funzione “Save as” di QGIS)

PostGIS reference


Segue una lista di tutte le principali funzioni di PostGIS


Funzioni standard OpenGIS:

  • Funzioni di gestione
  • Funzioni di calcolo delle relazioni tra geometrie
  • Funzioni di elaborazione delle geometrie (analisi e processing)
  • Funzioni di utilità
  • Funzioni per costruire le geometrie

Estensioni PostGIS:

  • Funzioni di misura
  • Funzioni di output
  • Funzioni di editing delle geometrie
  • Funzioni varie
  • Operatori tra geometrie

Funzioni di gestione


  • ST_AddGeometryColumn(schema, table, column, srid, type, dim): aggiunge una colonna geometrica ad una tabella esistente, e la registra nella tabella OGC geometry_columns

  • ST_DropGeometryColumn( schema, table, column): rimuove una colonna geometrica da una tabella spaziale, e la derergistra dalla tabella OGC geometry_columns

  • ST_Probe_Geometry_Columns(): effettua una scansione di tutte le tabelle spaziali del database e aggiunge le colonne geometriche trovate nella tabella OGC geometry_columns.

Relazioni tra geometrie (1/2)


  • ST_DWithin(geometry, geometry, float): restituisce TRUE se le geometrie si trovano entro la distanza specificata col terzo parametro

  • ST_Equals(geometry, geometry): restituisce TRUE se le due geometrie in argomento sono uguali (a differenza dell’operatore =, che funziona sul box circoscritto, ST_Equals calcola l’eguaglianza su tutti i punti)

  • ST_Disjoint(geometry, geometry): restituisce TRUE se le due geometrie sono disgiunte

Relazioni tra geometrie (2/2)


  • ST_Intersects(geometry, geometry): restituisce TRUE se le due geometrie in argomenrto si intersecano

  • ST_Touches(geometry, geometry): restituisce TRUE se le due geometrie in argomenrto si toccano in almeno un punto

  • ST_Within(geometry A, geometry B): restituisce TRUE se A è completamente contenuto in B

  • ST_Contains(geometry A, geometry B): restituisce TRUE se A contiene B

Funzioni di geoprocessing (1/3)


  • ST_Centroid(geometry): restituisce un punto che rappresenta il centroide (o baricentro) della geometria passata in argomento

  • ST_PointOnSurface(geometry): ritorna un punto casuale appartenente alla superficie della geometria passata in argomento

  • ST_Boundary(geometry): restituisce la geometria del perimetro (più correttamente i limiti combinatori, come definiti nella sezione 3.12.3.2 della specifica OGC) dell’argomento passato

Funzioni di geoprocessing (2/3)


  • ST_Buffer(geometry, double, [integer]): ritorna una geometria che rappresenta l’insieme dei punti per i quali la distanza dalla geometria passata nel primo argomento sia minore o uguale al secondo parametro. Il terzo parametro, opzionale, imposta il numero di segmenti usati per approssimare un quarto di circonferenza (di default 8)

  • ST_ConvexHull(geometry): ritorna la copertura convessa (la geometria minima chiusa e convessa che ricopre interamente una data figura) della geometria in argomento

  • ST_Intersection(geometry, geometry): ritorna una geometria data dall’insieme dei punti di A (primo argomento) e B (secondo argomento)

Funzioni di geoprocessing (3/3)


  • ST_SymDifference(geometry A, geometry B): calcola la differenza simmetrica tra le due geometrie in argomento, cioè il luogo dei punti di A e B che non si intersecano (ST_Difference(A,B)=ST_Difference(B,A))

  • ST_Difference(geometry A, geometry B): calcola la differenta tra le due geometrie in argomento (il luogo dei punti di A che non intersecano B)

  • ST_Union(geometry A, geometry B): restituisce una geometria data dall’insieme dei punti di A e di B

  • ST_Union(geometry set): restituisce una geometria data dall’unione di tutti i punti di tutte le geometrie dell’insieme (geometry set) passato in argomento

Funzioni di misura (1/2)


  • ST_Area(geometry): restituisce l’area della geometria passata, nel sistema di riferimento spaziale associato

  • ST_Length(geometry): restituisce la lunghezza della geometria passata, nel sistema di riferimento spaziale associato

  • ST_Distance(geometry, geometry): restituisce la distanza cartesiana tra due geometrie, nell’unità di misura della proiezione in uso

Funzioni di misura (2/2)


  • ST_max_distance(linestring,linestring): restituisce la distanza massima tra due geometrie

  • ST_perimeter(geometry): calcola il perimetro 2D di una geometria, se si tratta di un POLYGON o di un MULTI-POLYGON

  • ST_azimuth(geometry, geometry): ritorna l’azimuth del segmento definito tra i due punti passati in argomento, o NULL se gli stessi sono coincidenti (il valore di ritorno è espresso in radianti)

Funzioni di output


  • ST_AsBinary(geometry,{‘NDR’|’XDR’}): ritorna una geometria nel formato WKB

  • ST_AsSVG(geometry, [rel], [precision]): ritorna la geometria in SVG

  • ST_AsGML([version], geometry, [precision]): restituisce una geometria nel formato GML

  • ST_AsKML([version], geometry, [precision]): restituisce una geometria in formato KML

Funzioni di editing


  • ST_Transform(geometry,integer): riproietta una geometria in un SRID supportato

  • ST_Affine([—]): applica una trasformazione affine

  • ST_Translate([—]): trasla una geometrie

  • ST_Simplify(geometry, tolerance): semplifica una geometria con l’algoritmo di Douglas-Peuker

  • ST_SimplifyPreserveTopology(geometry, tolerance): come sopra, ma preserva la topologia

Funzioni varie


  • ST_npoints(geometry): restituisce il numero di punti della geometria

  • ST_isvalid(geometry): ritirna TRUE se la geometria è valida (topologicamente)

  • ST_box2d(geometry): restituisce un il rettangolo che circoscrive la geometria

  • ST_extent(geometry set): funzione di aggregazione, ritorna un box3d che circoscrive il set di geometrie in argomento

PostGIS e QuantumGIS


QuantumGIS offre una serie di utili tool, per una perfetta integrazione con dati geografici mantenuti sul DBMS relazionale geografico PostGIS


In particolare, vanno evidenziati:

  • utility di importazione SHP in PostGIS (plugin SPIT)
  • supporto nativo a layer PostGIS secondo le specifiche SFS
  • creazione al volo di layer vettoriali basati su query SQL (plugin SQL Editor)
  • gestione di DBMS PostGIS (plugin PostGIS manager)

Tutti questi tool permettono di definire connessioni personalizzate a una o più sorgenti PostGIS

QGIS SPIT Plugin


Gestione layer PostGIS



Plugin PostGIS SQL Editor

Plugin PostGIS Manager


Copyright 2010 - Alca Soc. Coop.


http://learn.alcacoop.it - learn@alcacoop.it



released under CreativeCommons 2.5 by-nc-sa